我正试图解决一个关于割线数值方法应用的问题。
我的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]的解应该在的地方。有人能澄清一下我遗漏了什么吗?
如果这只是为了求解方程,请使用
fsolve(@fsecante, 0)
以找到最接近CCD_ 1的函数的根。
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
并给出了CCD_ 2 的结果
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