生活随笔
收集整理的這篇文章主要介紹了
MATLAB线性规划相关函数用法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一.線性規劃的Matlab標準形式及軟件求解
1. MATLAB中規定線性規劃的標準形式為 其中c和 x為n 維列向量, A、 Aeq 為適當維數的矩陣,b 、beq為適當維數的列向量。 (Aeq 對應約束條件中等式約束的系數矩陣,A為約不等式約束的系數矩陣) 2. MATLAB函數用法——linprog
[ x
, fval
] = linprog ( c
, A
, b
, Aeq
, beq
, LB
, UB
, OPTIONS
)
這里 x返回最優值對應自變量大多數是一個向量,fval 返回目標函數的最優值,A是不等式矩陣,b不等式右邊的列向量,Aeq等式約束矩陣,beq等式右邊的列向量,LB 和 UB 分別是變量 x的下界和上界, OPTIONS 是控制參數。(b,beq,LB,UB均為列向量)
3.例題
clc
; clear
;
c
= [ 2 ; 3 ; - 5 ] ;
A
= [ - 2 , 5 , - 1 ; 1 , 3 , 1 ] ;
b
= [ - 10 ; 12 ] ;
Aeq
= [ 1 , 1 , 1 ] ;
beq
= 7 ;
[ x
, fval
] = linprog ( - c
, A
, b
, Aeq
, beq
, zeros ( 3 , 1 ) ) ; % MATLAB中所給函數求的是最小值因為題目中求最大值所以
- c
fval
= - fval
;
4.可以轉化為線性規劃的問題 ①對絕對值的處理 對于“x=u-v”和“|x|=u+v”,任何一個數都可以被兩個非負數表示如果這個數為正數+,那么x=u,v=0;如果這個數為負數-,那么x=v,u=0. ②例題
clc
; clear
;
c
= 1 : 4 ;
c
= [ c
, c
] '
;
A
= [ 1 - 1 - 1 1 ; 1 - 1 1 - 3 ; 1 - 1 - 2 3 ] ;
A
= [ A
, - A
] ; % 構造變換矩陣
b
= [ - 2 - 1 - 0.5 ] '
;
[ y
, fval
] = linprog ( c
, A
, b
, [ ] , [ ] , zeros ( 8 , 1 ) ) ; % 沒有等式約束,對應空矩陣
[ ]
x
= y ( 1 : 4 ) - y ( 5 : end
) ; % 變回到原問題x
= u
- v,對于y前四個為u,后四個為v
對于這個方法我看到只能用一個字形容——妙啊
二.整數線性規劃的Matlab求解
1. 線性規劃中實際情況中,很多情況要求自變量為整數
2. 整數線性規劃函數——intlinprog *
[ x
, fval
] = intlinprog ( c
, intcon
, A
, b
, Aeq
, beq
, LB
, UB
, x0
, OPTIONS
)
這里intcon為代表了整數決策變量所在的位置,x0為初始變量(在求之前對所求變量做一個預估)。其它和linprog函數中的含義一樣。
3. 例題
clc
; clear
;
c
= [ - 3 - 2 - 1 ] '
;
intcon
= 3 ; % 整數變量的位置為
3 如果有
3 個都是整數則intcon
= [ 1 , 2 , 3 ]
A
= ones ( 1 , 3 ) ;
b
= 7 ;
Aeq
= [ 4 , 2 , 1 ] ;
beq
= 12 ;
LB
= zeros ( 3 , 1 ) ;
UB
= [ Inf
; Inf
; 1 ] ; % 對于x1
, x2都是非負數,而x3為
0 - 1 之間的整數即x3
= 0 或者
1
[ x
, fval
] = intlinprog ( c
, intcon
, A
, b
, Aeq
, beq
, LB
, UB
) ;
3.非線性規劃的Matlab標準形式及軟件求解
1.MATLAB中規定非線性規劃的標準形式為 這里c(x)和ceq(x)為非線性向量函數
2. 非線性規劃函數——fmincon
[ x
, fval
] = fmincon ( fun
, x0
, A
, b
, Aeq
, beq
, LB
, UB
, nonlcon
, OPTIONS
)
這里fun是用M文件定義的函數f(x),x0是x的初始值,nonlcon是用M文件定義的非線性向量函數c(x)和ceq(x)。 其它和linprog函數中的含義一樣。
3. 例題
% % 編寫函數fun
function f
= fun1 ( x
)
f
= sum ( x
. ^ 2 ) + 8 ;
end
% % 編寫函數nonlcon
function
[ g
, h
] = fun2 ( x
)
g
= [ - x ( 1 ) ^ 2 + x ( 2 ) - x ( 3 ) ^ 2 , x ( 1 ) + x ( 2 ) ^ 2 + x ( 3 ) ^ 2 - 20 ] ; % 非線性不等式約束
h
= [ - x ( 1 ) - x ( 2 ) ^ 2 + 2 , x ( 2 ) + 2 * x ( 3 ) ^ 2 - 3 ] ; % 非線性等式約束
end
% % 主文件程序
clc
; clear
;
[ x
, fval
] = fmincon ( @fun1
, rand ( 3 , 1 ) , [ ] , [ ] , [ ] , [ ] , zeros ( 3 , 1 ) , [ ] , @fun2
) ;
4.二次規劃的Matlab標準形式及軟件求解
1. MATLAB中規定二次規劃的標準形式為 若某非線性規劃的目標函數為自變量x的二次函數,約束條件又全是線性的,就稱這種規劃為二次規劃
2. 二次規劃函數——quadprog
[ x
, fval
] = quadprog ( H
, f
, A
, b
, Aeq
, beq
, LB
, UB
, x0
, OPTIONS
)
這里H為實對稱矩陣,f相當于除去二次的線性規劃系數
3. 例題
clc
; clear
;
H
= [ 4 , - 4 ; - 4 , 8 ] ;
f
= [ - 6 , - 3 ] '
;
A
= [ 1 1 ; 4 1 ] ;
b
= [ 3 9 ] '
;
[ x
, fval
] = quadprog ( H
, f
, A
, b
, [ ] , [ ] , zeros ( 2 , 1 ) ) ; % 沒有等式約束
5.無約束極值問題的數值解
1. fminunc和fminsearch
[ x
, fval
] = fminunc ( fun
, x0
, OPTIONS
)
[ x
, fval
] = fminsearch ( fun
, x0
, OPTIONS
)
使用optimset可以設置OPTIONS fminsearch只能求出給定初值附近的一個極小值點(如果要求極大值求相反數) 2. 例題
clc
; clear
;
f
= @
( x
) x ( 1 ) ^ 3 - x ( 2 ) ^ 3 + 3 * x ( 1 ) ^ 2 + 3 * x ( 2 ) ^ 2 - 9 * x ( 1 ) ;
g
= @
( x
) - f ( x
) ;
[ x1
, fval1
] = fminunc ( f
, rand ( 2 , 1 ) ) ; % 求極小值
[ x2
, fval2
] = fminsearch ( g
, rand ( 2 , 1 ) ) ; % 求極大值
fval2
= - fval2
;
6.約束極值問題的數值解
1. 單變量非線性函數極小值——fminbnd
[ x
, fval
] = fminbnd ( fun
, x1
, x2
, OPTIONS
)
fun是用M文件定義的函數、匿名函數(@)或者Matlab中單變量數學函數。x∈[x1,x2]
clc
; clear
;
f
= @
( x
) ( x
- 3 ) ^ 2 - 1 ;
[ f
, fval
] = fminbnd ( f
, 0 , 5 ) ;
2.fseminf函數 這里c(x),ceq(x)為向量函數,Ki(x,wi)為標量函數,w1,w2,…,wn為附加變量。
[ x
, fval
] = fseminf ( fun
, x0
, ntheta
, seminfcon
, A
, b
, Aeq
, beq
, LB
, UB
, OPTIONS
)
這里ntheta為半無窮約束Ki(x,wi)的個數,seminfcon用于定義非線性不等式約束c(x)、非線性等式約束ceq(x)和半無窮約束Ki(x,wi)的函數,seminfcon有兩個輸入參數x和s,s是推薦步長,也可以不使用。
% % 編寫fun函數文件
function f
= fun1 ( x
)
f
= sum ( ( x
- 0.5 ) . ^ 2 ) ;
end
% % 編寫seminfcon函數文件
function
[ c
, ceq
, k1
, k2
, s
] = fun2 ( x
, s
)
c
= [ ] ; ceq
= [ ] ; % 這里沒有非線性等式和不等式約束
if isnan ( s ( 1 , 1 ) ) % 如果s是NaN
s
= [ 0.2 , 0 ; 0.2 , 0 ] ;
end
% 取樣值
w1
= 1 : s ( 1 , 1 ) : 100 ;
w2
= 1 : s ( 2 , 1 ) : 100 ;
% 半無窮約束
k1
= sin ( w1
* x ( 1 ) ) . * cos ( w1
* x ( 2 ) ) - 1 / 1000 * ( w1
- 50 ) . ^ 2 - sin ( w1
* x ( 3 ) ) - x ( 3 ) - 1 ;
k2
= sin ( w2
* x ( 2 ) ) . * cos ( w2
* x ( 1 ) ) - 1 / 1000 * ( w2
- 50 ) . ^ 2 - sin ( w2
* x ( 3 ) ) - x ( 3 ) - 1 ;
% 畫圖
plot ( w1
, k1
, '-' , w2
, k2
, '+' ) ;
end
% % 編寫主程序
clc
; clear
;
x0
= [ 0.5 ; 0.2 ; 0.3 ] ; % 如果初值不合適可能得不到可行解
[ x
, feval
] = fseminf ( @fun1
, x0
, 2 , @fun2
) ;
3. fminimax函數
[ x
, fval
] = fminimax ( fun
, x0
, A
, b
, Aeq
, beq
, LB
, UB
, nonlcon
, OPTIONS
)
這里nonlcon是用M文件定義的非線性向量函數c(x)和ceq(x)。
% % 編寫函數文件
function f
= fun ( x
)
f
= [ 2 * x ( 1 ) ^ 2 + x ( 2 ) ^ 2 - 48 * x ( 1 ) - 40 * x ( 2 ) + 304 , - x ( 1 ) ^ 2 - 3 * x ( 2 ) ^ 2 , x ( 1 ) + 3 * x ( 2 ) - 18 , - x ( 1 ) - x ( 2 ) , x ( 1 ) + x ( 2 ) - 8 ] ;
end
% % 編寫主程序調用函數文件
clc
; clear
;
[ x
, fval
] = fminimax ( @fun
, rand ( 2 , 1 ) ) ;
2020/2/11今天看了數學建模線性相關的知識,感覺有很多不知道的函數用法,所以自己總結一下,以上全部來自于《數學建模算法與應用》。第一次寫CSDN,可能寫的有點亂。這些函數如果不經常用很可能忘所以記下來方便以后復習,重要的是大家一起分享吧!!!
總結
以上是生活随笔 為你收集整理的MATLAB线性规划相关函数用法 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。