开发用于求根的正割法程序
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
希望有所帮助!
所以我一直在尝试开发一个割线法程序,可以用来求根
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
希望有所帮助!