matlab中两条曲线的求交

matlab中两条曲线的求交,matlab,Matlab,我必须找到正态分布函数的两个交点 我通过iy=pdf('normal',ix,mu,sd)计算了曲线的所有点(x,y),并将它们绘制在有两个交点的屏幕上。 我尝试过fzero函数,但它不起作用。两条曲线的平均值和标准偏差不同,因此数组的长度不同。 我尝试了两个循环的最简单逻辑,但也不起作用 < >强>蛮力方法对我来说是不适用的,因为Matlab中的精度不考虑24和24.001,并且高斯函数的结果在小数点之后有15个整数,这使得MATLAB不可能检查相等性。p> 尝试改进答案,因为这是一个公认的答

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

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


< >强>蛮力方法对我来说是不适用的,因为Matlab中的精度不考虑24和24.001,并且高斯函数的结果在小数点之后有15个整数,这使得MATLAB不可能检查相等性。p> 尝试改进答案,因为这是一个公认的答案(完全归功于Eitan T,他在中对曲线交点进行了漂亮的解释)

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

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

通过这种方式,圆的尺寸不受坐标轴和绘图的纵横比的影响。

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

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

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

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

只有在分析失败时才跳到数值方法。寻找两个正态分布的交点是一个相当简单的代数问题,我现在懒得去做,但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
分别是第一个和第二个平均值。

只有在分析失败时才跳到数值方法。寻找两个正态分布的交点是一个相当简单的代数问题,我现在懒得去做,但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
分别是第一个和第二个平均值。

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


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


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

如果您喜欢数值方法而不是解析方法,则可以使用
fzero
normpdf
函数


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


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

完全正确!最简单的方法通常不是暴力:-)谢谢你的回答,我面临的问题是,x有不同的碎片,所以内部元素的数量不同,这导致矩阵的维数不同,所以求解方法会给出一个错误。由于ı已经计算了两条曲线的所有x点和y点,ı为循环写了2,并且看到实际上matlab精度失败,例如24.0000和24.0001被认为是不一样的,所以我输入了一个公差值并解决了我的问题。谢谢你的回复。@BurakUzun:你不明白我在解释什么。您应该解析地解决这个问题,这样您就不必为两个pdf计算x和y的“所有”点。它是这样的:如何计算线
y=x
y=2x
相交的位置?我说:这很简单:在
x==y==0
。你说:我将为每条线生成几十个点,然后循环遍历它们,看看哪些点的差异最小。对于交叉点,您可以找到
x=0.01
y=-0.04
。这很愚蠢,而且最重要的是,这是不正确的。但是,好吧,随你的便。+1显示了暴力的替代方案,并显示了一般的操作方法。@RodyOldenhuis是的,你是对的,谢谢你的关注,但当我绘制分布图时,我需要计算这些点,但你的答案比这更一般。没错!最简单的方法通常不是暴力:-)谢谢你的回答,我面临的问题是,x有不同的碎片,所以内部元素的数量不同,这导致矩阵的维数不同,所以求解方法会给出一个错误。由于ı已经计算了两条曲线的所有x点和y点,ı为循环写了2,并且看到实际上matlab精度失败,例如24.0000和24.0001被认为是不一样的,所以我输入了一个公差值并解决了我的问题。谢谢你的回复。@BurakUzun:你不明白我在解释什么。您应该解析地解决这个问题,这样您就不必为两个pdf计算x和y的“所有”点。它是这样的:如何计算线
y=x
y=2x
相交的位置?我说:这很简单:在
x==y==0
。你说:我将为每条线生成几十个点,然后循环遍历它们,看看哪些点的差异最小。对于交叉点,您可以找到
x=0.01
y=-0.04
。这很愚蠢,而且最重要的是,这是不正确的。但是,好吧,随你的便。+1展示了暴力的替代方案,并展示了一般的操作方法。@RodyOldenhuis是的,你是对的,谢谢你的关注,但当我绘制分布图时,我需要计算这些点,但你的答案比这更一般。