2013-12-17 34 views
-2
for X = 0: 0.00001 : 100; 
    M=(((sqrt(2*X)-(1/3))^2)*(2*X-1)); 
    N=((10.99743/sqrt(X)-(23/30))^2)*((53.75263/X)-1); 
    if M == N 
     Y=X; 
    end 
end 

此代碼是針對雙方的方程M & N ,,,必須使用嘗試和錯誤或Matlab解決數值 爲什麼這段代碼是錯誤的?爲什麼這段代碼是錯誤的?當它嘗試使用不同的M&N時,它是正確的!?

+0

這個問題並不需要* *重新打開,因爲它已經有一個被接受的答案,但是*,我不同意關閉它的原因。 OP不知道使用'=='不能比較浮點數值的事實並不是解決問題的理由,這是回答問題的理由。 OP已經包含他/她嘗試的解決方案,並想知道爲什麼它不起作用。 IMO:*在* - 專題! –

回答

2

你的問題是(正如nkjt指出的),將浮點值與==進行比較。

FYI:如果你的目標是要找到這XM == N,那麼你就可以做到這一點更簡單的使用例如fzero

f = @(X) (((sqrt(2.*X)-(1/3))^2)*(2.*X-1))- ... 
      ((10.99743./sqrt(X)-(23/30))^2)*((53.75263./X)-1); 
    y = fsolve(f,1) 
    y = 6.0304 

這給:

M - N = -1.3743e-05 

這是相當接近零(儘可能接近你)。

如果你絕對要嘗試和失敗,看看你能不能破解這個(基於nkjt的想法):

step = 1; 
X = 1:step:100 
M=(((sqrt(2*X)-(1/3)).^2).*(2*X-1)); 
N=((10.99743./sqrt(X)-(23/30)).^2).*((53.75263./X)-1); 
[Y, idx] = min(abs(N-M)) 

err = 1e-10; % Arbitrary tolerance > 1e-14 (typically) 
it = 0; 

while Y > err && it < 10 
    step = step/10; 
    it = it + 1; 
    X = X(idx) + (-step*10:step:step*10); 
    M=(((sqrt(2*X)-(1/3)).^2).*(2*X-1)); 
    N=((10.99743./sqrt(X)-(23/30)).^2).*((53.75263./X)-1); 
    [Y, idx] = min(abs(N-M)) 
end 
0

浮點比較的危險可能是一個因素。比較兩個浮點數時,不應使用==,而應檢查它們之間的差值是否小於某個公差(可根據您的要求使用eps或其他值)。

,而不是在整個可能值的整個範圍非常小的步驟循環,您可以vectorise,用較粗的範圍X值的開始,並獲得在您的解決方案可能在於一個更好的主意,例如:

X = 0:1:100 
M=(((sqrt(2*X)-(1/3)).^2).*(2*X-1)); 
N=((10.99743./sqrt(X)-(23/30)).^2).*((53.75263./X)-1); 
Y = abs(M-N); 
plot(X,Y); 

然後找到M和N之間的最小差值,減小步長和範圍,並繼續下去,直到獲得abs(MN)的值低於容差(請求解決方案的精度)的X值)。

相關問題