本帖最后由 startrule 于 2016-7-18 13:40 编辑
我写了关于嵌套调用的函数,但是出现了很多错误:
优化函数:weixing.c
global a t
ff=optimset; ff.LargeScale='off';
ff.Display='iter'; ff.TolFun=1e-30;
ff.TolX=1e-15; ff.TolCon=1e-20;
a1=0.4; aa=2; a2=sqrt(aa^2-a1^2);
a0=[a1;a2];
am=[0;0];
aM=[]; A=[]; B=[];
Aeq=[]; Beq=[];
[a,f_opt,c,d]=fmincon('opt_fun1',a0,A,B,Aeq,Beq,am,aM,'opt_con1',ff)
非线性约束条件:opt_con1.m
function [c ceq]=opt_con1(a)
R=1737013;r0=15*1000+R;
tf=(2^(1/2)*(r0 - (3000+R))^(1/2))/a(2)^(1/2);
dx=v0 - a(1)*tf;
dy=-a(2)*tf;
ceq=[dx^2+dy^2-57^2];
c=[0 0];
目标函数:opt_fun1.m
function JF=opt_fun1(a)
R=1737013;r0=15*1000+R;
tf=(2^(1/2)*(r0 - (3000+R))^(1/2))/a(2)^(1/2);
global t
JF=quad(@myfun,0,tf);
end
被积函数:myfun.m
function rF=myfun(t)
global a
options=odeset('RelTol',1e-4,'AbsTol',[1e-4 1e-4]);
[T F]=ode45(@star,[0.001 t],[960 2400],options);
plot(T ,F(:,1),'-',T ,F(:,2),'-.');
hold on;xlabel('t/h');text(0.1,40,'F(t)');text(0.1,2401,'m(t)');box off;
annotation1=annotation('arrow',[0.131 0.131],[0.92 0.96]);
annotation2=annotation('arrow',[0.88 0.96],[0.108 0.108]);
rF=F(end,1);
end
求值函数:star.m
function dF=star(t,F)
global a
dF=zeros(2,1);
dF(1)=F(1)^2/(2940*F(2)) - ((2*F(1)^3)/(2940*F(2)) + (F(1)*F(2)*(2*a(1)^2 + 2*a(2)^2))/2940 - (2*F(1)*1.6333^2*F(2))/2940 - (2*F(1)*1.6333*F(2)*1700*(1700 - a(1)*t))/(a(2)^2*t^3*((1700 - a(1)*t)^2/(a(2)^2*t^2) + 1)^(3/2)))/(2*F(1) - (2*1.6333*F(2))/((1700 - a(1)*t)^2/(a(2)^2*t^2) + 1)^(1/2));
dF(2)=-1/2940*F(1);
end
但是出现了以下错误:
weixing
错误使用 odearguments (line 84)
tspan 中的元素必须严格递增或严格递减。
出错 ode45 (line 113)
[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...
出错 myfun (line 4)
[T F]=ode45(@star,[0.001 t],[960 2400],options);
出错 quad (line 67)
y = f(x, varargin{:});
出错 opt_fun1 (line 5)
JF=quad(@myfun,0,tf);
出错 fmincon (line 564)
initVals.f = feval(funfcn{3},X,varargin{:});
出错 weixing (line 10)
[a,f_opt,c,d]=fmincon('opt_fun1',a0,A,B,Aeq,Beq,am,aM,'opt_con1',ff)
原因:
Failure in initial user-supplied objective function evaluation. FMINCON cannot continue.
各位大神帮帮忙啊,拜谢!!