回 帖 发 新 帖 刷新版面

主题:请大家帮我看看这个非线性方程组该怎么来解

[size=3]本人现在做课题要解一个复杂的非线性方程组,对于matlab本人是个初学者,自己也编写了个matlab程序,可是不收敛,初值很不好给。我把自己编写的程序放在下面了,请大家不吝赐教!!谢谢了!!! 

m文件内容:
function F=myfun(x)
global  fr im k k1 m mu n r ri
for i=1:8
t0=1+6.28*(i-1)/(8*40)
a=(im/(mu*t0*r)-k1*r/mu)/k
F(i)=2*(a*x(i))^(9/10)+(9*k1/(10*k*mu))*(a*x(i))^(-1/10)*(2*r*x(9)+n*ri)...
    -x(10)*cos(x(9)+0.785*(i-1));
end
sum=0.0;
sum1=0.0;
for i=1 : 8
    nij=-m*(ri+r)*x(9)^2/2+k1*r*x(9)/mu+(im/(mu*r)-k1*r/mu)*x(i)+k1*n*ri...
        /(2*mu);
    noj=m*(ri+r)*x(9)^2/2+k1*r*x(9)/mu+(im/(mu*r)-k1*r/mu)*x(i)+k1*n*ri...
        /(2*mu);
    sum=sum+nij*sin(x(9)+(i-1)*0.785)+mu*nij*cos(x(9)+(i-1)*0.785)...
        -k1*(ri*(n-x(9))-r*x(i))*cos(x(9)+(i-1)*0.785);
    sum1=sum1+nij*cos(x(9)+(i-1)*0.785)-mu*nij*sin(x(9)+(i-1)*0.785)...
        +k1*(ri*(n-x(9))-r*x(i))*sin(x(9)+(i-1)*0.785);
end
F(9)=sum;
F(10)=sum1-fr;
以下是我在命令窗口的内容:
k1=0.001
r=0.0065;
mu=0.15;
k=729455627;
m= 3.14 * r ^ 2 * 0.013 * 7.87 * 10 ^ 3;
im=m*r^2;
fr=1000;
ri=0.04225;
n=1000*6.28/60;
x0=[200;200;200;200;200;200;200;200;45;0.00001];
global  fr im k k1 m mu n r ri;
options=optimset('display','iter','largescale','on');
[x,fval,exitflag,output]=fsolve(@myfun,x0,options)
下面是我的不收敛的结果:
Optimizer appears to be converging to a minimum that is not a root:
Sum of squares of the function values is > sqrt(options.TolFun).
Try again with a new starting point.
x =
  201.8292
  200.3597
  198.6797
  197.7723
  198.1687
  199.6367
  201.3174
  202.2272
   44.5322
   -0.0000

fval =
  Columns 1 through 6 
    0.0000    0.0000   -0.0000   -0.0000   -0.0000   -0.0000
  Columns 7 through 10 
    0.0000    0.0000    0.0011 -999.9929

exitflag =
    -2

output = 
    firstorderopt: 0.9769
       iterations: 13
        funcCount: 154
     cgiterations: 13
        algorithm: 'large-scale: trust-region reflective Newton'
          message: [1x169 char[/size]

回复列表 (共2个回复)

沙发

请大家帮帮忙吧,本人是个初学者,其实方程倒不是很长,就是参数多看起来很乱,谢谢了!

板凳

在网上找了个牛顿法解非线性方程组的程序,我又重新编了段程序,可还是出错。程序我贴在下面了,还请大家多帮帮忙吧,都有点心灰意冷了。
建了个same.m文件,里面放了两个function
function [r,n]=mulNewton(F,x0,eps)
global x0 x
F=@myfun
 if nargin==2
    eps=1.0e-4;
end
x0 = transpose(x0);
Fx = subs(F,findsym(F),x0);
%var = findsym(F);
dF = jacobian(F);
dFx = subs(dF,findsym(dF),x0);
r=x0-inv(dFx)*Fx;
n=1;
tol=1;
while tol>eps
    x0=r;
    Fx = subs(F,findsym(F),x0);
    dFx = subs(dF,findsym(dF),x0);
    r=x0-inv(dFx)*Fx;                                 %核心迭代公式
    tol=norm(r-x0);
    n=n+1;
    if(n>100000)                                              %迭代步数控制
        disp('迭代步数太多,可能不收敛!');
        return;
    end
end

function F=myfun(x)
global  fr im k k1 m mu n r ri
global x
%global F
for i=1:8
t0=1+6.28*(i-1)/(8*40)
a=(im/(mu*t0*r)-k1*r/mu)/k
F(i)=2*(a*x(i))^(9/10)+(9*k1/(10*k*mu))*(a*x(i))^(-1/10)*(2*r*x(9)+n*ri)...
    -x(10)*cos(x(9)+0.785*(i-1));
end
sum=0.0;
sum1=0.0;
for i=1 : 8
    nij=-m*(ri+r)*x(9)^2/2+k1*r*x(9)/mu+(im/(mu*r)-k1*r/mu)*x(i)+k1*n*ri...
        /(2*mu);
    noj=m*(ri+r)*x(9)^2/2+k1*r*x(9)/mu+(im/(mu*r)-k1*r/mu)*x(i)+k1*n*ri...
        /(2*mu);
    sum=sum+nij*sin(x(9)+(i-1)*0.785)+mu*nij*cos(x(9)+(i-1)*0.785)...
        -k1*(ri*(n-x(9))-r*x(i))*cos(x(9)+(i-1)*0.785);
    sum1=sum1+nij*cos(x(9)+(i-1)*0.785)-mu*nij*sin(x(9)+(i-1)*0.785)...
        +k1*(ri*(n-x(9))-r*x(i))*sin(x(9)+(i-1)*0.785);
end
 F(9)=sum;
 F(10)=sum1-fr;

在命令窗口中运行same
提示错误:
??? Error using ==> char
Conversion to char from function_handle is not possible.

Error in ==> findsym at 29
   sc = char(S);

Error in ==> same at 8
Fx = subs(F,findsym(F),x0);什么意思呀?难道说matlab自带的函数findsym会出错么

我来回复

您尚未登录,请登录后再回复。点此登录或注册