zqllc 发表于 2007-7-2 09:55

fsolve初始值的问题

解非线性方程的问题
代码如下:
clear;
clc;
m=3;               
ha=1;               
q2s=1/6;         
Ns=25;            
as=20*pi/180;         
r=Ns*m;            
rbs=r*cos(as);   
ra=(Ns+ha*m);      
rsm=r-m;
N2=Ns/q2s;         
os0=pi/(2*Ns)-inv(as);
opt=optimset;
opt.LargeScale='off';
opt.Tolfun=1e-100;
opt.Display='off';
rotate=fopen('rotateangle.dat','wt');
fprintf(rotate,'%s\n','ansNs,    N2,    r,    wo,    w2,    ws');
j=1;
for y=-330:15:-210;
    fprintf(rotate,'%s %6.4f\n','when y =',y);
    for i=0:1:7
      os=0+5*i*pi/180;
      f=@(ws)(subs(rbs*(sin(q2s*ws)*(sin(ws+os0+os)-os*cos(ws+os0+os))+cos(q2s*ws)/(q2s*cos(ws+os0+os)))+y));
      ws=fsolve(f,0,opt);                     
      %ws=ws(imag(ws)==0&real(ws)>0);      %只要大于零的实根
      wo=subs(ws+os0+os);
      w2=subs(q2s*ws);
      equal=subs(rbs*(sin(q2s*ws)*(sin(ws+os0+os)-os*cos(ws+os0+os))+cos(q2s*ws)/(q2s*cos(ws+os0+os)))+y);
      fprintf(rotate,'   %6.4f %6.4f %6.4f %12.8f %12.8f %12.8f %12.8f\n',equal,Ns,N2,r,wo,w2,ws);
    end   
end
fclose(rotate);
%result = textread('rotateangle.dat','%s','delimiter','\n','whitespace','');
其中,equal等于才能代表方程解正确,试过好多个初值,结果都不对,按实际情况来分析,ws应该为大于零,且小于2*pi,不过得不到正确解,帮忙指点一下如何做,谢谢

[ 本帖最后由 zqllc 于 2007-7-2 10:00 编辑 ]

dingd 发表于 2007-7-2 13:40

推荐试一下1stOpt,不需初值,解方程能力及易用性都比Matlab等强。

zqllc 发表于 2007-7-3 17:11

回复 #2 dingd 的帖子

呵呵,不过还要再重新学,然后又没有什么可用的版本,

zqllc 发表于 2007-7-3 22:37

基本方程可以解了,虽然不是很符合实际情况,估计方程的问题吧。
具体方法是:
输入各个初始值
f=subs(rbs*(sin(q2s*ws)*(sin(ws+os0+os)-os*cos(ws+os0+os))+cos(q2s*ws)/(q2s*cos(ws+os0+os)))+y)
f=vpa(f,6)
ezplot(f,)
可以看到函数的趋势,以及大概的零点,然后选用接近实际的零点附近的初始值,可以得到有效结果。
页: [1]
查看完整版本: fsolve初始值的问题