开发用于求根的正割法程序

Developing a Secant Method Program for root finding

所以我一直在尝试开发一个割线法程序,可以用来求根

f(x) = tanh(x) - (x / 3)

然而,答案输出还差得很远。我找到的每一个解决方案似乎都是一种更复杂的解决方法。

    x = 2;
prevx = x;

for i = 1:20

    x = x - (tanh(x)-(x/3))*((x-(prevx))/((tanh(x)-(x/3))-(tanh(prevx))-((prevx/3))));
    prevx = prevx + x;
    x
end

答案应该是2.987。尽管出于某种原因,我得到了一个负数。

你想把项加起来,所以把这一行的减号换掉:

x = x - (tanh(x)-(x/3))*((x-(prevx))/((tanh(x)-(x/3))-(tanh(prevx))-((prevx/3))));

加分:

x = x + (tanh(x)-(x/3))*((x-(prevx))/((tanh(x)-(x/3))-(tanh(prevx))-((prevx/3))));

x 获得想要的结果 2.987。还要在循环结束前删除 x。

这是另一种方法(@madbitloman 就您的代码中的错误而言是正确的)。

割线法可以说明如下(来自维基百科):

现在,如果我们将其转换为 MATLAB 代码,将如下所示:

x(k) = x(k-1) - (f(x(k-1)))*((x(k-1) - x(k-2))/(f(x(k-1)) - f(x(k-2))));

剩下要做的是为算法提供 2 个初始估计和一些容差值,告诉它何时停止搜索根,即当 x 中的 2 个连续条目非常接近每个条目时其他.

我们选择2和4,估计越接近实根,收敛越快。

为了避免在 for 循环中使用 tanh(x)-(x/3),这可能会变得混乱,让我们定义一个以 x 作为参数的匿名函数:

f = @(x) tanh(x)-(x/3);

所以这就是上面代码行中的 f

因此,整个代码如下所示,公差为 0.001:

clear
clc

%// Initial values and tolerance
x(1) = 2;
x(2) = 4;
f = @(x) tanh(x)-(x/3);

tolerance = 0.001;

%// Let's try from 3 to 15. 
for k=3:15

    x(k) = x(k-1) - (f(x(k-1)))*((x(k-1) - x(k-2))/(f(x(k-1)) - f(x(k-2))));

    if abs(x(k)-x(k-1)) < tolerance
        break
    end
end

在 运行 代码之后,x 看起来像这样:

x =

    2.0000    4.0000    2.9420    2.9839    2.9847

因此需要 5 次迭代才能达到所需的公差。请注意,由于浮动算法,您可能希望使用较小的公差,因为 Matlab 存储的数字比 4 多得多。

最后,您还可以使用适当的初始估计值(例如 -2 和 -4)获得负根:

x =

   -2.0000   -4.0000   -2.9420   -2.9839   -2.9847

希望有所帮助!