matlab 用fmincon求含9个未知变量的非线性函数极值同时含3个非线性约束条件,急!

我把函数和约束条件写了两个m文件如下:
function y=ning(x)
y=-[((x(1)+x(2)+x(3)+x(4))*x(1)/(x(1)+x(2))+(x(5)+x(6)+x(7)+x(8))*x(5)/(x(5)+x(6)))*x(9)
+((x(1)+x(2)+x(3)+x(4))*x(3)/(x(3)+x(4))+(x(5)+x(6)+x(7)+x(8))*x(7)/(x(7)+x(8)))*(1-x(9))]*log2([((x(1)+x(2)+x(3)+x(4))*x(1)/[x(1)+x(2)]
+(x(5)+x(6)+x(7)+x(8))*x(5)/(x(5)+x(6)))*x(9)+((x(1)+x(2)+x(3)+x(4))*x(3)/(x(3)+x(4))
+(x(5)+x(6)+x(7)+x(8))*x(7)/(x(7)+x(8)))*(1-x(9))])-[((x(1)+x(2)+x(3)+x(4))*x(2)/(x(1)+x(2))+(x(5)+x(6)+x(7)+x(8))*x(6)/(x(5)+x(6)))*x(9)+(x(5)+x(6)+x(7)+x(8))*x(5)/(x(5)+x(6))));
y=-y;

function [ce,ceq]=myfunc(x)
ce=[];
ceq(1)=x(1)+x(2)+x(3)+x(4)+x(5)+x(6)+x(7)+x(8)-1;
ceq(2)=x(1)+x(5)-x(1)^2-x(5)^2-2*x(1)*x(5)-x(1)*x(2)-x(2)*x(5)-x(1)*x(6)-x(5)*x(6)-x(1)*x(3)-x(1)*x(7)-x(5)*x(3)-x(5)*x(7)
-x(2)*x(3)-x(2)*x(7)-x(6)*x(3)-x(6)*x(7);
ceq(3)=x(2)+x(6)-x(2)^2-x(6)^2-2*x(2)*x(6)-x(1)*x(2)-x(1)*x(6)-x(2)*x(5)-x(5)*x(6)-x(1)*x(4)-x(1)*x(8)-x(5)*x(4)-x(5)*x(8)
-x(2)*x(4)-x(2)*x(8)-x(6)*x(4)-x(6)*x(8);
return
在命令窗口调用:
clear all;
>> xmin=zeros(9,1);
>> xmax=ones(9,1);
>> [x,fopt,flag,c]=fmincon('ning',zeros(9,1),[],[],[],[],xmin,xmax,'myfunc')
一直报错,一个是说函数里括号不对称,还有一个是说 error using fval,fmincon不能contiue。因为篇幅问题其实函数没有打全,但是括号肯定是成对正确的,又因为里面含log函数,我以为是初始值取0的问题,所以也改过从非0值开始,但是还是同样报错,不知道究竟哪里不对,新手,求大家帮忙!

1、【括号肯定是成对正确的】,你太自信了,括号确实不匹配,还需要仔细检查。

 

2、需要注意两点:

(1)方括号([ ])是不能当成圆括号使用的,它只能用于拼接数组,不能用于改变表达式的匹配优先级。

(2)如果表达式太长,需要换行,最好在行尾加上续行符(三个小数点,即...),例如在函数ning里面。有些情况下不加好像也可以,例如在函数myfunc里,但需要注意,此时表达式的含义是错的(会把c(2)、c(3)的表达式看成只有一行,而后续的半行会被认为是另外一个没有左值的表达式),这点尤其可怕,因为语法上是正确的,但逻辑上是错误的,往往不容易检查到。

 

3、改正上述问题后,程序可以运行,但无法求得最优解。我注意看了一下迭代过程,约束条件始终未能满足。请认真检查目标函数和约束条件是否正确,如果模型是错的,我再怎么尝试,也不可能得到正确的结果。

 

附:我修改后的程序:

