wenzicao 发表于 2008-1-23 16:12

用fsolve 解非线性方程组出现问题

代码为:
format long
Ul11=9.92;
Ul21=8.72;
Ul12=13.2;
Ul22=12.6;
Ul13=19.2;
Ul23=20.0;
options=optimset('LargeScale','off','NonlEqnAlgorithm','gn','MaxIter',100000,'MaxFunEvals',10000000);
x0=;
x=fsolve(@myfun2,x0,options);
alpha1=x(1)
beta1=x(2)
Zc1=x(3)
Ul11=9.92;
Ul21=8.48;
Ul12=12.4;
Ul22=12.2;
Ul13=17.6;
Ul23=19.6;
x0=;
x=fsolve(@myfun2,x0,options);
alpha2=x(1)
beta2=x(2)
Zc2=x(3)

w1=2*pi*100*10^3;
w2=2*pi*200*10^3;
galpha1=alpha1;
gbeta1=beta1;
galpha2=alpha2;
gbeta2=beta2;
x0=;
= fsolve(@mymean,x0,options);
C0=x(1);
G0=x(2);
L0=x(3);
R0=x(4);
C0
G0
L0
R0
omga1=w2;
=trans_line(R0,G0,C0,L0,omga1)
V=omga1/beta   
函数为:
function F=myfun2(x)
%Ul11,Ul21分别是终端接阻抗Z1的条件下中点和终端处的电压;
%Ul12,Ul22分别是终端接阻抗Z2的条件下中点和终端处的电压;
%Ul13,Ul23分别是终端开路的条件下中点和终端处的电压;
%x(1)、x(2)分别频率为衰减常数和相移常数,x(3)为特性阻抗
global Ul11 Ul21 Ul12 Ul22 Ul13 Ul23
l=44.84;
Z1=50;
Z2=100;
F=[Ul11-Ul21*abs(cosh(l*(x(1)+j*x(2)))+x(3)/Z1*sinh(x(1)+j*x(2)));
    Ul12-Ul22*abs(cosh(l*(x(1)+j*x(2)))+x(3)/Z2*sinh(x(1)+j*x(2)));
    Ul13-Ul23*abs(cosh(l*(x(1)+j*x(2))))];


function =trans_line(R0,G0,C0,L0,omga)
%R0:两根导线每单位长度具有的电阻;
%L0:两根导线每单位长度具有的电感;C0: 每单位长度导线之间具有的电容;
%G0:每单位长度导线之间具有的电导;
Z0=R0+j*omga*L0 ;             %单位长度的阻抗
Y0=G0+j*omga*C0;            %单位长度的导纳
gama=sqrt(Z0*Y0);            %gama为传播常数
alpha=real(gama);             %aerf为衰减常数   
beta=imag(gama);             %beta 为相移常数
Zc=sqrt(Z0/Y0);            % Zc为特性阻抗

function CGRL=mymean(x)
global w1 w2 gbeta1 galpha1 gbeta2 galpha2
    CGRL=[(x(4)/2*sqrt(x(1)/x(3))+x(2)/2*sqrt(x(3)/x(1)))*(1-(x(4)/x(3)-x(2)/x(1))^2/(8*w1^2))-galpha1;
      w1*sqrt(x(3)*x(1))*(1+(x(4)/x(3)-x(2)/x(1))^2/(8*w1^2))-gbeta1;
      (x(4)/2*sqrt(x(1)/x(3))+x(2)/2*sqrt(x(3)/x(1)))*(1-(x(4)/x(3)-x(2)/x(1))^2/(8*w2^2))-galpha2;
   w2*sqrt(x(3)*x(1))*(1+(x(4)/x(3)-x(2)/x(1))^2/(8*w2^2))-gbeta2];


代码为上面所示,运行时 前两个fsolve函数,初值给什么值结果就是什么值,而且提示Optimization terminated: directional derivative along search direction less than TolFun and infinity-norm of gradient less than 10*(TolFun+TolX).
第三个fsolve出现提示Optimization terminated: search direction less than TolX.


哪位高手告诉我程序错在哪?另外怎么确定初值?

[ 本帖最后由 eight 于 2008-1-23 18:40 编辑 ]

eight 发表于 2008-1-23 18:40

这个只是 warning,不是 error。请 help fsolve 一下,或在 matlab 中根据提示的某些关键词搜索一下。还可以搜索版面

[ 本帖最后由 eight 于 2008-1-23 18:41 编辑 ]

dingd 发表于 2008-1-24 08:55

试一下1stOpt,不需要猜初值。

wenzicao 发表于 2008-1-24 10:09

但是结果很显然不对    Zc的大小应该在45-----100之间,
1stopt 我装了一个但不会用   相关的教程没找到

wenzicao 发表于 2008-1-25 09:59

请问用1stopt解方程组的时候,结果中目标函数值不为0,得到的结果可信可靠吗?

dingd 发表于 2008-1-25 13:49

不为0或不接近于0,表明结果有差异。多算两次。还有2.0以前的版本,对非线性方程组,求解能力要弱不少。

xjzuo 发表于 2008-1-25 15:15

这个问题用matlab可以解决,但用1stopt 可能更合适一些。后者的语法可以参考论坛的相关帖子,以及1stopt 自带的例子。其语法基本上是傻瓜型地套用,自己稍微看看就会明白,不过有时候自己先(化简)处理一下问题,可能会解决得更快。

另:问问题时,将公式贴出,并描述一下问题,是一个好习惯,也是一个可以更快得到解答的方法。

[ 本帖最后由 xjzuo 于 2008-1-25 15:18 编辑 ]

wenzicao 发表于 2008-1-25 17:00

谢谢大家!
页: [1]
查看完整版本: 用fsolve 解非线性方程组出现问题