【问题标题】:MatLab: iterative method for finding rootsMatLab:寻找根的迭代方法
【发布时间】:2023-04-05 10:27:01
【问题描述】:

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

【问题讨论】:

  • 毫无意义是什么意思?
  • 由于条件错误,您的代码永远不会进入 while 循环。它认为它应该是这样的:while (abs(xn - prev) &gt; atol),当你不在任何地方使用这些值时,为什么要给出ab 的值?但是您的问题仍然不会收敛,我认为这是迭代方法的缺陷。
  • 好的,我尝试修改它,但我得到一个 NaN 作为 res

标签: matlab math


【解决方案1】:

由于您使用的算法,它不起作用,您正在编写: x_{n+1} = f(x_n)

这不是找到函数根的算法。

编辑: 如其所写,您的函数 iterative_method 查找函数 f 的不动点,而不是其根(即,它查找 x=f(x) 而不是 f(x)=0 的点 x)。所以如果你想要 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) 寻找负根。

因此,您可以将您的算法应用于函数 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...

【讨论】:

  • 亲爱的 Toghe,我想将迭代用于教学目的。
  • 亲爱的 Francesco,我不明白您的评论,您的初始算法 (x_{n+1}=f(x_n)) 不是求函数根的算法,它不会收敛到一个解决方案,这就是你有问题的原因。
  • 我编辑了我的答案,以防您所说的“迭代”是定点方法,希望这会有所帮助
猜你喜欢
  • 2017-10-02
  • 1970-01-01
  • 2021-10-24
  • 2018-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
相关资源
最近更新 更多