MATLAB規劃問題——線性規劃和非線性規劃

2022-01-10 校苑數模

1.線性規劃

求線性規劃問題的最優解有兩種方法,一種方法是使用linprog命令,另一種是使用optimtool工具箱,下面分別介紹這兩種方法.

①linprog命令

一般情況下,Linprog命令的參數形式為[x,fval] = linprog(f,A,b,Aeq,beq,lb,ub,x0),下面分別介紹各參數的含義.

[x,fval]返回值中x為最優解,fval為最優值.

f表示目標函數中各個變量前面的係數向量,如果是求最小值問題,那麼f就是各個變量的係數,如果是求最大值問題,那麼f就是各個變量的係數的相反數.

A和b    表示不等式約束A*x <=b中的矩陣A和向量b.

Aeq和beq    表示等式約束Aeq*x =beq中的矩陣Aeq和向量beq.

lb和ub    分別表示自變量的上下界組成的向量,如果沒有上下界,該選項用[]表示,如果只有部分變量有上下界,其餘的變量沒有,那麼可以把沒有上下界的變量的上下界設為-inf或者inf使lb或者ub的長度符合要求.

x0    表示變量的初始值,可以預設.

例,求如下的線性規劃問題



由目標函數可知f=[-5;-4;-6];

由約束條件可知矩陣A = [1 -11;3 2 4;3 2 0];右端向量為b = [20;42;30];

由自變量都大於零可知lb =[0;0;0];

所以求該線性規劃問題最優解的代碼如下

f = [-5;-4;-6];

A = [1 -1 1;3 24;3 2 0];

b = [20;42;30];

lb = [0;0;0];

[x,fval] =linprog(f,A,b,[],[],lb)

其中Aeq和beq都為空,因為沒有等式約束條件,只有不等式約束條件.

②optimtool工具箱

在Command窗口輸入optimtool,即可彈出optimtool工具箱,如下

工具箱可以大致分為5個部分.第5部分為說明文檔,第4部分為優化選項,第3部分為最優解和最優值的顯示區域,第2部分為約束條件輸入區,第1部分可以填入目標函數值,初始值等.

利用工具箱求解①的問題,填入相應的數據,然後點擊【start】按鈕,得到結果如下

可以看到,最優解與linprog命令的方式求得的結果是相同的,但最優值不是-78,因為這是迭代的結果,只有在迭代次數區域無窮的時候,才能得到準確值-78.

再舉一例,利用MATLAB求解下面這個線性規劃問題

這是求最大值問題,要先將問題化為求解最小值的問題,再進行求解.

利用linprog命令求解上述問題的代碼如下

f = [-2;-3;5];

A = [-2 5 -1];b= [-10];

Aeq = [1 11];beq = [7];

lb = [0;0;0];

[x,feval] = linprog(f,A,b,Aeq,beq,lb)

利用optimtool工具箱來求解過程如下圖

可以驗證,兩種求解方法的結果是相同的.最後取最優值為圖中顯示的最優值的相反數.

—————分割線——————

2.非線性規劃

也有兩種求解的方法,一種是fmincon命令,另一種是optimtool工具箱.

①fmincon命令

fmincon命令的一般參數形式為fmincon(『fun』,x0,A,b,Aeq,beq,lb,ub,』nonlinearcondition』),其中各個參數含義如下

fun    目標函數(以求最小值為目標函數)

x0     最優解迭代的初始值

A,b    線性約束不等式A*x<= b

Aeq,beq    線性約束等式Aeq*x =beq

lb,ub   自變量的上下界

nonlinearcondition   非線性約束函數,它有兩個返回值,其中一個為非線性不等式約

束,另一個是非線性等式約束(具體舉例說明該項參數的設置)

在具體編寫代碼過程中,可以將線性約束也寫在非線性約束函數nonlinearcondition中,簡化代碼.

例1,求下面這個非線性規劃問題的最優值

首先,編寫目標函數的M函數文件,並保存為fun.m代碼如下

function f =fun(x)

f = x(1)^2 + x(2)^2 + 8;

end

其次,編寫線性和非線性約束的等式或不等式,編寫M函數文件,並保存為nonlinearcondition.m,代碼如下

