2016-09-20 46 views
1

我目前正在做一個家庭作業任務,要求我使用false-position方法來估計一個值。我覺得我幾乎所有的東西都存在,但是如果我的陳述中出現了問題,我會掛斷電話。所以我必須確定函數的位姿實根:ln(x^2)= 0.7使用3次迭代的假位置方法,xl = 0.5和xu = 2。我在底部附上了正確答案,以幫助我更好地解釋我的問題。我有三個需要幫助的具體問題。Matlab False-Position方法

1)。首先,在X1的值的第三次迭代中,我的代碼仍然將其視爲1.625而不是正確的1.25。我不明白爲什麼這樣做,因爲我的if語句應該阻止這一點。它在第二次迭代中正確地改變了這個值,而不是第三次。 2)。我也需要幫助來查找錯誤。這部分我很堅持。我知道找到錯誤的方程,但我的問題是如何跟蹤xr_new和xr_old。林不知道,如果我想添加一些比較,以查看它是否改變之前計算或什麼。 3)。我也想輸出我的價值,並像提供的解決方案一樣構建一個表。我之前使用過的表的經驗是直接對它進行硬編碼,並且在找到值時我很難建立表格。我知道我需要for循環中的表格,並且一次構建一個單元格,但是在這個領域沒有經驗可以開始。

我希望這不是太多的幫助,要求我有intermatiate matlab技能​​,這是我不得不做的一個更難的問題。任何幫助都非常感謝。

clc; clear; 
f= @(x) log(x.^2) - 0.7; 
x = -3: .005 : 3; 
figure(1) 
grid on 
hold on 
plot (x,f(x)) 

% bisection method with 3 iterations 
xl = 0.5 
xu = 2 

%Table = table(iteration, xl , f(xl), xu, f(xu), xr, f(xr), Ea) 

for i = 1:1:3 

    F_xl = f(xl) 
    F_xu = f(xu) 
    xr = .5*(xl+xu) 
    F_xr = f(xr) 

    if ((F_xu*F_xl) < 0) 
     xl = xr 

    else 
     xu = xr 
    end 


    %Error = abs(xr_new-xr_old)/xr_new 
end 

The correct soluton displayed in a table below:

回答

0

下面的代碼提供所需的輸出,並通過您的代碼之前,直到plot()

  1. 你使用F_xl代替F_xrif條件失敗。 if ((F_xu*F_xr) < 0)給出了預期的結果。
  2. 我們可以使用向量xr在每次迭代中存儲xr的值,並使用表達式abs(xr_new-xr_old)/xr_new)來查找錯誤。我只是將第一個錯誤值留爲零。
  3. 既然我們已經載體,table()可以在循環外使用以獲得所需的輸出

代碼:

iterations = (1:3)'; 
xl = zeros(3,1); 
xu = zeros(3,1); 
xr = zeros(3,1); 
F_xl = zeros(3,1); 
F_xu = zeros(3,1); 
F_xr = zeros(3,1); 
Error = zeros(3,1); 
% bisection method with 3 iterations 
xl(1) = 0.5; 
xu(1) = 2; 
for i = 1:3 
    F_xl(i) = f(xl(i)); 
    F_xu(i) = f(xu(i)); 
    xr(i) = .5*(xl(i)+xu(i)); 
    F_xr(i) = f(xr(i)); 
    if(i<3) 
     if ((F_xu(i)*F_xr(i)) < 0) 
      xl(i+1) = xr(i); 
      xu(i+1) = xu(i); 
     else 
      xu(i+1) = xr(i); 
      xl(i+1) = xl(i); 
     end 
    end 
    if(i>1) 
     Error(i) = abs(xr(i)-xr(i-1))*100/xr(i); 
    end 
end 
T = table(iterations,xl,F_xl,xu,F_xu,xr,F_xr,Error); 
+0

我不知道爲什麼行迭代=(1:3)';不在代碼內。當您嘗試此代碼時添加該行。 – nahomyaja

+0

非常感謝!我應該想到將xl,xu和xr作爲3個空格開始。 – jake

+0

不客氣。希望你明白代碼中正在做什麼。我沒有解釋太多,因爲你說你是一位經驗豐富的MATLAB程序員。 – nahomyaja