MATLAB线形规划函数linprog、intlinprog与二次规划函数quadprog

2024-02-05 08:08

本文主要是介绍MATLAB线形规划函数linprog、intlinprog与二次规划函数quadprog,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、目标函数简介

线形规划问题的数学模型:

min f(x)=Z*x , x\epsilon R^n  

s.t        A*x\leqslant b

            Aeq*x= beq  

线形规划,顾名思义就是目标函数与约束条件均为线形函数(一次函数)。

二、线形规划函数linprog

linprog函数的用法大致分为以下几种用法:

1、不等式约束

x = linprog(f,A,b)   ,f为目标函数,A为不等式约束的系数矩阵,b为不等式右侧的值,返回值x为最优解。

例1、目标函数       min f=3*x-y

                             s.t   -x+y\leqslant 1

                                       x+y\leqslant 3

                                    -x-3*y\leqslant -3

matlab代码

% x = linprog(f,A,b)  不等式约束
f=[3 -1]
A=[-1 1;1 1;-1 -3;]
b=[1;3;-3]
[x,fval]=linprog(f,A,b)%fval为目标点的函数值

2、等式+不等式约束

x = linprog(f,A,b,Aeq,beq),f为目标函数,A为不等式约束的系数矩阵,b为不等式右侧的值,Aeq为不等式约束的系数矩阵,beq为不等式右侧的值,返回值x为最优解。

例1、目标函数       min f=-x-y/3

                             s.t   x+y\leqslant 2

                                    x+y/4\leqslant 1

                                    x-y\leqslant 2

                             -x/4-y\leqslant 1

                                  -x-y\leqslant -1

                                  -x+y\leqslant 2

                                  x+y/4= 1/2

matlab代码

%% x = linprog(f,A,b,Aeq,beq) 包含等式、不等式
f=[-1 -1/3];
A=[1 1;1 1/4;1 -1;-1/4 -1;-1 -1;-1 1;];
b=[2; 1; 2; 1; -1; 2];
Aeq=[1 1/4];
beq=1/2;
[x,fval]=linprog(f,A,b,Aeq,beq)%fval为目标点的函数值

3、规定x的下限lb和上限ub

x = linprog(f,A,b,Aeq,beq,lb,ub),f为目标函数,A为不等式约束的系数矩阵,b为不等式右侧的值,Aeq为不等式约束的系数矩阵,beq为不等式右侧的值,lb、ub分别为x的下限和上限,返回值x为最优解。

例2、目标函数       min f=2*x1+3*x2+x3

                             s.t   -x1-4*x2-2*x3\leqslant -8

                                    -3*x1-2*x2*\leqslant -6

                                    x1,x2,x3\geqslant 0

matlab代码

%% x = linprog(f,A,b,Aeq,beq,lb,ub) 
f=[2 3 1]
A=[-1 -4 -2;-3 -2 0;];
b=[-8;-6];
lb=[0;0;0];
[x,fval]=linprog(f,A,b,[],[],lb); %fval为目标点的函数值

4、设置线性规划的算法

x = linprog(f,A,b,Aeq,beq,lb,ub,options) ,f为目标函数,A为不等式约束的系数矩阵,b为不等式右侧的值,Aeq为不等式约束的系数矩阵,beq为不等式右侧的值,lb、ub分别为x的下限和上限,options为算法设置句柄,返回值x为最优解。

matlab代码

%% x = linprog(f,A,b,Aeq,beq,lb,ub,options) 
% options = optimoptions('linprog','Algorithm','interior-point'); %内点法
options = optimoptions('linprog','Algorithm','interior-point-legacy');
% options = optimoptions('linprog','Algorithm','dual-simplex');%对偶单纯形法
f=[2 3 1];
A=[-1 -4 -2;-3 -2 0;];
b=[-8;-6];
lb=[0;0;0];
[x,fval]=linprog(f,A,b,[],[],lb,[],options)%fval为目标点的函数值

三、整数规划与0 1规划函数intlinprog

intlinprog函数与linprog函数用法相同,只是多出了一个整数项设置参数。

1、不等式约束

x = intlinprog(f,intcon,A,b),f为目标函数,intcon为整数设置项,A为不等式约束的系数矩阵,b为不等式右侧的值,返回值x为最优解。

