在數學建模與生活實際問題中,我們經常會遇到「優化問題」。而所謂「優化」,就是對於乙個目標函式,在給定一些等式或不等式的約束後,求極值的過程。高中學的「線性規劃」,就是一種簡單的優化問題。
現在我們來看,如何將相對複雜一點的「二次規劃問題」(quadratic programming)在matlab中得以解決。
這是最簡單暴力的方法,根據約束條件得到自變數的取值範圍,然後在自變數的取值範圍中對自變數進行遍歷,當因變數取得極值的時候問題就得到解決。
但是在整個過程中,需要許多「人工」的操作,比如手算取值範圍,然後程式設計計算因變數的各種值,然後找出極值,balabala一堆事情,很不「自動化」。而且在很多情況下手算會十分複雜,所以不在所有情況下適用。
如圖,是quadprog()函式的幫助文件
圖中的數學公式,表示的是二次規劃問題的一般形式。
而下方的syntax部分表示的是這個函式的不同呼叫格式。
用乙個例子具體說明式中各個變數的意思:
【例】解決二次規劃問題
【分析】
1.目標函式的表示
對比文件,首先應該把目標函式表示成如下矩陣形式:
h矩陣與線性代數中的「二次型」十分相似,要注意的是與二次型不同的地方,這裡有個係數1/2,所以矩陣h的元素是二次型中的矩陣元素大小的兩倍。
本例中,
f矩陣則是目標函式中的一次項,這裡寫為
2.約束條件的表示
對比文件,約束條件需要表示成這種格式
而
而約束條件中對變數x1和x2只給出下限,沒有給上限,因此ub為空,
3.使用程式解決問題
通過1.和2.兩步,完成了目標函式與約束條件的表示,根據文件中的呼叫格式,錄入程式即可
h=[1 -1;-1 2];
f=[-2;-6];
a=[1 1;-1 2;2 1];
b=[2;2;3];
lb=[0;0];
[x,fval,exitflag,output,lambda] = quadprog(h,f,a,b,,,lb)
注意最後一行不加分號,方便顯示結果
顯示結果如下:
x =
0.6667
1.3333
fval =
-8.2222
exitflag =
1output =
包含以下欄位的 struct:
message: '太長了...省略'
algorithm: 'interior-point-convex'
firstorderopt: 2.6645e-14
constrviolation: 0
iterations: 4
cgiterations:
lambda =
包含以下欄位的 struct:
成功完成!
另外可以參考:
詳細解釋了二次型,正定矩陣,海塞矩陣的含義
hdu3873 有約束條件的最短路
題目大意 美國佬打算入侵火星,火星上有n個城市,有些城市可能受其他城市保護,如果i城市受j城市保護,那麼你必須先攻占j城市才能再攻占i城市,問你攻占城市n的最短時間是多少。資料解釋 給定t,表示有t組資料 給定n,m 表示n個點,m條邊 接下來m條有向邊,a,b,c 表示從a到b,距離為c 接下來n...
matlab解決有約束的線性規劃問題
在 matlab解決有約束的二次規劃問題 中,提到了線性規劃問題 linear programming 而線性規劃問題實際與二次規劃問題十分相似,現在在matlab中實現求解 這是用於求解問題的linprog 函式文件 同樣使用乙個例子說明這個函式的呼叫方法 例 求解如下線性規劃問題 分析 對比幫助...
列舉mysql的約束條件 MySql約束條件彙總
約束條件約束條件是在表上強制執行的資料檢驗規則 用來保證建立的表的資料完整性和準確性 主要在兩方面對資料進行約束 空值和重複值 主鍵約束 primary key 每個表只能由乙個主鍵 主鍵值須非空不重複 可設定單字段主鍵,也可設定多欄位聯合主鍵 聯合主鍵中多個欄位的取值完全相同時,才違反主鍵約束 新...