Matlab線性規(guī)劃linprog函數(shù)
最近開始想學(xué)一學(xué)數(shù)學(xué)建模的相關(guān)知識,也找了不少視頻,感覺無論是PPT做的還是講解內(nèi)容沒有看起來很舒服的,只能多找?guī)讉€版本多看幾遍然后做一下筆記,先從最基礎(chǔ)的線性規(guī)劃函數(shù)開始寫。
假設(shè)需要解決以下這個線性規(guī)劃問題
m
a
x
z
=
2
x
1
+
3
x
2
?
5
x
3
s
.
t
.
{
x
1
+
x
2
+
x
3
=
7
2
x
1
?
5
x
2
+
x
3
≥
10
x
1
+
3
x
2
+
x
3
≤
12
x
1
,
x
2
,
x
3
≥
0
max\quad z = 2x_1+3x_2-5x_3\\s.t. \begin{cases} x_1+x_2+x_3=7 \\ 2x_1-5x_2+x_3\geq10 \\ x_1+3x_2+x_3\leq12 \\ x_1,x_2,x_3\geq0 \end{cases}
maxz=2x1?+3x2??5x3?s.t.?
?
??x1?+x2?+x3?=72x1??5x2?+x3?≥10x1?+3x2?+x3?≤12x1?,x2?,x3?≥0?
z
=
x
1
+
2
x
2
+
5
x
3
z = x_1+2x_2+5x_3
z=x1?+2x2?+5x3?就是目標函數(shù),求解的目的就是求滿足條件的
x
1
,
x
2
,
x
3
x_1,x_2,x_3
x1?,x2?,x3?的這三個變量的值使
z
z
z的值最大,用到的理論其實是我研一上的一門課程優(yōu)化方法里的單純型法,是可以手算的,但是從應(yīng)用角度講用Matalb函數(shù)就可以直接得到結(jié)果,似乎參加數(shù)學(xué)建模不需要十分掌握原理。
那知道了規(guī)劃問題那怎么將這些線性規(guī)劃問題的系數(shù)輸入到函數(shù)中呢
linprog函數(shù)的對應(yīng)公式
x
=
l
i
n
p
r
o
g
(
f
,
A
,
b
)
x = linprog(f,A,b)
x=linprog(f,A,b)
x
=
l
i
n
p
r
o
g
(
f
,
A
,
b
,
A
e
q
,
b
e
q
)
x = linprog(f,A,b,Aeq,beq)
x=linprog(f,A,b,Aeq,beq)
x
=
l
i
n
p
r
o
g
(
f
,
A
,
b
,
A
e
q
,
b
e
q
,
l
b
,
u
b
)
x = linprog(f,A,b,Aeq,beq,lb,ub)
x=linprog(f,A,b,Aeq,beq,lb,ub)
linprog參數(shù)的對應(yīng)公式如下
m
i
n
f
x
s
.
t
.
{
A
x
≤
b
A
e
q
?
x
=
b
e
q
l
b
≤
x
≤
u
b
min\quad fx\\ s.t. \begin{cases} Ax\leq b \\ Aeq\cdot x=beq\\ lb\leq x \leq ub \end{cases}
minfxs.t.?
?
??Ax≤bAeq?x=beqlb≤x≤ub?
在變量數(shù)量大于1時
f
,
A
,
A
e
q
,
l
b
,
u
b
f,A,Aeq,lb,ub
f,A,Aeq,lb,ub這些參數(shù)都是矩陣
b
,
b
e
q
b,beq
b,beq這兩個參數(shù)根據(jù)不等式和等式的數(shù)量可能是一個數(shù)也可能是一個矩陣。
在實際應(yīng)用時就是將原規(guī)劃轉(zhuǎn)換成公式所需的的形式,然后將對應(yīng)的系數(shù)參數(shù)提取出來,輸入到函數(shù)中進行求解。
這里值得注意到的是
l
i
n
p
r
o
g
linprog
linprog函數(shù)只能求最小值,以及約束的條件只能是小于等于,所以需要對原來的線性規(guī)劃進行一些轉(zhuǎn)化,讓線性規(guī)劃的的目標變成求最小值,并且讓約束條件都變成小于等于
讓約束變成小于等于很簡單左右兩邊都乘一個負號就行了那把
2
x
1
?
5
x
2
+
x
3
≥
10
2x_1-5x_2+x_3\geq10
2x1??5x2?+x3?≥10這個約束條件左右加一個負號變成
?
2
x
1
+
5
x
2
?
x
3
≤
?
10
-2x_1+5x_2-x_3\leq-10
?2x1?+5x2??x3?≤?10放到一起
m a x z = 2 x 1 + 3 x 2 ? 5 x 3 s . t . { x 1 + x 2 + x 3 = 7 ? 2 x 1 + 5 x 2 ? x 3 ≤ ? 10 x 1 + 3 x 2 + x 3 ≤ 12 x 1 , x 2 , x 3 ≥ 0 max\quad z = 2x_1+3x_2-5x_3\\s.t. \begin{cases} x_1+x_2+x_3=7 \\ -2x_1+5x_2-x_3\leq-10 \\ x_1+3x_2+x_3\leq12 \\ x_1,x_2,x_3\geq0 \end{cases} maxz=2x1?+3x2??5x3?s.t.? ? ??x1?+x2?+x3?=7?2x1?+5x2??x3?≤?10x1?+3x2?+x3?≤12x1?,x2?,x3?≥0?
接下來就是將求最大值轉(zhuǎn)變?yōu)榍笞钚≈蹬e個最簡單的但是應(yīng)該很有助于理解的例子
假設(shè)一個我們求函數(shù)
y
=
?
x
2
+
5
y=-x^2+5
y=?x2+5的最大值
y
=
?
x
2
+
5
y=-x^2+5
y=?x2+5函數(shù)圖像如下,很明顯最大值是
x
=
0
x=0
x=0這一點此時最大值
y
=
5
y=5
y=5
那求最小值是把函數(shù)圖像調(diào)過來求最小值嗎?可以看到此時的函數(shù)
y
1
=
x
2
?
5
y_1=x^2-5
y1?=x2?5最小值是是
x
=
0
x=0
x=0這一點此時最大值
y
1
=
?
5
y_1=-5
y1?=?5
但是我們求解的
y
=
?
x
2
+
5
y=-x^2+5
y=?x2+5函數(shù)的最大值是5實際上是
y
=
x
2
?
5
y=x^2-5
y=x2?5函數(shù)最小值的負數(shù)。那應(yīng)該怎么理解呢
假設(shè)對于
y
=
?
x
2
+
5
y=-x^2+5
y=?x2+5最大值解為
x
=
x
?
x=x^*
x=x?,
y
=
y
?
y=y^*
y=y?則
y
?
=
?
x
?
2
+
5
y^*=-x^{*2}+5
y?=?x?2+5 對兩邊取負值則
?
y
?
=
x
?
2
?
5
-y^*=x^{*2}-5
?y?=x?2?5 之前我們將
?
y
?
-y^*
?y?看成
y
1
y_1
y1?所以求得的
y
1
=
x
2
?
5
y_1=x^2-5
y1?=x2?5中的最小值
y
1
?
y_1^*
y1??其實是
?
y
?
-y^*
?y?也就是
y
=
?
x
2
+
5
y=-x^2+5
y=?x2+5最大值解的負數(shù)
因此我們將原線性規(guī)劃問題變?yōu)?br>
m
i
n
z
1
=
?
2
x
1
?
3
x
2
+
5
x
3
s
.
t
.
{
x
1
+
x
2
+
x
3
=
7
?
2
x
1
+
5
x
2
?
x
3
≤
?
10
x
1
+
3
x
2
+
x
3
≤
12
x
1
,
x
2
,
x
3
≥
0
min\quad z_1 = -2x_1-3x_2+5x_3\\s.t. \begin{cases} x_1+x_2+x_3=7 \\ -2x_1+5x_2-x_3\leq-10 \\ x_1+3x_2+x_3\leq12 \\ x_1,x_2,x_3\geq0 \end{cases}
minz1?=?2x1??3x2?+5x3?s.t.?
?
??x1?+x2?+x3?=7?2x1?+5x2??x3?≤?10x1?+3x2?+x3?≤12x1?,x2?,x3?≥0?
其中 z 1 = ? z z_1=-z z1?=?z
好了我們已經(jīng)將原問題轉(zhuǎn)換為了符合使用linprog函數(shù)的形式接下來就是將函數(shù)所需要的每一個參數(shù)找出來然后放進函數(shù)里去求解,再把這個公式站過來,首先找
f
f
f
m
i
n
f
x
s
.
t
.
{
A
x
≤
b
A
e
q
?
x
=
b
e
q
l
b
≤
x
≤
u
b
min\quad fx\\ s.t. \begin{cases} Ax\leq b \\ Aeq\cdot x=beq\\ lb\leq x \leq ub \end{cases}
minfxs.t.?
?
??Ax≤bAeq?x=beqlb≤x≤ub?
f
x
=
[
?
2
?
3
5
]
[
x
1
x
2
x
3
]
fx=\left[\begin{array}{c}-2 & -3 & 5 \end{array}\right]\left[\begin{array}{c}x_1 \\ x_2 \\ x_3 \end{array}\right]
fx=[?2??3?5?]
?x1?x2?x3??
?
所以
f
=
[
?
2
?
3
5
]
f=\left[\begin{array}{c}-2 & -3 & 5 \end{array}\right]
f=[?2??3?5?]
然后再來找
A
A
A
A
x
=
[
?
2
5
?
1
1
3
1
]
[
x
1
x
2
x
3
]
Ax=\left[\begin{array}{c}-2 & 5 & -1 \\1 & 3 & 1 \end{array}\right]\left[\begin{array}{c}x_1 \\ x_2 \\ x_3 \end{array}\right]
Ax=[?21?53??11?]
?x1?x2?x3??
?
所以A為
A
=
[
?
2
5
?
1
1
3
1
]
A=\left[\begin{array}{c}-2 & 5 & -1 \\1 & 3 & 1 \end{array}\right]
A=[?21?53??11?]
則
b
b
b為
b
=
[
?
10
12
]
b=\left[\begin{array}{c}-10 \\ 12 \end{array}\right]
b=[?1012?]
然后是
A
e
q
?
x
=
[
1
1
1
]
[
x
1
x
2
x
3
]
Aeq\cdot x=\left[\begin{array}{c}1 & 1 & 1 \end{array}\right]\left[\begin{array}{c}x_1 \\ x_2 \\ x_3 \end{array}\right]
Aeq?x=[1?1?1?]
?x1?x2?x3??
?
A
e
q
=
[
1
1
1
]
Aeq=\left[\begin{array}{c}1 & 1 & 1 \end{array}\right]
Aeq=[1?1?1?]
這里由于等式約束只有一個所以
b
e
q
=
7
beq=7
beq=7是一個數(shù)
因為原規(guī)劃中
x
1
,
x
2
,
x
3
≥
0
x_1,x_2,x_3\geq0
x1?,x2?,x3?≥0只有下限沒有上限
l
b
≤
x
≤
u
b
lb\leq x \leq ub
lb≤x≤ub所以只需要輸入
l
b
lb
lb,這里的
l
b
lb
lb就是
l
b
=
[
0
0
0
]
lb=\left[\begin{array}{c}0 \\ 0 \\0 \end{array}\right]
lb=
?000?
?
[
x
1
x
2
x
3
]
≥
[
0
0
0
]
\left[\begin{array}{c}x_1 \\ x_2 \\ x_3 \end{array}\right]\geq\left[\begin{array}{c}0 \\ 0 \\0 \end{array}\right]
?x1?x2?x3??
?≥
?000?
?
當分解出了所有的參數(shù)了之后用matlab進行編程文章來源:http://www.zghlxwxcb.cn/news/detail-456842.html
f = [-2 -3 5];
A = [-2 5 -1; 1 3 1];
b = [-10; 12];
Aeq=[1 1 1];
Beq=7;
lb = zeros(3,1);
[x,z1] = linprog(f,A,b,Aeq,Beq,lb);
z=-z1
最后的結(jié)果如下,最優(yōu)解為
x
?
=
[
6.4286
0.5714
0
]
x^*=\left[\begin{array}{c}6.4286 \\ 0.5714 \\0 \end{array}\right]
x?=
?6.42860.57140?
?
最優(yōu)值
z
?
=
14.5714
z^*=14.5714
z?=14.5714文章來源地址http://www.zghlxwxcb.cn/news/detail-456842.html
到了這里,關(guān)于Matlab線性規(guī)劃函數(shù)linprog-小白詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!