matlab求解非线性规划

news/2024/9/21 8:02:55/文章来源:https://www.cnblogs.com/dlmuwxw/p/18354101

目录
  • 前言
  • 一、非线性规划的标准型
  • 二、fmincon函数
    • 1.目标函数--function f = fun(x)
    • 2.非线性约束函数--[c,ceq] = nonlfun(x)
    • 3.设置求解方法--option
  • 三、matlab求解非线性规划的实例与可能遇到的问题
    • 1.初值问题
    • 2.算法问题
      • (1)内点法求解
      • (2)SQP算法求解
      • (3)active set算法求解
      • (4)信赖域反射算法求解

前言

描述目标函数或约束条件的数学表达式中,至少一个是非线性函数,这样的优化问题通常称为非线性规划。一般说来,解决非线性规问题要比解决线性规划问题困难得多。线性规划有适用于一般情况的单纯形法,但是于非线性规划问题,目前还没有一种适用于一般情况的求解方法,现有各种方法都有各特定的适用范围。本章会介绍如何用matlab内置的不同算法解决非线性规划问题。

一、非线性规划的标准型

非线性规划的标准型相比线性规划多了一个非线性不等式约束与非线性等式约束,其与线性约束的区别在于非线性约束需要把等号的右边全部化成0

二、fmincon函数

[x,fval] = fmincon(@fun,x0,A,b,Aeq,beq,lb,ub,@nonlfun,option)
x0表示给定的初始值(用行向量或者列向量表示),必须得写,而且对求解十分重要
@fun表示目标函数,不再像线性规划的函数仅用系数向量这么简单来表示,需要在同一文件目录下创建一个函数文件
@nonlfun表示非线性约束的函数
option 表示求解非线性规划使用的方法

1.目标函数--function f = fun(x)

此参数是一个保存在同一文件夹下的函数文件,其中x是一个向量,写的时候不能直接写x1,x2;而是要用x(1),x(2)来表示向量中的元素

function f = fun(x)
%      max  f(x) = x1^2 +x2^2 -x1*x2 -2x1 -5x2f = -x(1)^2-x(2)^2 +x(1)*x(2)+2*x(1)+5*x(2) ; 
end

2.非线性约束函数--[c,ceq] = nonlfun(x)

这里的c是一个非线性不等式约束,ceq是非线性等式约束,他们的写法也是把x当作一个向量,用x(1)来引用x里面的元素。
同时,需要把约束的右侧全部化为0,填入约束的左侧

function [c,ceq] = nonlfun2(x)% 非线性不等式约束c = [-x(1)^2+x(2)-x(3)^2;   % 一定要注意写法的规范,再次强调这里的x是一个向量!不能把x(1)写成x1x(1)+x(2)^2+x(3)^2-20];% 非线性等式约束ceq = [-x(1)-x(2)^2+2;x(2)+2*x(3)^2-3]; 
end

3.设置求解方法--option

matlab为求解非线性约束提供了几种方法,可以通过命令来调用,在比赛中,我们可以在论文中说明我们使用了不同方法,并描述哪一种方法更好
(1)内点法-- matlab默认的求解方法
option = optimoptions('fmincon','Algorithm','interior-point')
(2)序列二次规划法
option = optimoptions('fmincon','Algorithm','sqp')
(3)有效集法
option = optimoptions('fmincon','Algorithm','active-set')
(4)信赖域反射算法(对约束有要求)
option = optimoptions('fmincon','Algorithm','trust-region-reflective')

三、matlab求解非线性规划的实例与可能遇到的问题

1.初值问题

x0 = [0 0]; x1 = [40.8, 10.8] %任意给定一个初始值 
A = [-2 3]; b = 6;
[x,fval] = fmincon(@fun1,x0,A,b,[],[],[],[],@nonlfun1)  % 注意 fun1.m文件和nonlfun1.m文件都必须在当前文件夹目录下
fval = -fval

当选定x0作为初值时,结果:x=[1.00000001604465,6.66655111798166e-08]
fval=-1.00000039999306
当选定x1作为初值时,结果:x=[1.5123164061584e+22,-1.85553223470542e+52]
fval=3.4429998740309e+104
这说明初值对求解的影响很大,不同的初值给出的结果天差地别,而且让x1作为初值时,得到的结果应该也不满足我们的约束。(或许我们的初值就不满足约束)
因此,找到一个合适的初值对解决我们的问题时非常重要的
使用蒙特卡罗的方法来找初始值(推荐),在蒙特卡罗的方法的循环过程中,不必再加入判断等式约束的条件,因为我们可以通过等式约束的条件来生成随机数

2.算法问题

(1)内点法求解

option = optimoptions('fmincon','Algorithm','interior-point')
[x,fval] = fmincon(@fun1,x0,A,b,[],[],[],[],@nonlfun1,option)  
fval = -fval

x =[1.00000001604465,6.66655111798166e-08]
fval =-1.00000039999306

(2)SQP算法求解

