作者johnny21205 (流星)
看板MATLAB
标题[讨论] 最佳化toolbox的资料读取问题
时间Wed Sep 3 17:31:58 2014
======主程式========
clc
clear all
format long g
%------------------------- toolbox所需要的参数
-----------------------------
%最佳化toolbox所需的参数
options=optimset('LargeScale','off','display','iter','MaxFunEvals',10000,'MaxIter',8000,'TolFun',1e-18,'TolX',1e-18,'TolCOn',1e-18);
A=[];%线性不等式左边向量
b=[];%线性不等式右边向量
beq=[1;1];%线性等式右边向量
Aeq=[1 1 1 1 0 0 0 0 0 0;
0 0 0 0 1 1 1 1 0 0];
lb=[0.0001;0.0001;0.0001;0.0001;0.0001;0.0001;0.0001;0.0001;0.0001;0.0001];
ub=[1;1;1;1;1;1;1;1;1;1];
%黏弹函数所需参数
n=3+1; %可动参数,Prony级数项数
G =[1;2;3;4]; %实验得到的剪力模数
E =[2;3;4;5]; %实验得到的杨式模数
W =[3;4;5;6];%实验的角频率
tuo=[1.00E-16;1.00E-14;1.00E-11];
syms v1 v2 v3 x(i) s a
v=[v1 v2 v3];
%------------------------- 目标函数回圈 -----------------------------
e=0;
Et=0;
Gt=0;
vs=0;
Es=0;
Gs=0;
ff=0;
ee=0;
f=0;
g=0;
for t =1:4
for i =2:n
e=e+x(i)*x(2*n+1)/(W(t)+1/tuo(i-1));
ee=ee+x(n+i)*x(2*n+2)/(W(t)+1/tuo(i-1));
end
Et=Et+(E(t)-x(n+1)*x(2*n+2)-W(t)*(ee))^2;
Gt=Gt+(G(t)-x(1)*x(2*n+1)-W(t)*(e))^2;
end
for ii =2:n
f=f+x(ii)*x(2*n+1)/(s+1/tuo(ii-1));
ff=ff+x(n+ii)*x(2*n+2)/(s+1/tuo(ii-1));
g=g+v(ii-1)/(s+1/tuo(ii-1));
end
vs=vs+(x(2*n+2)*x(n+1)-2*x(2*n+1)*x(1))/(2*x(2*n+1)*x(1)*s)-g;
Es=Es+x(n+1)*x(2*n+2)/s+(ff);
Gs=Gs+x(1)*x(2*n+1)/s+(f);
%------------------------- %限制式联立 -----------------------------
D=vs-Es/(2*Gs*s)+1/s; %解联立
for j=1:(n-1)
a(j)=subs(D,s,1/tuo(j));
end
[B]=solve(a,'v1','v2','v3')
v1=B.v1
v2=B.v2
v3=B.v3
vv=v1+v2+v3;
Et= char (Et)
Gt= char (Gt)
v= char (v)
vv= char (vv)
% % %------------------------- 最佳化toolbox -----------------------------
x0=[0.0505
0.038791097 0.044723697 0.038929943 0.045008951 0.057520206 0.020785573 0.056774519 0.060615807 0.13425864];
[x,fval,exitflag,output,lambda]=fminimax(@(x)mfun(x,Et,Gt),x0,A,b,Aeq,beq,lb,ub,@(x)n17(x,n,v,vv),options)
--------------------------------------------------------------------------------
====目标函数.m=======
function [f1 f2]=mfun(x,Et,Gt)
f1=Et;
f2=Gt;
end
====限制式.m==========
function [c,ceq]=n17(x,n,v,vv)
c=[-v;((x(2*n+2)*x(n+1)-2*x(2*n+1)*x(1))/(2*x(2*n+1)*x(1)))-0.5;((x(2*n+2)-2*x(2*n+1))/(2*x(2*n+1)))-0.369533107;0.334339478-((x(2*n+2)-2*x(2*n+1))/(2*x(2*n+1)))];
ceq=[vv+((x(2*n+2)-2*x(2*n+1))/(2*x(2*n+1)))-((x(2*n+2)*x(n+1)-2*x(2*n+1)*x(1))/(2*x(2*n+1)*x(1)))];
end
想请问大家,我的目标函数跟现制式都无法在主程式中读取。
该如何修改才能完成??
目前发现好像是syms的问题!但如果不使用char 最佳化无法运算。
该如何修改比较好?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.116.155.116
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/MATLAB/M.1409736720.A.50C.html