所以我一直在尝试开发一个可用于查找
根的割线方法程序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。由于某种原因,我得到一个负数。
答案 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就在你的代码中的错误就位了。)
割线方法可以说明如下(来自维基百科):
现在,如果我们将其转换为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
希望有所帮助!