clear
clc
%求解优化函数
f=@(x) x(1).*x(1)+x(2).*x(2)+2.*x(3).*x(3)+x(4).*x(4)-5.*x(1)-5.*x(2)-21.*x(3)+7.*x(4)+1;
x0=[1,1,1,1]; %初始解向量
options=optimset('maxfunevals',10000,'algorithm','active-set');
m=fmincon(f,[1,2,2,2],[],[],[],[],[],[],@mycon1,options) %最优解的位置
f(m) %最优解
mycon1(m) %约束
function [c,ceq]=mycon1(x)
%本函数用来保存非线性约束条件
ceq=[];
c(1)=-(-x(1).* x(1)-x(2).* x(2)- x(3).* x(3)- x(4).* x(4)- x(1)+ x(2)- x(3)+x(4)+9);
c(2)=-(-x(1).*x(1)-2.*x(2).*x(2)-x(3).*x(3)-2*x(4).*x(4)+x(1)+x(4)+8);
c(3)=-(-2.*x(1).*x(1)-x(2).*x(2)-x(3).*x(3)-2.*x(1)+x(2)+x(4)+5);
end
我是调用matlab的内部函数求解的。这样很简单很方便。matlab里有很多自带的求解优化的函数,还有优化工具箱,可以自动生成你需要的优化代码。很方便,功能也很强大。希望能 解决你的问题呦~~O(∩_∩)O~
你没有说用什么优化算法,我用的模拟退火,而且x1,x2,x3,x4都没有交代多大范围,所以我随便取值在n以内;(这个n你可以随便调节)程序如下:
%% 模拟退火算法进行优化 (起始温度:100; 终止温度:1;退火速率0.9)
clear all;clc;
double startT;
double endT;
double rate;
double bestx1;
double bestx2;
double bestx3;
double bestx4;
double f;
f=0;
startT=100;
endT=1;
rate=0.9;
double n;
n=2.3;
while startT>=endT%开始模拟退火
x1=rand(1,1)*n;%产生n以内随机数
x2=rand(1,1)*n;
x3=rand(1,1)*n;
x4=rand(1,1)*n;
g1=-x1^2-x2^2-x3^2-x4^2-x1+x2-x3+x4+9;%三个约束条件
g2=-x1^2-2*x2^2-x3^2-2*x4^2+x1+x4+8;
g3=-2*x1^2-x2^2-x3^2-2*x1+x2+x4+5;
if g1>=0 & g2>=0 & g3>=0%满足三个约束条件,降温
startT=rate*startT;
tempf=x1^2+x2^2+2*x3^2+x4^2-5*x1-21*x3+7*x4+1;
if tempf
bestx1=x1;
bestx2=x2;
bestx3=x3;
bwstx4=x4;
end
end
end
怎么这么专业的问题啊,这个能有专业人士来回答吗