前言
這里是用python解決數學建模的一些問題,用到的是python3.x,scipy,numpy和matplotlib。
先補充一些基本的數據知識。
1、numpy.array()
在基礎操作里,array和list是不區分的(在索引和刪除一些操作還有運行時間上會有區別),python也沒有array這個數據結構。array是由numpy這個數值計算工具包定義的。因為很多操作必須要求是在array上進行(list會出錯)所以需要掌握。以下參考官方文檔。
import numpy as np
#向上轉型 >>>np.array([1,2,3.0]) array([1. ,2. ,3.]) #多維度 >>> np.array([[1, 2], [3, 4]]) array([[1, 2], [3, 4]]) #預設維度 >>> np.array([1, 2, 3], ndmin=2) array([[1, 2, 3]]) #復數 >>> np.array([1, 2, 3], dtype=complex) array([ 1.+0.j, 2.+0.j, 3.+0.j]) #多種數據類型 >>> x = np.array([(1,2),(3,4)],dtype=[('a','<i4'),('b','<i4')]) >>> x['a'] array([1, 3])
正文
補充完一些基礎的數據知識就開始接觸真正的數學建模用到的類型知識了。
一、線性規划
選擇scipy.optimize.linprog進行線性規划問題的求最大最小值問題。學習材料:官方文檔。
這里不討論具體問題,只涉及數學方程轉換成函數語言進行求解的過程,參考書籍:數學建模算法與應用。
1 ''' 2 max: z = 4x1 + 3x2 3 st: 2x1 + 3x2<=10 4 x1 + x2 <=8 5 x2 <= 7 6 x1,x2 > 0 7 ''' 8 9 from scipy.optimize import linprog 10 11 c = [4,3] #默認linprog求解的是最小值,若求最大值,此處c取反即可得到最大值的相反數。 12 A = [[2,3],[1,1]] 13 b = [10,8] 14 x1_bounds = [0,None] 15 x2_bounds =[0,7] 16 res = linprog(c,A,b,bounds=(x1_bounds,x2_bounds))
三個變量的求解方法相同,此處不再贅述。
二、多項式的最小二乘法曲線擬合
利用numpy.polyfit。
import numpy as np import matplotlib.pyplot as plt ''' ''' x = np.arange(1990,1997,1) y = np.array([70 ,122 ,144 ,152, 174, 196, 202]) z1 = ployfit(x,y,1) #之前畫過原始數據,數據走向為ax+b類型。故采用一次多項式擬合 p1 = np.ploy1d(z1) yvalue = p1(x) plt.plot(x,y,'*',label = '原始數據') plt.plot(z1,yvalue,label = '擬合曲線') plt.xlabel('x axis') plt.ylabel('y axis') plt.legend(loc = 4 ) plt.tittle('多項式擬合') plt.show()
沒有寫完,暫時先寫這么多吧。
:)