2016-06-22 314 views
0

我想實現一個迭代方法,以便在matlab中查找根。這是我的代碼,preatty簡單MatLab:尋找根的迭代方法

function [ res ] = iterative_method(f, a, b, x0, atol) 

    prev = f(x0); 
    xn = f(prev) 
    while (abs(xn - prev) < atol) 
     prev = xn 
     xn = f(prev) 

    end 
    res = xn 
end 

然後,我想找到一個根在功能

f(x) = x^3 - 30*x^2 + 2552 

所以我打電話給我的功能

iterative_method(@(x) x^3 -30*x^2 + 2552,0,10,1,10^-4); 

但產量沒有意義:

res = 

    1.5869e+10 
+0

你是什麼意思的沒有任何意義做? –

+1

由於條件錯誤,您的代碼永遠不會進入** while循環。它認爲它應該是這樣的:'while(abs(xn - prev)> atol)',以及爲什麼當你不在任何地方使用這些值時,你給出了'a'和'b'的值?但你的問題仍然不會收斂,我認爲這是迭代方法中的一個缺陷。 –

+0

好吧,我試圖修改它,但我得到了NaN作爲res –

回答

1

它不起作用您正在使用的算法的原因:您正在寫入: x_ {n + 1} = f(x_n)

這不是查找函數根的算法。如你所寫,你的函數iterative_method尋找函數f的固定點而不是它的根(即它尋找點x使得x = f(x)而不是這樣f(x) = 0)。所以如果你想讓x使得f(x)= 0,那麼你需要找到一個函數g,使得f(x)= 0寫成g(x)= x,並且對這個函數g應用你的定點研究而不是F。在比如你的具體情況,

X^3-30x^2 + 2552 = 0

可以寫成

X =開方((X^3 + 2552)/ 30)如果你看看對於函數f的正根,或對於負值的x = -sqrt((x^3 + 2552)/ 30)。因此,您可以在函數g上應用您的算法:@(x)sqrt((x^3 + 2552)/ 30)(修改@Sardar_Usama建議的停止標準),您將捕獲一個正根f。但請注意,定點方法通常效率不高,因爲它需要選定函數g的條件才能確保收斂。你會在網上找到關於這個題目的文獻。

你有很多的在litterature可用不同的算法(最簡單的鏈接:維基https://en.wikipedia.org/wiki/Root-finding_algorithm

爲了您的功能,我建議牛頓的方法是非常有效的(二次收斂),如果你開始一個現有的根部附近。爲此,您需要的函數的導數和稍微修改您的iterative_method功能(同時也考慮到@Sardar_Usama評論,擺脫A和B是無用的在你的函數):

function [ res ] = iterative_method(f,df, x0, atol) 

prev = f(x0); 
xn = f(prev) 
while (abs(xn - prev) > atol) 
    prev = xn 
    xn = prev-f(prev)/df(prev) 

end 
res = xn 
end 

然後只需調用

iterative_method(@(x) x^3 -30*x^2 + 2552,@(x) 3*x^2-60*x,-10,10^-4); 

這將找到最近的根-10,即-8.1761 ...

+0

親愛的Toghe,我想使用迭代的教學目的。 –

+0

親愛的弗朗切斯科,我不明白你的評論,你的初始算法(x_ {n + 1} = f(x_n))不是一個尋找函數根的算法,它不會收斂到一個解,這就是爲什麼你有一個問題。 – Toghe

+1

我編輯了我的答案,以防你的意思是'迭代'是一個固定點的方法,希望這將有助於 – Toghe