[討論] 最佳化toolbox的資料讀取問題
======主程式========
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://www.ptt.cc/bbs/MATLAB/M.1409736720.A.50C.html
MATLAB 近期熱門文章
PTT數位生活區 即時熱門文章