數學建模我們隊伍中我主要負責程序編碼部分,所以在這里做學習記錄,方便之后的查找使用。
我會盡量的做一個數學建模系列的專題。本次是第一個關于線性規劃的解法。
matlab系列
前期知識儲備
一.matlab 安裝(本文不做介紹,簡書上有很多)
二.矩陣乘法知識儲備
- 1.行向量 1*m的矩陣
- 2.列向量 n*1的矩陣
- 3.矩陣乘法 mp的矩陣A和Pn的矩陣B相乘 得到m*n的結果矩陣。
三了解matlab函數中的方法調用
首先在matlab中有著關于這種線性方程的基本形式,我們首先要將我們要進行計算的方程化成基本形式,然后套用內部公式即可。
線性方程的基本形式
其次我們查看一下線性函數的基本方法參數
線性函數的方法
之后我們介紹一下方法參數的含義
在基本形式的那個圖片中我們可以看到,f,x,b,beq,ub都是向量,而A和aeq是矩陣。
- f:這里指的是我們要的目標函數的系數,(這里的函數是指我們經過我們標準化之后的,如果要求最大值,可以加負號)
- A: 矩陣,是表示圖中的不等關系的矩陣,將所有的不等關系化為<= ,然后系數構成我們的系數矩陣A
- b: 不等關系的結果,不等號后面的結果構成的矩陣
- Aeq: 恒等關系的系數矩陣,等號左邊。
- beq: 恒等關系的結果矩陣,等號右邊。
- lb: 參數的下限,每個參數的最小值構成的向量
- ub:參數的上限,每個參數的最大值構成的向量
- x0:官方解釋是設為初始值,個人感覺應該是說 參數》=0的意思。
個人感覺用不到,知道上面這些就足夠了。
正式開始解題
例題一.求最大值
線性方程求解例題一
首先我們分析有恒等式,也有不等式,所以我們肯定要使用我們圖二的第三個或者第四個方法
當我們使用第三個方法的時候我們利用寫出我們的matlab程序
%注意這里有一個巧妙的轉換,我們要求的是最大值,然后我們在最后的方程這個地方由于要算最小值,所以給加了一個負號,最后結果要變回來
c=[2;3;-5];
A=[-2, 5, -1
1 , 3, 1 ];
b=[-10;12];
Aeq=[1,1,1];
beq=[7];
x =linprog(-c,A,b,Aeq,beq,zeros(3,1))
value=c'*x
例題二 同樣求最大值
線性方程求解例題二
直接參照例題一得出我們的代碼
z=[4;3];
A=[2,1;1,1];
b=[10;8];
x=linprog(-z,A,b,[],[],zeros(2,1),[Inf,7])
value=z'*x
例題三,求最小值
線性方程求解,例題四
參照我們例題一寫出代碼,注意現在就不需要在我們最后的linprog中添加負號了,但是要看到給的式子中是大于號,需要我們進行轉化。
c=[2;3;1];
A=[1,4,2;3,2,0];
b=[8;6];
%這里的y就是我們通過后面的函數計算出來的最小值
[x,y]=linprog(c,-A,-b,[],[],zeros(3,1))
value=c'*x
最后寫點值得pay attention的東西
1 關于方法中的上下限問題比如說
a<x1<c
b<x2<d
他這個地方格式是這樣的
lb=[a,b] ub=[c,d]2 zeros(a,b) 生成一個大小為a*b數值都是0的矩陣
3 Inf 無窮大
4 -Inf 無窮小
5如果是寫了一個matlab腳本函數,最后的最后如果你是以;結尾的,那么會報這個Optimization terminated錯誤,可以稍微注意一下。
應該差不多了。關于數學建模的線性規劃部分,用matlab進行解決的話應該以上就是可以的。
當然由于我是matlab新手,再加上線代學過好久了,所以可能文章中有不對的地方,如果大家看到,請一定給我評論或者給我簡信,在這里先謝謝大家~