如何用Matlab找到正态分布与柯西分布的3个交点(而非2个)?
找到正态分布与柯西分布的第三个交点的Matlab实现
要找到两个分布的所有交点,核心是联立它们的概率密度函数(pdf),求解方程 f(x) = g(x)(其中f(x)为正态pdf,g(x)为柯西pdf)的根。以下分两种常见场景给出实现方法:
场景1:对称分布的三个交点(原点+一对对称点)
当正态分布(均值为0)与柯西分布(位置参数为0)在原点处的pdf相等时,会出现三个交点:原点,以及一对关于原点对称的点。
Matlab代码实现
% 设置参数:使正态与柯西在原点处pdf相等 sigma = sqrt(pi/2); % 正态分布N(0, sigma)的标准差 gamma = 1; % 柯西分布C(0, gamma)的尺度参数 % 定义差值函数:h(x) = 正态pdf - 柯西pdf,找h(x)=0的根 h = @(x) normpdf(x, 0, sigma) - (1/(pi*gamma*(1 + (x/gamma).^2))); % 求解三个交点 root_neg = fzero(h, [-2, -1]); % 负半轴交点,指定区间[-2,-1] root_origin = 0; % 原点处直接满足h(0)=0 root_pos = fzero(h, [1, 2]); % 正半轴交点,指定区间[1,2] % 输出结果 fprintf('三个交点的x坐标:\n'); fprintf('负半轴:%.6f\n', root_neg); fprintf('原点:%.6f\n', root_origin); fprintf('正半轴:%.6f\n', root_pos); % 可视化验证 x = linspace(-5, 5, 1000); plot(x, normpdf(x, 0, sigma), 'r-', ... x, 1/(pi*gamma*(1 + (x/gamma).^2)), 'b--', ... [root_neg, root_origin, root_pos], ... [normpdf(root_neg,0,sigma), normpdf(root_origin,0,sigma), normpdf(root_pos,0,sigma)], ... 'ko', 'MarkerFaceColor', 'k'); legend('正态分布pdf', '柯西分布pdf', '交点'); xlabel('x'); ylabel('概率密度'); grid on;
场景2:非对称分布的三个交点(无对称性)
如果正态分布的均值不为0,或柯西分布的位置参数不为0,交点可能无对称性,需要先通过图像确定根的大致区间,再逐个求解。
Matlab代码实现
% 设置参数:正态N(1,1),柯西C(0,1) mu = 1; sigma = 1; % 正态分布参数 x0 = 0; gamma = 1; % 柯西分布参数 % 定义差值函数 h = @(x) normpdf(x, mu, sigma) - (1/(pi*gamma*(1 + ((x - x0)/gamma).^2))); % 先绘制差值函数图像,确定零点区间 figure; x = linspace(-3, 3, 1000); plot(x, h(x), 'b-', x, 0, 'k--'); xlabel('x'); ylabel('h(x) = 正态pdf - 柯西pdf'); title('差值函数图像(用于确定根的区间)'); grid on; % 根据图像确定区间,求解三个根 root1 = fzero(h, [-2, 0]); % 负半轴交点 root2 = fzero(h, [0, 1]); % 中间交点 root3 = fzero(h, [1, 3]); % 正半轴交点 % 输出结果 fprintf('三个交点的x坐标:\n'); fprintf('%.6f\n%.6f\n%.6f\n', root1, root2, root3); % 可视化验证 figure; plot(x, normpdf(x, mu, sigma), 'r-', ... x, 1/(pi*gamma*(1 + ((x - x0)/gamma).^2)), 'b--', ... [root1, root2, root3], ... [normpdf(root1,mu,sigma), normpdf(root2,mu,sigma), normpdf(root3,mu,sigma)], ... 'ko', 'MarkerFaceColor', 'k'); legend('正态分布pdf', '柯西分布pdf', '交点'); xlabel('x'); ylabel('概率密度'); grid on;
关键说明
fzero函数需要指定根所在的区间(或初始点),因此必须先通过绘图确定零点的大致位置,避免求解到错误的根。- 若你的分布参数不同,只需修改代码中的
sigma、mu、x0、gamma等值即可。
内容的提问来源于stack exchange,提问作者lydiahe
相关产品推荐
相关产品推荐

