matlab求解一个非线性方程问题.....
tan(theta)=(D+A)*((1-D^2)*(1-A^2))^(-1/2);
D=sqrt((2*z-1)/z^2);
A=1/(2*z-1)^(1/2*k);
其中,theta=46.5*pi/180; k=0.21
最终求出z的值。(z应该是大于1的值)
思路:我用solve求解了半天没有算出结果,可能是没有解析解;用fsolve求解初值不知道如何选取;请大神帮助啊.... 展开
由D,A可知z>1/2
将原非线性方程转化为tan²θ*(1-D²)*(1-A²)=(D+A)²
其中,D=√[(2*z-1)/z²]=√(2*z-1)/z,A=1/(2*z-1)^(1/2*k)
令f(z)=tan²θ*(1-D²)*(1-A²)-(D+A)²,z>1/2
找z的初值可先绘制函数f(z)的图像
%f(z)在[0.505,1.5]上的图像
clear
z=0.505:0.001:1.5;
k=0.21;
theta=46.5*pi/180;
D=sqrt(2*z-1)./z;
A=1./(2*z-1).^(k/2);
f=tan(theta)^2*(1-D.^2).*(1-A.^2)-(D+A).^2;
plot(z,f)
grid on
明显函数在该区间无零点.注意到函数有一极大值和一极小值
用fminbnd命令可求出极值点与极值:
当z=0.559071364951272时,极大值f(z)=-3.873681569517792
当z=0.797989261049623时,极小值f(z)=-4.101806518882230
可以看到当z>0.797989261049623时,曲线上升,将作图区间改为[0.505,60],得到下图
容易看出方程的根在z=50附近.下面用fzero命令求解(相对fsolve效果较好)
function f=nl(z,k,theta)
D=sqrt(2*z-1)./z;
A=1./(2*z-1).^(k/2);
f=tan(theta)^2*(1-D.^2).*(1-A.^2)-(D+A).^2;
clear
k=0.21;
theta=46.5*pi/180;
z0=fzero(@(z)nl(z,k,theta),50)
z0 =50.809922902973383,即为原方程的根.
z0是否为方程的唯一实根?
考察当z>0.797989261049623时,函数f(z)的单调性
直接对f(z)求导比较麻烦,容易判断的是:当z充分大时,D与A均单调递减
故f(z)=tan²θ*(1-D²)*(1-A²)-(D+A)²,z>1/2单调递增.当z→+∞时,f(z)→tan²θ≈1.1105
z= tan²θ为该曲线的水平渐近线