0

pdf我必须找到正态分布函数的两个交点。

我已经计算了曲线的所有点 (x,y),iy = pdf('normal', ix, mu, sd)并将它们绘制在具有两个交点的屏幕上。
我已经尝试过fzero函数,但它不起作用,两条曲线的均值和标准偏差不同,因此数组的长度不同。
我尝试了最简单的逻辑二 for 循环,但它也不起作用。

蛮力方法对我不起作用,因为matlab 中的精度它不考虑例如 24.000 和 24.001,并且高斯的结果值在小数点后有 15 个整数,这使得 matlab 无法检查是否相等。

4

3 回答 3

6

如果分析失败,仅跳转到数值方法。找到两个正态分布的交点是一个相当简单的代数问题,我现在懒得做,但是 Matlab 可以为我做:

>> syms x sig1 sig2 mu1 mu2;
>> solve(1/sig1/sqrt(2*pi) * exp(-1/2*((x-mu1)/sig1)^2) == ...
         1/sig2/sqrt(2*pi) * exp(-1/2*((x-mu2)/sig2)^2), x)

ans =

 +(mu2*sig1^2 - mu1*sig2^2 + sig1*sig2*(2*sig2^2*log(sig2/sig1) - 2*sig1^2*log(sig2/sig1) - 2*mu1*mu2 + mu1^2 + mu2^2)^(1/2))/(sig1^2 - sig2^2)
 -(mu1*sig2^2 - mu2*sig1^2 + sig1*sig2*(2*sig2^2*log(sig2/sig1) - 2*sig1^2*log(sig2/sig1) - 2*mu1*mu2 + mu1^2 + mu2^2)^(1/2))/(sig1^2 - sig2^2)

其中sig1, sig2是第一和第二标准差,mu1, mu2分别是第一和第二均值。

于 2012-10-21T20:40:36.183 回答
2

如果您更喜欢数值方法而不是分析方法,您可以使用fzeronormpdf函数。

x_intersect = fzero(@(x) normpdf(x, mu1, std1) - normpdf(x, mu2, std2), x0);

由于正态分布表现良好,并且任何两个分布都必须相交,因此任何初始猜测x0都应该有效。

于 2012-10-24T01:38:10.577 回答
-3

试图改进答案,因为这是一个公认的答案(完全归功于Eitan T,他在此相关答案中完美地解释了曲线的交点)

您必须手动找到交点 (px, py):

idx = find(y1 - y2 < eps, 1); %// Index of coordinate in array
px = x(idx);
py = y1(idx);

请记住,我们正在比较浮点表示中的两个数字,因此y1 == y2我们必须设置一个容差来代替。我选择了它作为 eps,但由你决定。

要围绕这个点画一个圆,你可以计算它的点然后绘制它们,但更好的方法是用一个放大的圆形标记绘制一个点(这个建议归功于 Jonas):

plot(px, py, 'ro', 'MarkerSize', 18)

这样,圆的尺寸不受坐标轴和绘图纵横比的影响。

于 2012-10-21T19:12:08.357 回答