我正在尝试解决关于割线数值方法应用的问题。
我的MATLAB代码如下
function [f]= fsecante(t)
R=24.7;
L=2.74;
C=0.000251;
P1=-0.5*(R/L)*t;
P2=t*sqrt(1/(L*C)-(R^2)/(4*L^2));
f=2*exp(P1).*cos(P2)-1;
end
%iteradas iniciais%
x0=0;
x1=10^-4;
wanted=10^-8;
f0=fsecante(x0);
f1=fsecante(x1);
iter=0;
error=wanted;
while(erro>=wanted)
F=(x1-x0)/(f1-f0);
xn=x1-F*f1
error=abs(F*f1);
iter=iter+1;
x0=x1;
x1=xn;
f0=fsecante(x0);
f1=fsecante(x1);
end
我使用计算器来了解应该获取的值(约0.152652376) 但是使用MATLAB中的方法,它收敛到1.4204,这超出了我们应该得到的值。 我究竟做错了什么? 我的猜测是我的错误变量在周期中出错了吗?我也感到奇怪的是,我的解决方案是解决方案应位于的[0,1]集。有人可以给我一些有关我缺少的东西的说明吗?
答案 0 :(得分:0)
如果这只是要求解方程式,请使用
fsolve(@fsecante, 0)
查找最接近0
的函数的根。
ans = 0.0257389353753764
您没做错什么,割线方法不能对所有初始点都收敛。只有完全发生收敛,才能保证快速收敛。
对于使用割线根且保证收敛的方法,请使用regula falsi方法。在其伊利诺伊州的变体中,它可以实现为
x0=0
f0=fsecante(x0)
x1=1
f1=fsecante(x1)
wanted=10^-8;
iter=1;
while( abs(x1-x0) >= wanted)
iter=iter+1
F=(x1-x0)/(f1-f0);
xn=x1-F*f1
fn = fsecante(xn)
if fn*f0 < 0
x1=x0; f1=f0;
else
f1 = f1*0.5;
end
x0=xn; f0=fn;
end
并给出x0=0; x1=1;
init: x0= 0 , f(x0)= 1
init: x1= 1 , f(x1)= -0.97824464599
n= 2: xn= 0.5054986510525 , f(xn)= -0.803719660003
n= 3: xn= 0.28025344639849 , f(xn)= -1.21180917676
n= 4: xn= 0.081858845659703, f(xn)= -2.38168069197
n= 5: xn= 0.007776289683393, f(xn)= 0.848005195428
n= 6: xn= 0.027227838393959, f(xn)= -0.090747663322
n= 7: xn= 0.025347489826149, f(xn)= 0.0235362327768
n= 8: xn= 0.025734738800888, f(xn)= 0.000253074462073
n= 9: xn= 0.025743020435749, f(xn)= -0.000246366400381
n=10: xn= 0.02573893523423 , f(xn)= 7.80359576957e-09
n=11: xn= 0.025738935363624, f(xn)= 2.40252262529e-13
n=12: xn= 0.025738935363632, f(xn)= -2.39919195621e-13