🌅*🔹** φ(゜▽゜*)♪ **🔹*🌅
欢迎来到馒头侠的博客,该类目主要讲数学建模的知识,大家一起学习,联系最后的横幅!喜欢的朋友可以关注下,私信下次更新不迷路!
资源链接:点击这里获取众多源码、数模资料、思路精讲、论文模板latex和word、学习书籍等
文章目录
- 💧 fmincon函数说明
 - 目标优化问题的基本形式
 - fmincon语法和参数
 
- 💧 算例实战
 - 初始解x0的设定
 - 线性等式和不等式约束
 - 非线性等式和不等式约束
 - 含有求和公式目标函数
 
💧 fmincon函数说明
Matlab 的 fmincon 函数:寻找约束非线性多变量函数的最小值。
适用于:
- 线性函数
 - 非线性函数
 - 线性等式和不等式约束
 - 非线性等式和不等式约束
 
目标优化问题的基本形式
min  f ( x ) \min f(x) minf(x)
s . t . { A ⋅ x ≤ b A e q ⋅ x = B e q l b ≤ x ≤ u b c ( x ) ≤ 0 c e q ( x ) = 0 s.t. \begin{cases} A \cdot x \leq b \\ Aeq \cdot x = Beq \\ lb \leq x \leq ub \\ c(x) \leq 0 \\ ceq(x) = 0 \end{cases} s.t.⎩ ⎨ ⎧A⋅x≤bAeq⋅x=Beqlb≤x≤ubc(x)≤0ceq(x)=0
fmincon语法和参数
[x,fval,exitflag,output,lambda,grad,hessian] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
输入参数:
- fun :目标函数,注意需要单引号,或者@,(即写为符号函数)
 - x0:函数fun参数值的初始化;
 - A, b:参数值的线性不等式约束(A * x <= b)
 - Aeq, beq:参数值的等式线性约束 (Aeq * x = beq)
 - lb, ub:参数值的下界和上界
 - options:使用所指定的优化选项执行,options 可设置这些选项
 - nonlcon:非线性约束,其参数值一般为约束函数。如果没有非线性不等式或等式约束,设置为 nonlcon = []
 输出参数:
- x:输出最优参数值
 - fval:输出 fun 在X参数的值
 - exitflag: 输出fmincon额外条件值
 - lambda :结构体,其字段包含解 x 处的拉格朗日乘数。
 - grad:fun 在解 x 处的梯度。
 - hessian:fun 在解 x 处的黑塞矩阵。请参阅fmincon Hessian 矩阵。
 
💧 算例实战
算例都是比较简单的,希望大家好好理解,单元和多元区别不大,进阶的话重点是关于fmincon求解结果的分析,目标函数属于凸函数还是非凸,是否全局最优还是局部最优,还得考虑fmincon求解的约束容限等。
初始解x0的设定
初始解的设定也很重要,得结合你所选用的算法。下面我都是直接设定x0=rand(2,1),大家可以尝试修改初始解,看看结果有什么不同。
线性等式和不等式约束
min  f ( x ) = 3 ⋅ x 1 + 5 ⋅ x 2 \min f(x)=3 \cdot x_1 +5 \cdot x_2 minf(x)=3⋅x1+5⋅x2
s . t . { x 1 + 3 x 2 ≤ 20 2 x 1 + x 2 ≤ 30 x 1 + x 2 = 10 0 ≤ x 1 ≤ 10 3 ≤ x 2 ≤ 8 s.t. \begin{cases} x_1+3 x_2 \leq 20 \\ 2 x_1+x_2 \leq 30 \\ x_1+x_2 = 10 \\ 0 \leq x_1 \leq 10 \\ 3 \leq x_2 \leq 8 \\ \end{cases} s.t.⎩ ⎨ ⎧x1+3x2≤202x1+x2≤30x1+x2=100≤x1≤103≤x2≤8
将其与前面目标规划问题的基本形式对照即可,代码如下:
clc
clear
close all
fun=@(x) 3*x(1)+ 5*x(2);
x0=rand(1,2);
A=[1,3;2,1];
b=[20;30];
Aeq=[1,1];
beq=[10];
lb=[0,3];
ub=[10,8];
[x,fval,exitflag]=fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
 
非线性等式和不等式约束
这里注意非线性部分得移项成标准形式,即非线性部分≤0和非线性部分=0的形式,下方换成上面形式得移向变号,大家看到负号别讶异。
min  f ( x ) = 3 ⋅ x 1 2 + 5 ⋅ x 2 2 \min f(x)=3 \cdot x_1^2 +5 \cdot x_2^2 minf(x)=3⋅x12+5⋅x22
 
      
       
        
        
          s 
         
        
          . 
         
        
          t 
         
        
          . 
         
         
         
           { 
          
          
           
            
             
              
               
               
                 x 
                
               
                 1 
                
               
              
                + 
               
              
                3 
               
               
               
                 x 
                
               
                 2 
                
               
              
                ≤ 
               
              
                20 
               
              
             
            
           
           
            
             
              
              
                2 
               
               
               
                 x 
                
               
                 1 
                
               
              
                + 
               
               
               
                 x 
                
               
                 2 
                
               
              
                ≤ 
               
              
                30 
               
              
             
            
           
           
            
             
              
               
               
                 x 
                
               
                 1 
                
               
              
                + 
               
               
               
                 x 
                
               
                 2 
                
               
              
                = 
               
              
                10 
               
              
             
            
           
           
            
             
              
              
                0 
               
              
                ≤ 
               
               
               
                 x 
                
               
                 1 
                
               
              
                ≤ 
               
              
                10 
               
              
             
            
           
           
            
             
              
              
                3 
               
              
                ≤ 
               
               
               
                 x 
                
               
                 2 
                
               
              
                ≤ 
               
              
                8 
               
              
             
            
           
           
            
             
              
               
               
                 x 
                
               
                 1 
                
               
                 2 
                
               
              
                − 
               
               
               
                 x 
                
               
                 2 
                
               
              
                ≥ 
               
              
                0 
               
              
             
            
           
           
            
             
              
               
               
                 x 
                
               
                 1 
                
               
              
                − 
               
               
               
                 x 
                
               
                 2 
                
               
                 2 
                
               
              
                + 
               
              
                1 
               
              
                = 
               
              
                0 
               
              
             
            
           
          
         
        
       
         s.t. \begin{cases} x_1+3 x_2 \leq 20 \\ 2 x_1+x_2 \leq 30 \\ x_1+x_2 = 10 \\ 0 \leq x_1 \leq 10 \\ 3 \leq x_2 \leq 8 \\ x_1^2-x_2 \geq 0 \\ x_1-x_2^2 + 1 = 0 \end{cases} 
        
       
     s.t.⎩ 
              ⎨ 
              ⎧x1+3x2≤202x1+x2≤30x1+x2=100≤x1≤103≤x2≤8x12−x2≥0x1−x22+1=0
 主函数:
clc
clear
close all
fun=@(x) 3*x(1)^2+ 5*x(2)^2;
x0=rand(1,2);
A=[1,3;2,1];
b=[20;30];
Aeq=[1,1];
beq=[10];
lb=[0,3];
ub=[10,8];
[x,fval,exitflag]=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,'mycon')
 
新建mycon.m函数
function [c,ceq]=mycon(x)
c=-x(1)^2+x(2);
ceq=-x(1)-x(2)^2+1;
 
含有求和公式目标函数
若目标函数含有求和公式,如何用代码表示呢?
min  f ( x ) = ∑ i 50 ( x i − 1 ) 2 \min f(x)= \sum_i^{50}(x_i-1)^2 minf(x)=i∑50(xi−1)2
- 其中x为自变量,c为已知量
 
则我们的目标函数为
function f = fun(x)
f = 0;
for i=1:50
	f = f + (x(i) - 1)^2
end
 


















![数据结构07:查找[C++][线性查找]](https://img-blog.csdnimg.cn/d80cec258ca24c989b1a96081b310db3.png)