例1、目标函数       min f=3*x-y

                             s.t   -x+y\leqslant 0.5

                                       x+y\leqslant 3

                                    -x-3*y\leqslant -3

matlab代码

%% x = intlinprog(f,intcon,A,b) 整数规划
f=[3 -1]
A=[-1 1;1 1;-1 -3]
b=[0.5;3;-3]
% intcon=[1]  %变量X1为整数项
% intcon=[2]  %变量x2为整数项
intcon=[1,2]  %x1、x2都为整数项 
% intcon=[]   %没有整数项
[x,fval]=intlinprog(f,intcon,A,b)

2、等式+不等式约束

x = linprog(f,intcon,A,b,Aeq,beq),f为目标函数,A为不等式约束的系数矩阵,intcon为整数设置项,b为不等式右侧的值,Aeq为不等式约束的系数矩阵,beq为不等式右侧的值,返回值x为最优解。

例2、目标函数       min f=-3*x1-2*x2-x1

                             s.t   x1+x2+x3\leqslant 7

                                    4x1+2x2+x3=12

                                    x1,x2,x3\geqslant 0

matlab代码

%% x = intlinprog(f,intcon,A,b,Aeq,beq) 
f=[-3 -2 -1]  %目标函数系数矩阵
A=[1 1 1] %不等式约束
b=7  
Aeq=[4 2 1] %等式约束
beq=12
intcon=[1 2 3] %x1 x2 x3都为整数项
lb=zeros(3,1) %下限为0
[x,fval]=intlinprog(f,intcon,A,b,Aeq,beq,lb)

3、0-1规划

例2、目标函数       min f=-3*x1-2*x2-x3

                             s.t   x1+x2+x3\leqslant 7

                                    4x1+2x2+x3=12

                                    x1,x2\geqslant 0 整数 且为整数

                                    x3= 0或1

matlab代码

%% 0-1 规划
f=[-3 -2 -1];
A=[1 1 1];
b=7;
Aeq=[4 2 1];
beq=12;
intcon=[1 2 3];
lb=zeros(3,1); 将x3下限和上线都设置为1即可
ub=[inf;inf;1];
[x,fval]=intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)

四、二次规划quadprog

定义:目标函数事自变量的二次函数,约束条件为线性函数。

二次规划问题的数学模型:

min (x^T*H*x)/2+f^T*x, x\epsilon R^n  

s.t        A*x\leqslant b

            Aeq*x= beq  

            lb\leqslant x\leqslant ub

例1、目标函数f(x)=x1^2+2*x2^2-2*x1*x2-2*x1-6*x2

                         s.t   x1+x2\leqslant 2

                               -x1+x2\leqslant 2

                                x1,x2\geqslant 0

1、首先对目标函数做处理,写成系数矩阵的形式

f(x)= (x^T*H*x)/2+f^T*x

=(a11*x1^2+a21*x1*x2+a12*x1*x2+a22*x2^2)+f1*x1+f2*x2

2、写出对应的系数矩阵

a11=2,a12=-2,a21=-2,a22=4,f1=-2,f2=-6

可得H与f

matlab代码

%% 二次规划
H=[2 -2;-2 4]
f=[-2;-6;]
A=[1 1;-1 2] %不等式约束
b=[2;2]
lb=zeros(2,1) %下限
[x,favl]=quadprog(H,f,A,b,[],[],lb)

 

这篇关于MATLAB线形规划函数linprog、intlinprog与二次规划函数quadprog的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/680265

相关文章

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

函数式编程思想

我们经常会用到各种各样的编程思想,例如面向过程、面向对象。不过笔者在该博客简单介绍一下函数式编程思想. 如果对函数式编程思想进行概括,就是f(x) = na(x) , y=uf(x)…至于其他的编程思想,可能是y=a(x)+b(x)+c(x)…,也有可能是y=f(x)=f(x)/a + f(x)/b+f(x)/c… 面向过程的指令式编程 面向过程,简单理解就是y=a(x)+b(x)+c(x)

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

轨迹规划-B样条

B样条究竟是干啥的?白话就是给出一堆点,用样条的方式,给这些点连接起来,并保证丝滑的。 同时B样条分为准均匀和非均匀,以下为准均匀为例。 参考链接1:https://zhuanlan.zhihu.com/p/50626506https://zhuanlan.zhihu.com/p/50626506 参考链接2: https://zhuanlan.zhihu.com/p/536470972h