为根发现开发一个正确的方法程序

时间:2015-03-05 17:39:27

标签: matlab root numerical scientific-computing

所以我一直在尝试开发一个可用于查找

根的割线方法程序
  

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。由于某种原因,我得到一个负数。

2 个答案:

答案 0 :(得分:3)

您可以添加条款,因此请在此行中替换minus:

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。

答案 1 :(得分:3)

这是另一种方法(@madbitloman就在你的代码中的错误就位了。)

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

enter image description here

现在,如果我们将其转换为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

希望有所帮助!