張茁 楊曉峰
基金項目:基于Hadoop的非標準化物流配貨數據分析與應用研究 課題編號:2017JJ5042
摘要:在大數據應用數學這門課程中,不僅要求教師能教授必要的數學知識,也要讓同學們學會如何將數學知識運用到Python語言程序當中去,將程序語言的功能最大化。本文通過一個線性代數應用案例講解如何使用Python編程實現數學問題,并優化程序,使其具有更好的通用性和可推廣性。
關鍵詞:應用數學;大數據;Python語言;程序
中圖分類號:G642;O151.2-4?? 文獻標識碼:A?? 文章編號:1672-9129(2020)16-0117-01
大數據應用數學課程開設之前學生已初步掌握了Python語言的語法和基本功能實現,在學習大數據應用數學課程上學生學習了更多Python語言在數學問題上的實現。對于有的應用問題來說,僅僅實現數學問題的計算并不能很好體現計算機語言的優勢,計算機語言本身具有的判斷、循環作用也可以很好的應用的數學問題中,使得程序更加的智能和具有可推廣性。
下面以教材當中的一個線性代數的應用案例來說明如何將Python程序設計得更加智能和具有可推廣價值。
案例:設有甲、乙、丙3種酒,重要成分A、B、C的各自含量如表1所示。調酒師現要用這3種酒配出另一種酒,使其中A、B、C的含量分別為66.5%、18.5%、15%,請問能否配出合乎要求的酒?如果能,3種酒的比例如何分配?當甲酒缺貨時,能否用3種主要成分含量為(0.8,0.12,0.08)的丁酒代替?
表1 甲、乙、丙3種酒的主要成分含量
ABC
甲 酒0.70.20.1
乙 酒0.60.20.2
丙 酒0.650.150.2
分析:設甲、乙、丙3種酒的成分含量依次為x1、x2、x3,則
0.7x1+0.6x2+0.65x3=a0.2x1+0.2x2+0.15x3=b0.1x1+0.2x2+0.2x3=c?? (1)
甲、乙、丙3種酒中都含有A、B、C三種成分,要能配出新酒使得新酒中A、B、C三種成分的含量分別為a、b、c,就是要使得方程組(1)在區間[0,1]有實數解,其實數解即為甲、乙、丙3種酒的比例;方程組若在區間內無實數解則不能按要求配出。將甲酒改為丁酒即將方程組中3個方程的第一個系數依次改為丁酒的成分含量即可。
解:設甲、乙、丙3種酒的成分含量依次為x1、x2、x3,則(1)式中的a、b、c依次取66.5%、18.5%、15%,解得(x1,x2,x3)為(0.5,0.2,0.3),即可以用甲、乙、丙3種酒配出A、B、C的含量分別為66.5%、18.5%、15%的新酒,且甲、乙、丙3種酒的比例依次為50%、20%、30%。
用筆算解這個方程組并不是十分容易(此處省略運算步驟),但是用Python的庫函數十分的簡單。輸入命令:
import numpy as np
D = np.array([[0.7,0.6,0.65],[0.2,0.2,0.15],[0.1,0.2,0.2]]) # 創建系數行列式
arr = np.array([0.665,0.185,0.15])
x = np.linalg.solve(D, arr)
print('方程組的解為:', x)
輸出結果:
方程組的解為:[0.5 0.2 0.3]
將甲酒改成丁酒后,類似的設丁、乙、丙3種酒的成分含量依次為x1、x2、x3,則(1)式中x1的系數依次改為(0.8,0.12,0.08),解得(x1,x2,x3)為(0.41666667,0.95,-0.36666667),不全為正數,即不可以用丁酒代替甲酒配出A、B、C的含量分別為66.5%、18.5%、15%的新酒。
Python輸入命令:
import numpy as np
D = np.array([[0.8,0.6,0.65],[0.12,0.2,0.15],[0.08,0.2,0.2]]) # 創建系數行列式
arr = np.array([0.665,0.185,0.15])
x = np.linalg.solve(D, arr)
print('方程組的解為:', x)
輸出結果:
方程組的解為:[ 0.41666667,0.95,-0.36666667]
此處我們只用到了程序語言的計算功能,最后的判斷還是要人工做出來,如果要將此程序運用到實際生產中,我們考慮到是可以將程序語言的判斷功能也添加進去,讓程序可以主動對計算結果做出判斷。我們在主程序的后面添加了循環和判斷語句。輸入命令:
import numpy as np
D = np.array([[0.8,0.6,0.65],[0.12,0.2,0.15],[0.08,0.2,0.2]]) # 創建系數行列式
arr = np.array([0.665,0.185,0.15])
x = np.linalg.solve(D, arr)
print('方程組的解為:', x)
z=0
for xx in x:
if xx<=0 or xx>=1:
print("不能用丁酒代替甲酒!")
break
z=z+1
if z==3:
print("可以用丁酒代替甲酒!")
輸出結果:
方程組的解為:[ 0.41666667 0.95 -0.36666667]
不能用丁酒代替甲酒!
在這套新的程序命令中,加入了循環判斷的語句,因此可以由方程組的解直接進行判斷并且得出正確的結論,在數據發生變化時也可以很方便的對程序中的數據進行更新,而不需要再變動其他的命令,仍然可以得到正確的結論,這得使程序更加的完整而具有推廣價值。
我們在大數據專業開設數學課程,是為了讓學生有必要的數學知識,在得到數據以后會提出問題、使用數學理論分析問題、并利用程序語言進一步地解決問題。數學理論時我們分析問題的基礎,程序語言是我們得到問題結論的工具,二者缺一不可,相輔相成。因此大數據專業的應用數學課程必須成為一門理論和實踐高度統一的課程才能達到培養學生理論和實踐相結合的良好的實際分析能力和數學建模能力。
參考文獻:
[1]雷俊麗,張良均.大數據數學基礎(Python語言描述)[M].人民郵電出版社:北京,2019:138.
[2]徐恩立.淺析數學與應用數學在大數據中的應用[J].科技資訊,2019,36:248-250.
[3]徐時芳,潘春燕,陳昱池.大數據+數學核心素養培育的STEM教育應用研究[J].教育教學論壇,2019,32:191-192.