function [f,ceq] = nonlinearcondition(x)

    f = - x(1)^2 + x(2);

    ceq = - x(1) - x(2)^2 + 2;             %非線性等式約束

end

最後,在Command窗口輸入如下代碼

[x,fval] =fmincon('fun',[0;0],[],[],[],[],[0;0],[],'nonlinearcondition')

即可得到最優值和最優解為x = [1;1],fval = 10.

例2,求下面這個非線性規劃問題的最優值

首先,編寫目標函數的M函數文件,由於求得是最大值,所以先化為求最小值問題,再原目標函數前面添加負號即可,M函數文件如下,保存為fun.m.

function f =fun(x)

f = -(sqrt(x(1)) + sqrt(x(2)) + sqrt(x(3)) +sqrt(x(4)));

end

然後,編寫線性和非線性約束不等式已經非線性約束等式的M函數文件,保存為nonlinearcondition.m,代碼如下

function [f,ceq]= nonlinearcondition(x)

%非線性和線性不等式有4個

f(1) =x(1) - 400;

f(2) =1.1*x(1) + x(2) - 440;

f(3) =1.21*x(1) + 1.1*x(2) + x(3) - 484;

f(4) =1.331*x(1) + 1.21*x(2) + 1.1*x(3) + x(4) - 532.4;

ceq = 0;%由於沒有非線性約束等式,所以這一項寫 0

end

最後,在Command窗口輸入如下代碼

[x,fval] =fmincon('fun',[0;0;0;0],[],[],[],[],[0;0;0;0],[],'nonlinearcondition')

即可得到最優解和最優值,最優值分別為

x =

   86.1883

  104.2879

  126.1883

  152.6879

fval = -43.0860

         目標函數最優值為z = -fval=43.0860.

由於線性問題也可以看做是非線性問題的特殊情況,所以可用求解非線性問題的方法求解線性規劃問題.

例3,利用fmincon命令求解1.①中的線性規劃問題

首先,編寫目標函數的M函數文件,M函數文件如下,保存為fun.m.

function f =fun(x)

f = -5*x(1) - 4*x(2) - 6*x(3);

end

然後,編寫線性和非線性約束不等式已經非線性約束等式的M函數文件,保存為nonlinearcondition.m,代碼如下

function [f,ceq]= nonlinearcondition(x)

%由於有3個線性約束,所以f返回一個三維向量

f(1) =x(1) - x(2) + x(3) - 20;

f(2) =3*x(1) + 2*x(2) + 4*x(3) - 42;

f(3) =3*x(1) + 2*x(2) - 30;

ceq = 0;%沒有非線性等式

end

最後,在Command窗口輸入如下代碼

[x,fval] =fmincon('fun',[0;0;0],[],[],[],[],[0;0;0],[],'nonlinearcondition')

得到的結果與1.線性規劃問題的1.①中所用的線性方法所得結果相同.

②optimtool工具箱

同樣,非線性規劃也可以利用optimtool工具箱,因為其中有一項是填寫非線性約束條件的,如下

利用工具箱求解在2.①中的一個問題

首先,編寫目標函數的M函數文件,由於求得是最大值,所以先化為求最小值問題,再原目標函數前面添加負號即可,M函數文件如下,保存為fun.m.

function f =fun(x)

f = -(sqrt(x(1)) + sqrt(x(2)) + sqrt(x(3)) +sqrt(x(4)));

end

然後,編寫線性和非線性約束不等式已經非線性約束等式的M函數文件,保存為nonlinearcondition.m,代碼如下

function [f,ceq]= nonlinearcondition(x)

%非線性和線性不等式有4個

f(1) =x(1) - 400;

f(2) =1.1*x(1) + x(2) - 440;

f(3) =1.21*x(1) + 1.1*x(2) + x(3) - 484;

f(4) =1.331*x(1) + 1.21*x(2) + 1.1*x(3) + x(4) - 532.4;

ceq = 0;%由於沒有非線性約束等式,所以這一項寫 0

end

在optimtool工具箱中輸入相應參數,如下,即可得到相應結果

所得結果與利用fmincon命令所得結果相同.

小結