option = optimoptions('fmincon','Algorithm','sqp')
[x,fval] = fmincon(@fun1,x0,A,b,[],[],[],[],@nonlfun1,option)  
fval = -fval   %得到-4.358,远远大于内点法得到的-1,猜想是初始值的影响
% 改变初始值试试
x0 = [1 1];  %任意给定一个初始值 
[x,fval] = fmincon(@fun1,x0,A,b,[],[],[],[],@nonlfun1,option)  % 最小值为-1,和内点法相同(这说明内点法的适应性要好)
fval = -fval 

(3)active set算法求解

option = optimoptions('fmincon','Algorithm','active-set')
[x,fval] = fmincon(@fun1,x0,A,b,[],[],[],[],@nonlfun1,option)
fval = -fval 

结果:
x =[-0.333333399760948,1.7777777334927]
fval =-4.35802434691854

(4)信赖域反射算法求解

option = optimoptions('fmincon','Algorithm','trust-region-reflective')
[x,fval] = fmincon(@fun1,x0,A,b,[],[],[],[],@nonlfun1,option)  
fval = -fval 


这说明这个算法不适用我们这个约束条件,所以以后遇到了不能求解的情况,记得更换其他算法试试!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/781491.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

genieacs安装

linux环境:ubuntu18.041. 安装node.js16.14wget https://nodejs.org/dist/v16.14.2/node-v16.14.2-linux-x64.tar.xz tar -Jxvf node-v16.14.2-linux-x64.tar.xz sudo mv node-v16.14.2-linux-x64/ /opt/ sudo ln -s /opt/node-v16.14.2-linux-x64/bin/node /usr/local/bin/ …

Scanner的进阶使用——基础计算

通过Scanner,可以将我们输入的数字进行计算从而反映出和以及平均数 1.定义两个变量,分别是输入的整数以及总数的和2.建立一个扫描器3.使用while关键字进行循环,在符合条件下(输入的是数字)可以一直进行计算过程4.设置电脑接收数据5.设置我们输入的次数以及数字的总和6.输出…

jUC中的锁

在JUC中 可以使用synchronized关键字进行加锁 如下所示 Object object = new Object(); synchronized (object){ // TODO }synchronized关键字所加的锁是逐步升级的,顺序是 无锁-> 偏向锁 -> 轻量级锁 -> 重量级锁、随着锁等级的提高,所带来的消耗也会越…

Scanner的进阶使用——数字的输入

1.用Scanner输入数字(整数和小数) 1.定义一个整数变量2.建立扫描器3.使用if4.建立电脑接收数据5.设置else(那么)语法6.关闭Scanner

电磁学 数学储备

以新概念物理的附录为主要参考,总结了电磁学的部分数学基础。A 矢量的乘积和对称性 \[\def\ooint{{\bigcirc}\kern-11.5pt{\int}\kern-6.5pt{\int}} \def\oooint{{\bigcirc}\kern-12.3pt{\int}\kern-7pt{\int}\kern-7pt{\int}} \]矢量的标积 设\(\boldsymbol{A}\)和\(\boldsym…

面试题:64匹马,8个赛道,最少跑几次可以找出前四名?

面试题:64匹马,8个赛道,最少跑几次可以找出前四名? 一、常规非最优解法 均分比赛,高度为4的二叉树。次数为8+4+2+1=15 二、最优解综上,最少10次,最多11次。

华为pura70pro+ vs VIVO x100s pro

华为pura70pro+ vs VIVO x100s pro 简介 最近主力机不是很给力,老是发热卡顿,影响我正常的使用,于是有了换手机的想法。作为数码爱好者,有着使不完的折腾劲,我从三千块多的手机研究到了七八千的手机,从红米到小米,从oppo、vivo到华为等等等等研究了个遍。在五花八门的手…

多元/多维高斯/正态分布概率密度函数推导 (Derivation of the Multivariate/Multidimensional Normal/Gaussian Density)

各种维度正态分布公式: 一维正态分布二维正态分布/多维正态分布各向同性正态分布 注:即方差都是一样的,均值不一样,方差的值可以单独用标量表示。 多元/多维高斯/正态分布概率密度函数推导 (Derivation of the Multivariate/Multidimensional Normal/Gaussian Density) 作者…

痞子衡嵌入式:探析i.MXRT1050在GPIO上增加RC延时电路后导致边沿中断误触发问题(上篇)

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是i.MXRT1050在GPIO上增加RC延时电路后导致边沿中断误触发问题探析。前段时间有一个 RT1052 客户反馈了一个有趣的问题,他们设计得是一个带 LCD 屏交互的应用,应用以官方 SDK 里的 lvgl_demo_widgets_bm 例程…

【书生浦语大模型实战营学习笔记】第二课 8G 显存玩转书生大模型 Demo

任务一:使用 Cli Demo 完成 InternLM2-Chat-1.8B 模型的部署,并生成 300 字小故事,记录复现过程并截图。配置好预置环境:300 字小故事:

Android网页投屏控制从入门到放弃

本文主要记录通过网页控制安卓设备相关的实践过程,通过从adb方案开始,到uiautomator2,以及最后放弃scrpy方案,在这个热闹的周末,正好闲暇的时间,了解过去不曾接触的知识,也是一个有趣的过程。背景 业务需要采集在app上执行任务的整个过程,原始方案相对复杂,修改需要协…