24小时热门版块排行榜    

CyRhmU.jpeg
查看: 1706  |  回复: 12

我无耻又无赖

木虫 (著名写手)

[求助] matlab全局优化参数已有2人参与

小弟在用matlab优化参数的时候遇到了一个问题,我用的是fmincon函数,但是因为选不到合适的初值所以得到的结果不是很满意,所以想着用全局优化的算法来试一下,奈何不太会,希望论坛里的大佬们看一下能不能解决这个问题。我直接把程序复制到下面了
clear all
clc
data=[288.05 0.000257 0.3003
293.05 0.000274 0.3003
298.2 0.000281 0.3003
303.25 0.000294 0.3003
308.15 0.000305 0.3003
313.25 0.000326 0.3003
318.2 0.000345 0.3003
323.15 0.00039 0.3003
288.05 0.000493 0.3995
293.05 0.00051 0.3995
298.2 0.000532 0.3995
303.25 0.000562 0.3995
308.15 0.00061 0.3995
313.25 0.000641 0.3995
318.2 0.000698 0.3995
323.15 0.000845 0.3995
288.05 0.000877 0.501
293.05 0.00092 0.501
298.2 0.00099 0.501
303.25 0.00115 0.501
308.15 0.00127 0.501
313.25 0.00139 0.501
318.2 0.00157 0.501
323.15 0.00189 0.501
288.05 0.0016 0.5998
293.05 0.00172 0.5998
298.2 0.00196 0.5998
303.25 0.00232 0.5998
308.15 0.00252 0.5998
313.25 0.00281 0.5998
318.2 0.0032 0.5998
323.15 0.00358 0.5998
288.05 0.00293 0.7009
293.05 0.00309 0.7009
298.2 0.00357 0.7009
303.25 0.00424 0.7009
308.15 0.00474 0.7009
313.25 0.00535 0.7009
318.2 0.00611 0.7009
323.15 0.00711 0.7009
288.05 0.0048 0.8003
293.05 0.00548 0.8003
298.2 0.00638 0.8003
303.25 0.0078 0.8003
308.15 0.00863 0.8003
313.25 0.00988 0.8003
318.2 0.0112 0.8003
323.15 0.0128 0.8003
288.05 0.0103 0.8999
293.05 0.0112 0.8999
298.2 0.0121 0.8999
303.25 0.014 0.8999
308.15 0.0152 0.8999
313.25 0.0173 0.8999
318.2 0.0193 0.8999
323.15 0.022 0.8999];

T=data(:,1);        
xexp=data(:,2);
w=data(:,3);

deltaH=46266;%熔融焓
R=8.314;
Tm=532.34;%熔点
yexp=exp((deltaH./(R.*T)).*(T./Tm-1)-log(xexp));

n=size(T,1);
k0=[-3125.70317518255,-2378.98766584565,5092.47952427953,-718.563001024490,-1495.43799248924,-1965.61341412590,0.899991420305235,0.100010845691102,0.219058309329965];
lb=[-inf -inf -inf -inf -inf -inf 0.1 0.1 0.1];
ub=[inf inf inf inf inf inf 0.9 0.9 0.9];
[k,fval,flag] = fmincon(@myfun,k0,[],[],[],[],lb,ub,[],[],xexp,yexp,T,w,n,R);
display(fval);
display(k);

function f = myfun(k,xexp,yexp,T,w,n,R)
%a12=k(1)
%a21=k(2)
%b12=k(3)
%b21=k(4)
%c12=k(5)
%c21=k(6)
%o=k(7)
%p=k(8)
%q=k(9)
tao12=k(1)./(R*T);
tao21=k(2)./(R*T);
tao13=k(3)./(R*T);
tao31=k(4)./(R*T);
tao23=k(5)./(R*T);
tao32=k(6)./(R*T);
G12=exp(-k(7).*tao12);
G21=exp(-k(7).*tao21);
G23=exp(-k(8).*tao23);
G32=exp(-k(8).*tao32);
G13=exp(-k(9).*tao13);
G31=exp(-k(9).*tao31);
x2=(1-xexp).*w;
x3=(1-xexp).*(1-w);
temp1=x2.*G21+x3.*G32;
temp2=tao21.*G21.*x2+tao31.*G31.*x3;
temp3=(xexp+x2.*G21+x3.*G31).^2;
temp4=tao12.*G12.*(x2.^2);
temp5=G12.*G32.*x2.*x3.*(tao12-tao32);
temp6=(x2+xexp.*G12+x3.*G32).^2;
temp7=tao13.*G13.*(x3.^2);
temp8=G13.*G23.*x2.*x3.*(tao13-tao23);
temp9=(x3+x2.*G23+xexp.*G13).^2;
lngamma1=((temp1.*temp2)./temp3)+((temp4+temp5)./temp6)+((temp7+temp8)./temp9);
ycal=exp(lngamma1);
f=100*sum(abs((yexp-ycal)./(yexp)))./n;
end
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

曾经落伍了

铁杆木虫 (职业作家)

