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²Î¸ä¸ºè¯¥æ›²çº¿çš„水平渐近线

温馨提示:答案为网友推荐,仅供参考
相似回答