2012-10-21 602 views
0

我必須找到pdf函數正態分佈的兩個交點。matlab中兩條曲線的交點

我已經計算了曲線的所有點(x,y)iy = pdf('normal', ix, mu, sd),並將它們繪製在具有兩個交點的屏幕上。
我試過fzero函數,但它不起作用,兩個曲線的平均值和標準偏差是不同的,所以數組的長度是不同的。
我試過最簡單的邏輯兩個循環,但它也沒有工作。

暴力方法不適合我的,因爲在MATLAB中精度不考慮例如24.000和24.001,並從高斯所產生的值工作有這使得它不可能MATLAB到小數點後15個整數檢查平等。

回答

-3

試圖改善的答案,因爲這是一個公認的答案(完整信貸埃坦牛逼誰擁有約曲線的交點在這個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) 

這樣,圓的尺寸不受軸和圖的高寬比的影響。

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

正是!最簡單的方法通常不是蠻力:-) –

+0

謝謝你的回答我面對這個問題的是,x的不同的憤怒,因此不同的數量的元素內部導致矩陣不同的尺寸,所以解決方法給出了一個錯誤。由於我計算了兩個曲線的所有x和y點,我寫了2個循環,並且看到實際上matlab精度失敗,例如24.0000和24.0001不被視爲相同,因此我提出了容差值並解決了我的問題。感謝您的回覆。 – Eneramo

+0

@BurakUzun:你不明白我在解釋什麼。您應該通過分析*來解決問題,所以您不必爲兩個pdf都計算* x *和* y *的「全部」點。它是這樣的:你將如何計算'y = x'和'y = 2x'這條線相交?我說:很簡單:在'x == y == 0'處。你說:我會爲每一行生成幾十個點,然後循環查看哪些具有最小差異。並且您發現交叉口的「x = 0.01」和「y = -0.04」。這只是愚蠢的,最重要的是,*不正確*。但是,好,適合你自己。 –

2

如果您更喜歡數值方法分析,可以使用fzeronormpdf函數。

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

由於正態分佈表現良好,並且任何兩個分佈必須相交,任何初始猜測x0應該工作。