1、在电脑中启动matlab,新建一个函数文件,用来写目标函数。
2、在编辑器窗口中写入要求的目标函数,并保存,注意使函数名与文件名相同。
3、再新建一个函数文件,用来编写非线性约束条件,将两个函数文件放在同一个文件夹中。
4、在命令行窗口处写入fmincon命令,对于没有的线性约束条件的位置药用空矩阵代替,并且初始条件需要满足非线性约束条件。
5、敲下键盘上的enter建,结果得出,exitflag=1是大于0的,结果正确。MATLAB是美国MathWorks公司出品的商业数学软件,用于数据分析,无线通信,深度学习,图像处理与计算机视觉,信号处理,量化金融与风险管理,机器人,控制系统等领域。
1、是不是局部最优可以通过退出代码exitflag辅助判断。至于说全局最优,没有哪种优化方法能够保证,即使用全局优化工具箱中的遗传算法之类的,也只是增加得到全局最优解的机会。
2、那个警告没影响,可以忽略,不想看到的话,也可以关闭或通过指定算法来避免。
3、受字数限制,代码只能贴,但这样我没法测试,只能给你提这些建议。必要时,可以考虑通过网盘或博客上传代码。或者私信也可以。
程序还是不给你,自己学会了,要写很简单的。按照步骤,照猫画虎就可以了。由于我不能贴图,例子中的数学模型没有写,供你参考。
优化工具箱提供fmincon函数用于对有约束优化问题进行求解,其语法格式如下:
x = fmincon(fun,x0,A,b)
x = fmincon(fun,x0,A,b,Aeq,beq)
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options,P1,P2, )
[x,fval] = fmincon()
[x,fval,exitflag] = fmincon()
[x,fval,exitflag,output] = fmincon()
其中,x, b, beq, lb,和ub为线性不等式约束的上、下界向量, A 和 Aeq 为线性不等式约束和等式约束的系数矩阵矩阵,fun为目标函数,nonlcon为非线性约束函数。
显然,其调用语法中有很多和无约束函数fminunc的格式是一样的,其意义也相同,在此不在重复介绍。对应上述调用格式的解释如下:
x = fmincon(fun,x0,A,b) 给定初值x0,求解fun函数的最小值x。fun函数的约束条件为Ax <= b,x0可以是标量或向量。
x = fmincon(fun,x0,A,b,Aeq,beq) 最小化fun函数,约束条件为Aeqx = beq 和 Ax <= b。若没有不等式线性约束存在,则设置A=[]、b=[]。
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub) 定义设计变量x的线性不等式约束下界lb和上界ub,使得总是有lb <= x <= ub。若无等式线性约束存在,则令Aeq=[]、beq=[]。
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon) 在上面的基础上,在nonlcon参数中提供非线性不等式c(x)或等式ceq(x)。 fmincon函数要求c(x) <= 0且ceq(x) = 0。
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options) 用options参数指定的参数进行最小化。
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options,P1,P2,) 将问题参数P1, P2等直接传递给函数fun和nonlin。若不需要这些变量,则传递空矩阵到A, b, Aeq, beq, lb, ub, nonlcon和 options。
[x,fval] = fmincon() 返回解x处的目标函数值到fval。
[x,fval,exitflag] = fmincon() 返回exitflag参数,描述函数计算的有效性,意义同无约束调用。
[x,fval,exitflag,output] = fmincon() 返回包含优化信息的输出参数output。
非线性不等式约束nonlcon的定义方法
该参数计算非线性不等式约束c(x)<=0 和非线性等式约束ceq(x)=0。 nonlcon 参数是一个包含函数名的字符串。该函数可以是M文件、内部文件或MEX文件。它要求输入一个向量x,返回两个变量—解x处的非线性不等式向量c和非线性等式向量ceq。例如,若nonlcon='mycon',则M文件myconm须具有下面的形式:
function [c,ceq] = mycon(x)
c = % 计算x处的非线性不等式。
ceq = % 计算x处的非线性等式。
若还计算了约束的梯度,即options = optimset('GradConstr','on')
则nonlcon函数必须在第三个和第四个输出变量中返回c(x)的梯度GC和ceq(x)的梯度Gceq。
function [c,ceq,GC,GCeq] = mycon(x)
c = % 解x处的非线性不等式。
ceq = % 解x处的非线性等式。
if nargout > 2 % 被调用的nonlcon函数,要求有4个输出变量。
GC = % 不等式的梯度。
GCeq = % 等式的梯度。
end
41应用举例
已知某设计问题可以简化为如下数学模型:
显然,此模型属于一个二维约束优化问题。应用fmincon函数求解此优化模型,需要如下几个步骤:
1)编制目标函数的M文件
在Matlab主窗体的命令行中键入:“edit myobjm”,并在打开的窗口中编制代码创建目标函数M文件:
function f=myobj(x)
f=2x(1)^2+2x(2)^2-2x(1)x(2)-4x(1)-6x(2);
将其保存为myobjm备用。
2)编制非线性约数函数的M文件
若有非线性约束,则应用如下步骤创建约束函数M文件:在Matlab主窗体的命令行中键入:“edit myconm”并在打开的窗口中编制相应的代码创建约束函数M文件:
function [c,ceq]=mycon(x)
% 非线性不等式约束条件的表达式,c(1)=,c(2)=
c(1)=x(1)+5x(2)^2-5;
%非线性等式约束条件的表达式
ceq=[];
本例中没有非线性约束,故可以用上述表达方式,也可省略这一步。
3)确定其他类型约束条件的系数矩阵及常数向量
如本例中的优化模型所示,容易确定其余的输入参数,线性不等式约束条件的系数矩阵A和常数向量分别为: A=[1 1],b=[2 ],线性等式约束不存在,故Aeq=[],beq=[],设计变量X的上、下界向量:lb=[0 0]',ub=[inf inf]',其中inf表示无穷大。
4)调用fmincon函数进行求解
经过上述各步骤设置以后,可以编制主程序进行优化求解,相应的代码如下:
>> x0=[1 1]; %设置计算初始值
>> options=optimset('LargeScale','off','display','iter'); %设定优化选项参数
>> [x,fval,exitflag]=fmincon(@myobj,x0,A,b,[],[],lb,ub,@mycon,options) %进行优化求解
讲过运算以后得到结果如下所示:
Optimization terminated successfully:
First-order optimality measure less than optionsTolFun and
maximum constraint violation is less than optionsTolCon
Active Constraints:
3
4
x =
11190 08810
fval =
-76771
exitflag =
1
matlab最优化程序包括
无约束一维极值问题 进退法 黄金分割法 斐波那契法 牛顿法基本牛顿法 全局牛顿法 割线法 抛物线法 三次插值法 可接受搜索法 Goidstein法 WolfePowell法
单纯形搜索法 Powell法 最速下降法 共轭梯度法 牛顿法 修正牛顿法 拟牛顿法 信赖域法 显式最速下降法, Rosen梯度投影法 罚函数法 外点罚函数法
内点罚函数法 混合罚函数法 乘子法 G-N法 修正G-N法 L-M法 线性规划 单纯形法 修正单纯形法 大M法 变量有界单纯形法 整数规划 割平面法 分支定界法 0-1规划 二次规划
拉格朗曰法 起作用集算法 路径跟踪法 粒子群优化算法 基本粒子群算法 带压缩因子的粒子群算法 权重改进的粒子群算法 线性递减权重法 自适应权重法 随机权重法
变学习因子的粒子群算法 同步变化的学习因子 异步变化的学习因子 二阶粒子群算法 二阶振荡粒子群算法
很多条件不明确:
1、每次优化都需要导入不同的A和B,到底A和B是什么?
2、x有个范围,是整数,也就是说还有其他约束条件,为什么不给出来?
3、我很怀疑,这样的目标函数还算是线性规划吗?当然,由于前面说的x是整数,已经决定了这是整数规划问题。
定义目标函数时,用function f=objfun(x,a)
调用fmincon时,事先定义好变量a,然后: = fmincon(@(x) objfun(x,a), )
在matlab中为什么改变目标函数,优化结果不变呢,哪儿出错了
一、实现题主给出的代码是无法得到最优解的,方法错误。
二、分析题主给出的具体问题,该问题实际非线性函数优化问题,应该使用fmincon()函数才对。求解方法的思路是:
1、自定义目标函数,myfun(x)。即
x1=x(1);y1=x(2);z1=x(3);
f=(1100962500x1y1pi(500+z1)+2652318750000z1pi);
2、自定义约束条件函数,mycon(x)。即
eq = symsum(16y1/(500+my1)(500+z1+my1)^2/((500+z1+my1)^2-500^2),m,1,n); %求和
314sqrt(3)(500+x1y1+z1)^2/((500+x1y1+z1)^2-500^2)-13582/(x1y1+z1)-17727x1y1/(x1y1+z1)-2eq≤0 %约束
3、确定初始值,x0=[6 8 8]
4、确定x的上下限,即lb=[6,8,8];ub=[12,20,20];
5、使用fmincon()函数求出,x、y、z值
6、验证约束条件是否接近于0
按上述方法进行编程,运行可以得到如下结果。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)