我编写了这个脚本来测试MATLAB中的割线方法
%Test of the Secant Method
function secantm1(x0,x1)
tol=10^-6; % tolerance
itmax=1000; % max number of iterations
itnum=0; % iterations counter
disp([itnum,x0,x1])
x2=x1-f1(x1)*((x1-x0)/f1(x1)-f1(x0));
itnum=itnum+1;
disp([itnum,x1,abs((x0-x1)/x0)])
while abs((x1-x2)/x1)>tol && itnum<itmax
x0=x1; % I think here is mistake
x1=x2;
x2=x1-f1(x1)*((x1-x0)/f1(x1)-f1(x0));
itnum=itnum+1;
disp([itnum,x1,abs((x1-x2)/x1),x2])
end
end
function y=f1(x)
y=x^3+x-3;
end
function y=f2(x)
y=x-tan(x);
end
但问题是它没有运行,我已经指出了我认为是错误的地方,但我不确定我是否正确,我该如何解决它。
有人可以帮我解决这个错误吗?
问题是,当我输入f1时,我希望得到1.23 ......但是方法并没有收敛,而另一个函数我希望不会收敛
当我运行它时,它给了我以下内容:
secantm1(1,2)
0 1 2
1 2 1
1.0e + 03 *
0.0020 -0.0060 0.2612 -1.5730
1.0e + 11 *
0.0000 -0.0000 0.0056 8.7573
1.0e + 45 *
0.0000 0.0000 0.0000 -2.6139
1.0e + 172 *
0.0000 -0.0000 0.0000 -1.1995
1.0e + 172 *
0.0000 -1.1995 Inf Inf
7 Inf NaN NaN
提前致谢。
答案 0 :(得分:1)
问题是你在迭代更新的分母中缺少一组括号。
即
x2=x1-f1(x1)*((x1-x0)/f1(x1)-f1(x0));
应该是
x2=x1-f1(x1)*((x1-x0)/( f1(x1)-f1(x0) ));
更正后的割线代码应为:
function secantm1(x0,x1)
tol=10^-6; % tolerance
itmax=1000; % max number of iterations
itnum=0; % iterations counter
disp([itnum,x0,x1])
x2=x1-f1(x1)*((x1-x0)/ ( f1(x1)-f1(x0) ));
itnum=itnum+1;
disp([itnum,x1,abs((x0-x1)/x0)])
while abs((x1-x2)/x1)>tol && itnum<itmax
x0=x1; % This was OK
x1=x2;
x2=x1-f1(x1)*((x1-x0)/( f1(x1)-f1(x0) ));
itnum=itnum+1;
disp([itnum,x1,abs((x1-x2)/x1),x2])
end
end
这将收敛到现在的结果:
secantm1(1,2)
0 1 2
1 2 1
2.0000 1.1250 0.0471 1.1780
3.0000 1.1780 0.0320 1.2156
4.0000 1.2156 0.0019 1.2134
5.0000 1.2134 0.0000 1.2134
6.0000 1.2134 0.0000 1.2134