matlab中两条曲线的交集

时间:2012-10-21 19:08:47

标签: matlab

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

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

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

3 个答案:

答案 0 :(得分: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分别是第一和第二平均值。

答案 1 :(得分:2)

如果您更喜欢分析数字方法,可以使用fzeronormpdf函数。

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

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

答案 2 :(得分:-3)

尝试改进答案,因为这是一个公认的答案(完全归功于 Eitan T ,他已在此 related answer here 中详细解释了曲线的交叉点)

您必须手动找到交叉点(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)

这样,圆的尺寸不受曲线的轴和纵横比的影响。