function zd1924425009365762747
xmin=zeros(9,1);
xmax=ones(9,1);
[x,fopt,flag,c]=fmincon(@ning,ones(9,1),[],[],[],[],xmin,xmax,@myfunc)

 

function y=ning(x)
y=-(((x(1)+x(2)+x(3)+x(4))*x(1)/(x(1)+x(2))+(x(5)+x(6)+x(7)+x(8))*x(5)/(x(5)+x(6)))*x(9) ...
    +((x(1)+x(2)+x(3)+x(4))*x(3)/(x(3)+x(4))+(x(5)+x(6)+x(7)+x(8))*x(7)/(x(7)+x(8)))*(1-x(9)))*log2((((x(1)+x(2)+x(3)+x(4))*x(1)/(x(1)+x(2)) ...
    +(x(5)+x(6)+x(7)+x(8))*x(5)/(x(5)+x(6)))*x(9)+((x(1)+x(2)+x(3)+x(4))*x(3)/(x(3)+x(4)) ...
    +(x(5)+x(6)+x(7)+x(8))*x(7)/(x(7)+x(8)))*(1-x(9))))-(((x(1)+x(2)+x(3)+x(4))*x(2)/(x(1)+x(2))+(x(5)+x(6)+x(7)+x(8))*x(6)/(x(5)+x(6)))*x(9)+(x(5)+x(6)+x(7)+x(8))*x(5)/(x(5)+x(6)));
y=-y;

 

function [ce,ceq]=myfunc(x)
ce=[];
ceq(1)=x(1)+x(2)+x(3)+x(4)+x(5)+x(6)+x(7)+x(8)-1;
ceq(2)=x(1)+x(5)-x(1)^2-x(5)^2-2*x(1)*x(5)-x(1)*x(2)-x(2)*x(5)-x(1)*x(6)-x(5)*x(6)-x(1)*x(3)-x(1)*x(7)-x(5)*x(3)-x(5)*x(7) ...
-x(2)*x(3)-x(2)*x(7)-x(6)*x(3)-x(6)*x(7);
ceq(3)=x(2)+x(6)-x(2)^2-x(6)^2-2*x(2)*x(6)-x(1)*x(2)-x(1)*x(6)-x(2)*x(5)-x(5)*x(6)-x(1)*x(4)-x(1)*x(8)-x(5)*x(4)-x(5)*x(8) ...
-x(2)*x(4)-x(2)*x(8)-x(6)*x(4)-x(6)*x(8);

追问

十分感谢!因篇幅问题目标函数没输入完,x都在[0,1]之间,初始值设为1不满足约束条件。这个问题基本解决了,只是初值不同最后的极值略有差别,这个我在另外的问题里问过了,你也给了解答。我想在约束条件里加一条,象x(1)+x(2)log2(x(2)+x(3))=data 之类,然后画上面函数极值关于data在0到1间的图象,直接在主函数窗口设定data范围,然后画图(data,fopt)?

追答

基本思路:

使用嵌套函数的方式,在主函数中用循环对data赋值,然后调用fmincon求解,循环结束后画图。大致的程序框架如下(一定要注意那几个end):

 

function main

D = 0:0.1:1;

F = zeros(size(D));

for i=1:length(D)

    data=D(i);
    [x,fval,flag,c]=fmincon(@ning,ones(9,1),[],[],[],[],xmin,xmax,@myfunc);

    F(i)=fval;

end

plot(D,F)

 

function y=ning(x)
.......

end

 

function [ce,ceq]=myfunc(x)
...........

% 此处增加新的约束条件,可以直接使用变量data

end

 

end

度娘又犯病了,回答必见了。。。。。

追问

非常感谢!冒昧的问下 可以加你qq么,因为我现在在做的东西要用matlab而且比较赶,小女子又是地地道道的新手来着⋯⋯不加也没关系,还是很感谢。我的qq (815323159)

追答

抱歉,我平常不挂Q,加了意义不大。
有什么问题还是在百度知道或论坛提问吧,那样可能有更多的人帮你。

温馨提示:答案为网友推荐,仅供参考
相似回答