我正在尝试实现一个迭代方法,以便在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)
由于您使用的算法,它无法正常工作,您正在编写: 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 = sqrt((x ^ 3 + 2552)/ 30)如果你找到函数f的正根,或者x = -sqrt((x ^ 3 + 2552)/ 30)为负数。< / p>
因此,您可以在函数g上应用算法:@(x)sqrt((x ^ 3 + 2552)/ 30)(通过修改@Sardar_Usama建议的停止标准),您将捕获正根F。但是请注意,定点方法通常效率不高,因为它需要选择函数g的条件以确保收敛。你会在互联网上找到关于这个主题的文章。
你在文学中有很多不同的算法(最简单的链接:wiki 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 ......