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 编辑 ] 推荐试一下1stOpt,不需初值,解方程能力及易用性都比Matlab等强。
回复 #2 dingd 的帖子
呵呵,不过还要再重新学,然后又没有什么可用的版本, 基本方程可以解了,虽然不是很符合实际情况,估计方程的问题吧。具体方法是:
输入各个初始值
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]