24小时热门版块排行榜    

CyRhmU.jpeg
查看: 1539  |  回复: 1
本帖产生 1 个 程序强帖 ,点击这里进行查看

li343

至尊木虫 (职业作家)

[求助] MATLAB fmincon函数求助已有1人参与

第一次用MATLAB做优化,请教个关于fmincon函数问题
clc;clear
xo=[30/1000 30/1000 3/1000 3/1000 2];
lower_bound=[20/1000 20/1000 2/1000 2/1000 1];
upper_bound=[40/1000 40/1000 4/1000 4/1000 3];
yy= fmincon(@mainprogram,xo,[],[],[],[],lower_bound,upper_bound)

上述程序段在计算收敛后停不下来,又再次进入迭代循环,最长试运行了24小时,尤其是当xo、lower_bound和upper_bound取为同一数组时,程序也同样停不下来。但如果直接对mainprogram进行赋值计算时,即mainprogram(xo),程序执行完毕则会自动停止。
mainprogram如下:

function optimiziation=mainprogram(x)
global media L_evap
D_coil_cond=x(1);
D_coil_evap=x(2);
di_cond=x(3);
di_evap=x(4);
Area_ratio=x(5);
design=[L_evap,D_coil_cond,D_coil_evap,di_cond,di_evap,Area_ratio]
Vs=2/1000/1000;
RPM=2000;      
superheat=10;
subcool=4;
mw_gc=5/1000;
mw_evap=3/1000;
tw_cond_in=15+273.15;
tw_evap_in=15+273.15;
di_annulus_cond=50/1000;
%D_coil_cond=20/1000
pitch_cond=7/1000;
%di_cond=3/1000
do_cond=di_cond+2/1000;
k_wall_cond=340;
di_annulus_evap=50/1000;
%D_coil_evap=20/1000
pitch_evap=7/1000;
%di_evap=3/1000
do_evap=di_evap+2/1000;
k_wall_evap=340;
A_evap=3.14*L_evap*di_evap;
A_cond=A_evap*Area_ratio;
L_cond=A_cond/(3.14*di_cond);
%xxo=[P_disP P_ref_evap_sup P_suc l_cond_sub l_cond_sup l_evap_sup quality_evap_in]
xxo= [5.95*100 2*100 1.78*100 0.1 0.1 0.1 0.3];%initial guess of refrigeration cycle variables
sol_vector=fsolve(@solver,xxo,[],media,Vs,RPM,superheat,subcool,mw_gc,mw_evap,tw_cond_in,tw_evap_in,di_annulus_cond,D_coil_cond,pitch_cond,do_cond,k_wall_cond,di_cond,L_cond,di_annulus_evap,D_coil_evap,pitch_evap,do_evap,k_wall_evap,di_evap,L_evap)
load Q_evap;
load Cop_c;
optimiziation=-1*Cop_c
return
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

杜子腾001

金虫 (初入文坛)

知识搬运工工长

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ...
li343: 金币+100, ★★★很有帮助, 写了这么多,难为你了!呵呵,欢迎交流。 2016-01-01 10:25:11
nono2009: 金币+5, 程序强帖+1, 鼓励应助 2016-01-02 08:24:39
fmincon 函数适用于求解非线性优化问题,根据matlab中的文档提示,其用法如下:
X = fmincon(FUN,X0,A,B,Aeq,Beq,LB,UB)
其中的FUN是一个函数的句柄。
但在你调用的函数fmincon中,FUN应该为mainprogram
但是从mainprogram的内容来看,你中间又调用了一个用于求解非线性方程的fsolve函数,求解的方程的函数名为slover,从你给的程序上看,并没有这个函数,所以我没法复现你说的现象。
接下来说一下问题。
你到底想要求解哪些变量?这个东西其实单纯读程序,会比较耗时间,何况你的程序并不完整。
我根据自己理解,大概说一下你想要用这个程序干什么,然后回答你上面提到的问题,最后说一下我的建议。
如果没猜错的话,你的问题属于一个制冷循环问题。
明面上(或者从函数使用的功能上看),你想优化这些参数:D_coil_cond,D_coil_evap,di_cond,di_evap,Area_ratio
根据制冷循环原理啥的,你把包含这些参数的方程组写在了一个名叫solver的函数里面。
但是solve里面还有一些参数,它们是常量或者其它变量或者初始条件,你希望能够随时改变它,所以你把这些参数赋值并保存在一个名叫mainprogram函数里面,并希望通过使用fsolve函数来求解slover中的方程组。
这里面有一些很矛盾的地方。
fmincon 是一个求解优化问题的函数。正常使用的话,FUN应该是一个含参数的函数。
但显然mainprogram函数做不到,至于原因,简单除暴地讲,fsolve是用来求数值解的,不能得到符号解,因此mainprogram不可能成为一个含参数的函数传递给fmincon;另外,求符号解是另一个函数solve. 但即使你用了符号求解函数,也没必要,并且大错特错。
mainprogram最后给optimization赋值我也是没看懂啥意思。
我不太清楚你的想法,感觉其中有很多矛盾的地方,如果你能清楚地说一下你的求解意图应该会很好。
然后分析一下为什么你直接代入x0到mainprogram能得到解。
当你把具体的x0值代入mainprogram后,你所要求解的是一个包含了其它参数的方程solver,这个时候fsolve是能够求解的,但fsolve求解的是数值解,不能求出符号解。
至于为啥你的程序会死循环,抱歉,真不知道,我没有完整的程序,没法复现相关过程。
最后,我说一下求解建议。
a)如果你想求解优化问题,优化这些参数:D_coil_cond,D_coil_evap,di_cond,di_evap,Area_ratio,你可尝试着把fsolve去掉,使mainprogram成为一个含上面五个参数的函数。当然后面一些赋值什么的我没看懂,应该可以去掉。
b)如果你想求解方程组,直接使用fsolve就行,别用啥fmincon。
c)若果你想求解优化问题,优化这些参数:D_coil_cond,D_coil_evap,di_cond,di_evap,Area_ratio,在使mainprogram成为一个含上面五个参数的函数之后,你发现还有一些参数也是变量,但是你可以赋予这些参数给定值,那么建议你使用外部循环、内部使用a的优化编程过程。

差不多就这么些了。希望能帮到你。
对了,如果有用,别忘了把金币给我
还有,我也是学的东西和制冷循环有关系,本科学的就是空调、供暖专业,想要交流也可以。
听风听雨听心声
2楼2015-12-22 20:51:41
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 li343 的主题更新
信息提示
请填处理意见