★ ★
独孤神宇: 金币+2, 鼓励交流 2021-09-15 08:37:52
用遗传算法试试

发自小木虫Android客户端
2楼2021-09-15 00:45:41
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

hzlhm

至尊木虫 (著名写手)

【答案】应助回帖

★ ★
感谢参与,应助指数 +1
独孤神宇: 金币+2, 鼓励交流 2021-09-16 20:51:23
控制误差的表达式,
f=100*sum(abs((yexp-ycal)./(yexp)))./n;
可能有问题
因为控制误差的表达式不同,得到的结果也不同。

» 本帖已获得的红花(最新10朵)

QQ:2120156492
3楼2021-09-15 22:37:40
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

我无耻又无赖

木虫 (著名写手)

送红花一朵
引用回帖:
3楼: Originally posted by hzlhm at 2021-09-15 22:37:40
控制误差的表达式,
f=100*sum(abs((yexp-ycal)./(yexp)))./n;
可能有问题
因为控制误差的表达式不同,得到的结果也不同。

主要的目的是让yexp和ycal更接近,所以用了个相对误差的衡量方法,之前拟合过挺多数据,总的相对误差达到5以下差不多就能用了,现在的主要问题就是用fmincon函数,初值选取的不合适的话,相对误差10以下都很难达到。
4楼2021-09-15 23:19:45
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

我无耻又无赖

木虫 (著名写手)

引用回帖:
2楼: Originally posted by 曾经落伍了 at 2021-09-15 00:45:41
用遗传算法试试

谢谢,我试一试
5楼2021-09-15 23:26:36
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

hzlhm

至尊木虫 (著名写手)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ...
独孤神宇: 金币+2, 鼓励交流 2021-09-17 07:49:14
我无耻又无赖: 金币+100, ★★★很有帮助 2021-09-17 12:49:15

f=100*sum(abs((yexp-ycal)./(yexp)))./n
改为
f=100*sum(abs((yexp-ycal).^2./(yexp)))./n;
使用全局变量
global xexp yexp T w n R
增加一个约束条件函数 mycon(k)
matlab全局优化参数
123.jpg

» 本帖已获得的红花(最新10朵)

QQ:2120156492
6楼2021-09-16 21:07:22
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dingd

铁杆木虫 (职业作家)

【答案】应助回帖

★ ★
感谢参与,应助指数 +1
独孤神宇: 金币+2, 鼓励交流 2021-09-17 07:48:58
如果目标函数是:f=100*sum(abs((yexp-ycal)./(yexp)))./n
Objective Function (Min.): 1.69202022605523
k1: -3939.42871188215
k2: 10917.2246492583
k3: 25148.0927593124
k4: 70773.8809002039
k5: 128449.97394725
k6: 3.44491723177077E19
k7: 0.899999999164183
k8: 0.10000000000003
k9: 0.242672683467615

如果目标函数是:
f=100*sum(sqr((yexp-ycal)./(yexp)))./n;

Objective Function (Min.): 0.0437976590375771
k1: -3953.62624489904
k2: 10934.6496916492
k3: 23392.8184616025
k4: 69011.9494278635
k5: 132986.496346197
k6: 8.50638781047333E15
k7: 0.899999999999986
k8: 0.100000000001972
k9: 0.247180632282027

» 本帖已获得的红花(最新10朵)

7楼2021-09-16 22:13:07
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

我无耻又无赖

木虫 (著名写手)

送红花一朵
引用回帖:
6楼: Originally posted by hzlhm at 2021-09-16 21:07:22

f=100*sum(abs((yexp-ycal)./(yexp)))./n
改为
f=100*sum(abs((yexp-ycal).^2./(yexp)))./n;
使用全局变量
global xexp yexp T w n R
增加一个约束条件函数 mycon(k)

123.jpg
...

非常感谢,不过这个全局变量和约束函数怎么编写我不是很清楚,老师能否给出代码,我想学习学习
8楼2021-09-17 12:47:54
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

我无耻又无赖

木虫 (著名写手)

送红花一朵
引用回帖:
7楼: Originally posted by dingd at 2021-09-16 22:13:07
如果目标函数是:f=100*sum(abs((yexp-ycal)./(yexp)))./n
Objective Function (Min.): 1.69202022605523
k1: -3939.42871188215
k2: 10917.2246492583
k3: 25148.0927593124
k4: 70773.8809002039
k5: 12844 ...

老师好,您的结果也是通过设置全局变量得到的吗,我刚才又试了下,第一个目标函数的值到5点多就降不下来了
9楼2021-09-17 13:11:22
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

dingd

铁杆木虫 (职业作家)

引用回帖:
9楼: Originally posted by 我无耻又无赖 at 2021-09-17 13:11:22
老师好,您的结果也是通过设置全局变量得到的吗,我刚才又试了下,第一个目标函数的值到5点多就降不下来了...

用1stOpt计算试试,Matlab的全局优化工具箱优化效果不行。
10楼2021-09-17 17:37:45
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 我无耻又无赖 的主题更新
信息提示
请填处理意见