規劃問題中還有特殊的一些問題,例如特殊的線性規劃問題——0-1規劃,特殊的非線性規問題——二次規劃問題,而線性規劃問題又是特殊的非線性規劃問題,所以這幾種規劃問題都可以用【非線性規劃問題】求解.

參考文獻

[1] 卓金武, 魏永生, 秦健, 李必文. MATLAB在數學建模中的應用[M]. 北京: 北京航空航天大學 2011: 18-24 .

轉載自:CSDN博客

代碼答疑同學請加小編

註明「規劃問題」

相關焦點

  • 利用matlab求解非線性規劃問題
    用於無約束最優化模型求解    函數:可以調用 matlab的的函數, fminsearch、fminunc。
  • scppass數值計算軟體-----【非線性規劃工具箱】
    利用matlab軟體調用fmincon函數,需要編寫非線性約束m函數文件,較為麻煩,不便於掌握。基於fmincon函數,scppass4.0已開發出非線性規劃工具箱optimt,僅需填寫目標函數、線性等式約束矩陣、非線性不等式約束非方程、非線性等式約束方程,即可求解目標函數的最值以及取得最值時的各變量值。
  • [代碼資源] 數學建模基礎算法(2) 非線性規劃
    非線性規劃:如果目標函數或約束條件中包含非線性函數,就稱這種規劃問題為非線性規劃問題。
  • 總結MATLAB的線性擬合和非線性擬合函數參數
    可以分為線形擬合和非線性擬合。曲線擬合的原理:對於y = f(x),通過構造一個函數g(x)取逼近未知函數f(x),使得誤差在某種意義下達到最小。一般使用多項式函數作為逼近函數,使用最小二乘法計算誤差最小。曲線擬合的實現方法:使用polyfit()函數,其功能為求得最小二乘擬合多項式係數。
  • 數學建模(一):用python解決線性規劃問題
    線性規劃說起來很高端,但實際上在高中學習過數學的同學應該對此不陌生。舉個慄子,工廠生產甲、乙兩種商品,其需要A、B、C三種資源,每種產品資源消耗量及單位產品銷售後所能獲得的利潤值以及這三種資源的儲備如下表所示:消耗資源ABC銷售利潤甲94370乙4610120資源儲備360200300線性規劃問題可以表述為一個目標函數與一系列約束條件
  • 用Python求解線性規劃問題
    線性規劃簡介及數學模型表示線性規劃簡介一個典型的線性規劃問題線性規劃模型的三要素線性規劃模型的數學表示圖解法和單純形法圖解法單純形法使用python求解簡單線性規劃模型編程思路求解案例例1:使用scipy求解例2:包含非線性項的求解從整數規劃到0-1規劃整數規劃模型0-1規劃模型案例:投資的收益和風險問題描述與分析建立與簡化模型線性規劃簡介及數學模型表示線性規劃簡介在人們的生產實踐中
  • R語言與優化模型(二):非線性規劃與多目標規劃
    與線性規劃不同的是,非線性規劃要求目標函數或約束條件中含有非線性函數。
  • 數學建模(二):非線性規劃問題
    上回書說到線性規劃是目標函數和約束條件都是線性的,那麼當他們不是線性的時候,就是如題的非線性規劃了。
  • Matlab 中的線性規劃函數使用方法
    線性規劃 LP(Linear programming,線性規劃)是一種優化方法,在優化問題中目標函數和約束函數均為向量變量的線性函數,LP問題可描述為:min  xs.t.    A·x b    Aeq·x=beq    vlb x vub其中 ,b,beq均為向量,A,Aeq為矩陣,x為向量變量.矩陣A和向量b是線性不等式約束條件的係數,Aeq和beq是等式約束條件的係數.
  • MATLAB非線性擬合函數nlinfit函數
    問題:有些時候我們需要擬合一些非線性的表達式。比如:我們知道一個表達式的式子是y=A*sin(x).*exp(x)-B./log(x),現在我們手裡面有x與y對應的一大把數據。我們如何根據x,y的值找出最佳的A、B值。則我們現在藉助Matlab的函數lsqcurvefit、nlinfit,當然也可以使用lsqnonlin。
  • Matlab非線性方程求解器fsolve總結
    fsolve是採用最小二乘法來求解非線性方程。clc;clear all;close all;x = fsolve(@myfun,[0.5 2 4],optimset('Display','iter')); %求解在初值分別為0.5,2和4時方程的解function F = myfun(x)F = sin(x);endFsolve還可以求解大型的非線性方程組
  • 數學建模-規劃模型總結 | MATLAB求解
    1 線性規劃問題(LP)求線性目標函數在線性約束條件下的最大值或最小值的問題,統稱為線性規劃問題。舉一個簡單案例:例:某工具機廠生產甲、乙兩種工具機,每臺銷售後的利潤分別為4000元與3000元。生產甲工具機需用A、B機器加工,加工時間分別為每臺2小時和1小時;生產乙工具機需用A、B、C三種機器加工,加工時間為每臺各一小時。
  • MATLAB的solve函數求非線性解方程或方程組
    solve函數可用來求解代數方程(組)與非線性方程(組),具體使用格式如下:solve('F','var'):用於求解單個方程情形,F表示求解方程,var表示求解變量。當求解變量省略時,表示對默認變量求解。
  • MATLAB牛頓法求解非線性方程的根
    中矩陣的入門知識MATLAB的輸入輸出input函數Matlab對fig文件導出數據matlab多項式(定義、四則計算、求根)MATLAB的switch選擇語句和input輸入語句視頻講解MATLAB的switch選擇語句和input輸入語句matlab中的歸一化處理的三種方法MATLAB求函數的導數和偏導
  • 動態規劃的Matlab實現和實例分析
    動態規劃是解決多階段決策過程最優化問題的一種方法.該方法是由美國數學家貝爾曼(R.Bellman)等人在2O世紀50年代初提出的.他們針對多階段決策問題的特點,提出了解決這類問題的最優化原理,並成功地解決了生產管理、資源分配等方面的許多實際題,從而建立了運籌學的一個新分支——動態規劃.
  • 非線性規劃|總結提要與手寫筆記
    《非線性規劃》這本書內容繁雜,簡要梳理如下。第一章主要處理無約束優化問題,關鍵內容為一階、二階最優性必要條件,二階最優性充分條件,梯度相關的概念,梯度方法在不同步長準則(Armijo Rule,固定步長,縮減步長)下的收斂性,共軛梯度法等。
  • MATLAB的拉格朗日插值
    許多實際問題中都用函數來表示某種內在聯繫或規律,而不少函數都只能通過實驗和觀測來了解。拉格朗日插值法可以找到一個多項式,其恰好在各個觀測的點取到觀測到的值。這樣的多項式稱為拉格朗日(插值)多項式。詳細介紹畫柱形圖matlab中矩陣的入門知識matlab中legend函數的用法matlab繪圖--線性規劃圖解法示意Matlab 進度條的製作Matlab對fig文件導出數據Matlab中plot函數全功能解析Matlab的fmincon函數求解非線性規劃MATLAB線性規劃函數求解線性規劃
  • 數學高考中有關線性規劃問題的考試題型分析
    線性規劃是數形結合的體現線性規劃實質上是「數形結合」數學思想方法在一個方面的體現,將最值問題藉助圖形直觀、簡便地尋找出來,是一種較快地求最值的方法。在求解應用問題時要特別注意題目中的變量的取值範圍,不可將範圍盲目擴大.探究提高本題主要考查不等式表示的平面區域、數列求和及不等式的應用等基礎知識,考查了數形結合的方法和邏輯推理能力.
  • 線性規劃&整數規劃求解速度PK
    相信大家對線性規劃和整數規劃應該不陌生,在開始今天的問題之前我們不妨再來複習一下這兩個概念,
  • 優化 | 利用SciPy求解非線性規劃問題
    編者按:本文使用SciPy的optimize模塊來求解非線性規劃問題,結合實際例子,引入非線性規劃問題的求解算法及相應函數的調用。一維搜索/單變量優化問題無約束多元優化問題非線性最小二乘問題約束優化問題非線性規劃問題的目標函數或約束條件是非線性的。本文使用SciPy的optimize模塊來求解非線性規劃問題。