1. 程式人生 > >MATLAB規劃問題——線性規劃和非線性規劃

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

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 .

相關推薦

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

1.線性規劃 求線性規劃問題的最優解有兩種方法,一種方法是使用linprog命令,另一種是使用optimtool工具箱,下面分別介紹這兩種方法. ①linprog命令 一般情況下,Linprog命令的引數形式為[x,fval] = linprog(f,A,b,Aeq,be

[matlab] 16.多約束非線性規劃 ga工具箱解決

display pla onclick ide matlab 需要 解決 close indices 下面舉例說明如何運用GA工具箱求解多約束非線性規劃問題: function f =fitness(x) f=exp(x(1))*(4*x(1)^2+2*x(

數模(9)——線性規劃非線性規劃與01規劃模型

解決線性規劃,非線性規劃等問題推薦使用lingo軟體 線性規劃: lingo程式: max=2*x1+3*x2; x1+2*x2<=8; 4*x1<=16; 4*x2<=12; 非線性規劃(出現平方,立方這種,,,都是非線性規劃,現實生活中的問題大多都

matlab:無約束非線性規劃函式

用於求解無約束非線性規劃的函式有:fminsearch和fminunc,用法介紹如下。 fminsearch函式 x=fminsearch(fun,x0) x=fminsearch(fun,x0,options) x=fminsearch(fun,x0,o

MATLAB-Robotics工具箱(2)座標變換軌跡規劃

在理解關節機器人運動學原理的基礎上用MATLAB開始做機器人的運動學模擬1.關節引數 要在MATLAB建立機器人物件,首先要了解D-H引數,利用工具箱的LINK和ROBOT函式建立物件。 LINK函式 L = LINK([alpha A theta D]) L

Matlab在數學建模中的應用》筆記2-非線性規劃&整數規劃

非線性規劃(NP) 定義:求一個函式min或max問題中,目標函式或約束條件至少有一個是非線性函式。 一般形式: 目標函式: 約束條件: 其中,為模型的(NP)的決策變數;f稱為

關於 線性規劃 非線性規劃 與 凸優化

優化問題涉及關鍵詞: 凸優化、凸錐、凸集、線性規劃、非線性規劃(np)、拉格朗日chengzi、hessian矩陣、泰勒展開式、梯度、方向導數、牛頓法、凸二次優化、區域性最小化、隨機梯度、最速梯度、批量梯度、kkt條件、等高線 、共軛梯度、二次型、二次型矩陣、對偶問題一,前

matlab非線性規劃(含有多次方或者其他函式的目標函式)

對於以下的非線性規劃問題:我們可以先分別建立兩個函式:fun1,fun2檔案fun1:function f = fun1(x);f = x(1)^2+x(2)^2+8;fun2:function [g,h]= fun2(x);g = -x(1)^2+x(2);h = -x(1

9.9遞歸動態規劃(九)——N皇後

其它 ace req case create lac any urn distance /** * 功能:打印八皇後在8*8棋盤上的各種擺法。當中每一個皇後都不同行、不同列,也不在對角線上。 * 這裏的“對角線”指的是全部的對角線,不僅僅是平分整個棋盤的那兩

51nod 1052 最大M子段(動態規劃)

表示 image cnblogs class () main png 分享 == 分析:記dp[x][s][1]為從第x個數開始,剩余s段可以分,1表示x跟上一段連著,0表示不連著,遞推式為dp[x][s][1]=max{dp[x+1][s][1]+a[x],dp[x+1

9.9遞歸動態規劃(六)——打印n對括號的所有有效組合(即左右括號正確配對)

思路 即使 情況 else 字符 ram 配對 字符串 pop /** * 功能:打印n對括號的所有有效組合(即左右括號正確配對)。 */ 兩種方法: 方法一: /** * 思路:在括號的最前面或者原有的每對括號中面插入一對括號。至於其它

數字三角形最小路徑—動態規劃

div 路徑和 image 動態 節點 spa 直接 .cn 一行 思路:自底向上求解,從倒數第二行開始,本行節點到最後一行的最小路徑和等於該節點的數據加上下面左右兩個數據中最小的一個。不使用額外空間,直接將最小路徑和存儲到原有的數組中。1 int minimumTota

[算法]死磕遞歸動態規劃

實習 數組 喜歡 情況 空間 build ring 回文串 根據 最近在忙著找實習,因而做了大量的筆試算法題,阿裏,網易,騰訊,華為,發現各大廠商都喜歡出遞歸和動態規劃題,而且出的特別多,這種題以前一直沒有搞懂,總是半懂狀態,現在感覺有必要好好整理一下。 1. 斐波那契數

#7# SCCM規劃 - 邊界邊界組

1.0 保護 連續 邏輯 fig 概念 ConfigMgr 如果 sccm 邊界和邊界組 為讀者提煉SCCM涉及的基礎知識、註意事項、運行機制以及排錯方法等信息是本系列文章的初衷,對於SCCM各組件及功能部署步驟方面的信息,網絡中已有較多文章可以參考,因此本系列文章並不側

#8# SCCM規劃 - 邊界邊界組

ive 通過 兩個 rect 定位 cto 軟件 conf rec 邊界和邊界組 為讀者提煉SCCM涉及的基礎知識、註意事項、運行機制以及排錯方法等信息是本系列文章的初衷,對於SCCM各組件及功能部署步驟方面的信息,網絡中已有較多文章可以參考,因此本系列文章並不側重於提供

4.1 斐波那契系列問題的遞歸動態規劃

str 斐波那契 斐波那契數列 數量 解法 程序 面試 一次 給定 【題目】:   給定整數N,返回斐波那契數列的第N項 【補充題目1】:   給定整數N,代表臺階數,一次可以跨2個或者1個臺階,返回有多少種走法   舉例:     N=3,可以三次都跨1個臺階;也可以先跨

最大欄位 動態規劃

最大子段和 給定由n個整數(可能有負整數)組成的序列(a1,a2,…,an),最大子段和問題要求該序列形如 的最大值(1<=i<=j<=n),當序列中所有整數均為負整數時,其最大子段和為0。 #include<stdio.h> #include<

Leetcode 931. Minimum falling path sum 最小下降路徑(動態規劃)

Leetcode 931. Minimum falling path sum 最小下降路徑和(動態規劃) 題目描述 已知一個正方形二維陣列A,我們想找到一條最小下降路徑的和 所謂下降路徑是指,從一行到下一行,只能選擇間距不超過1的列(也就是說第一行的第一列,只能選擇第二行的第一列和第二列;第二行的第二列

【機器人學】機器人開源專案KDL原始碼學習:(3)機器人操作空間路徑規劃(Path Planning)軌跡規劃(Trajectory Planning)示例

很多同學會把路徑規劃(Path Planning)和軌跡規劃(Trajectory Planning)這兩個概念混淆,路徑規劃只是表示了機械臂末端在操作空間中的幾何資訊,比如從工作臺的一端(A點)沿直線移動到另一端(B點)。而軌跡規劃則加上了時間律,比如它要完成的任務是從A點開始到B點結束,中間

04 Monte Carlo方法求解非線性規劃(02)

0.說明 本文是雞年新年計劃的內容之一:每週學習一個數學模型,寫一篇總結,記錄自己學到的東西和遇到的問題。 這些文章並不是相關模型的全面介紹,也不是從最基礎的開始,所以不一定適合數學模型的beginner,但都是些很實際的技術,希望能幫到你。 本文的重點是,分析