700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Matlab求解非线性规划(fmincon函数的使用)

Matlab求解非线性规划(fmincon函数的使用)

时间:2019-09-11 07:07:33

相关推荐

Matlab求解非线性规划(fmincon函数的使用)

Matlab中fmincon函数的使用

1. 介绍2. 语法3. 示例3.1 编写M函数fun1.m,定义目标函数3.2 编写M函数fun2.m,定义非线性约束条件3.3 编写主程序函数

最近写文章需要用到fmincon函数做优化,于是抽空学习一下;按照惯例,继续开个博文记录一下学习的过程

参考资料:

[寻找约束非线性多变量函数的最小值 - MathWorks]

[Matlab求解非线性规划,fmincon函数的用法总结 - 博客园]

[Matlab非线性规划 - 博客园]

1. 介绍

在Matlab中,fmincon函数可以求解带约束的非线性多变量函数(Constrained nonlinear multivariable function)的最小值,即可以用来求解非线性规划问题

matlab中,非线性规划模型的写法如下

minf(x)s.t.{A⋅x≤bAeq⋅x=beqc(x)≤0ceq(x)=0lb≤x≤ubmin \; f(x) \\ s.t. \begin{cases} A·x ≤b \\ Aeq·x = beq \\ c(x)≤0\\ ceq(x) = 0\\ lb≤x≤ub \end{cases} minf(x)s.t.⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧​A⋅x≤bAeq⋅x=beqc(x)≤0ceq(x)=0lb≤x≤ub​

A、Aeq 为线性约束对应的矩阵b、beq 为线性约束对应的向量C(x),Ceq(x) 为非线性约束(返回向量的函数)f(x) 为目标函数(返回标量的函数)

2. 语法

Matlab求解命令为:

x=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)x = fmincon(fun,x0,A, b,Aeq,beq,lb,ub,nonlcon,options) x=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)

x的返回值是决策向量x的取值,fval的返回值是目标函数f(x)的取值fun是用M文件定义的函数f(x),代表了(非)线性目标函数x0是x的初始值A, b, Aeq, beq定义了线性约束,如果没有线性约束,则A=[], b=[], Aeq=[], beq=[]lb和ub是变量x的下界和上界,如果下界和上界没有约束,则lb=[], ub=[], 也可以写成lb的各分量都为 -inf, ub的各分量都为infnonlcon是用M文件定义的非线性向量函数约束options定义了优化参数,不填写表示使用Matlab默认的参数设置

3. 示例

求下列非线性规划问题:

minf(x)=x12+x22+x32+8s.t.{x12−x2+x32≥0x12+x22+x32≤20−x12−x22+2=0x2+2x32=3x1,x2,x3≥0min \; f(x) = x_{1}^2 + x_{2}^2+x_{3}^2+8 \\ s.t. \begin{cases} x_{1}^2-x_{2} +x_{3}^2≥0 \\ x_{1}^2+x_{2}^2 +x_{3}^2≤20 \\ -x_{1}^2-x_{2}^2 +2=0\\ x_{2} +2x_{3}^2=3\\ x_{1}, x_{2} ,x_{3}≥0 \end{cases} minf(x)=x12​+x22​+x32​+8s.t.⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧​x12​−x2​+x32​≥0x12​+x22​+x32​≤20−x12​−x22​+2=0x2​+2x32​=3x1​,x2​,x3​≥0​

3.1 编写M函数fun1.m,定义目标函数

function f = fun1(x)f = x(1).^2 + x(2).^2 + x(3).^2 + 8;end

3.2 编写M函数fun2.m,定义非线性约束条件

function [g,h] = fun2(x)g(1) = - x(1).^2 + x(2) - x(3).^2;g(2) = x(1) + x(2).^2 + x(3).^3 - 20;% g代表不等式约束,Matlab中默认g<=0,所以这里取相反数h(1) = - x(1).^2 - x(2).^2 + 2;h(2) = x(2) + 2 * x(3).^2 - 3;% h代表等式约束 end

3.3 编写主程序函数

options = optimset;[x, y] = fmincon('fun1', rand(3, 1), [], [], [], [], zeros(3, 1), [], 'fun2', options)% 'fun1'代表目标函数,rand(3, 1)随机给了x初值,zeros(3, 1)代表下限为0,即x1, x2, x3>=0, 'fun2'即刚才写的约束条件

所得结果,x为最优解,y为最优值:

x1=0.6312,x2=1.2656,x3=0.9312y=10.8672x_{1}=0.6312,x_{2}=1.2656,x_{3}=0.9312\\ y=10.8672 x1​=0.6312,x2​=1.2656,x3​=0.9312y=10.8672

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。