MatLab:寻找根的迭代方法

时间:2016-06-22 09:43:50

标签: matlab math

我正在尝试实现一个迭代方法,以便在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

1 个答案:

答案 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 ......