章節試閱
主題3. 最佳化演算(Optimization) 求極值
前面的主題是解滿足一階導函數的根,因此,我們必須先微分求出導函數。但是,最簡單的方法是直接對目標函數求解:同時解出目標極值和臨界值。
Python完成這件事有sympy和scipy,筆者覺得sympy需要宣告的參數太多,尤其是在帶限制式時。所以我們使用模組scipy內的函數optimize()和minimize(),Python程式碼的步驟解說如下。
5.3-1 單變數
我們先看本章範例1的簡單方程式,如下:
第1步:定義函數
from scipy import optimize
def f(x, sign=-1):
return sign*(2*x**3+3*x**2-12*x-7)
兩行就OK,相當簡易。待會我們再解釋sign的意義。接下來執行求極值:
第2步:求解與結果
Result1 = optimize. minimize_scalar(f)
Result1.x
Result1.fun
f(Result1.x)
optimize. minimize_scalar()是求解函數。Result1內有許多物件,主要有三個:
(1) Result1.x: 解出的x值。
(2) Result1.fun: 解出的極小值,可以和f(Result1.x)對照是否一樣。
(3) Result1.success: 回傳求解是否成功(True/False)。
我們看看列印在螢幕的結果,如下:
Result1.x
Out[2]: 1.0
Result1.fun
Out[3]: -14.0
f(Result1.x)
Out[4]: -14.0
我們回去看範例1的圖形,可能的臨界值有兩個,從圖形看的出來,我們解出的只是極小值(1, -14)。那另一極大值的解呢?根據scipy說明文件,須把函數取負值 ,這也是我們為什麼寫函數時,要增加一個參數 sign,因為這樣比較方便,判斷極大值時,可以如下這樣處理:
第1步:定義函數
def f(x, sign = -1):
return sign*(2*x**3+3*x**2-12*x-7)
第2步:求解與結果
Result2 = optimize.minimize_scalar(f)
螢幕的結果如下(需注意極值須加負號)
Result2.x
Out[5]: -1.999999999777818
-Result2.fun
Out[6]: 13.0
-f(Result2.x)
Out[7]: 13.0
範例5 函數f(x)=x4-x3相對極小值
第1步:定義函數
def f(x,sign=1):
return sign*(x**4-x**3)
第2步:求解與結果
Result3 = optimize.minimize_scalar(f)
螢幕的結果如下
Result3.x
Out[9]: 0.7500000000447832
Result3.fun
Out[10]: -0.10546875
f(Result3.x)
Out[11]: -0.10546875
5.3-2 多變數
再來就是不帶限制條件的多變數函數,本範圍範例的函數 相對極小值,則:
第1步:定義函數
import numpy as np
from scipy.optimize import minimize
def f(x, sign=1):
x1 = x[0]
x2 = x[1]
return sign*(x1**3-4*x1*x2 +2*x2**2)
第2步:求解與結果
x0=[1,1]
Result4 = minimize(f, x0)
雙變數以上的數值求解演算比較複雜,我們使用的函數是minimize(),如果用上面的optimize.minimize_scalar()執行會失敗。x0=[1,1]是起始值(initial values)。
螢幕的結果如下:
Result4.x
Out[13]: array([1.33333404, 1.3333353 ])
Result4.fun
Out[14]: -1.185185185181036
f(Result4.x)
Out[15]: -1.185185185181036
因為是數值結果,書上手解的臨界值是4/3,電腦則算出1.3333。相對極小值則是 -1.185。
此題還有一解,(0,0)是鞍點,如果設定x0=[0,0],就會帶出0的極值。因為鞍點判斷的程式做法需要賦予更多的條件,不是本書涵蓋,也不是商學院微積分主題,我們大致知道目前學習的狀況即可。如果想挑戰Python 程式,把目前所學過的方法串起來,可以循以下步驟:
步驟 1. 使用diff()函數解一階偏微分,求取可能的臨界值
步驟 2. 求二階偏微分
步驟 3. 參考主題一的二元一次方程式求解判斷的準則(Delta),定義第三章的來判斷誰是鞍點,誰無解。
最後. 把可能的臨界值設為起始值,求解。
這樣的四步驟其實是一個程式訓練的典型基礎,有程式興趣的同學可以用在本範圍範例當作練習,為了避免微積分學習花太多時間講這個,我們就到此為止。
練習
1. 任選本範圍範例題,以書本解出的臨界值附近任取數字當作起始值,寫程式求解極值,並和書本比對。
5.3-3 多變數帶限制式
最後就是帶限制條件的極值,我們以第15堂課範例1來說明
Min.
s.t.
第1步:定義目標函數
import numpy as np
from scipy.optimize import minimize
def f(x, sign=1):
x1 = x[0]
x2 = x[1]
return sign*(x1+ 2*x2)
第2步:定義限制條件
def constraint1(x, sign=1):
return sign*(x[0]*x[1]- 5000)
第3步:設定求解參數
x0=[10,10] # 起始值,
b1 = (0, np.inf) # 參數條件xɬ,上界給予正無限大,np.inf就是
b2 = (0, np.inf) # 參數條件yɬ,上界給予正無限大,np.inf就是
bnds= (b1,b2) # 邊界條件向量
con1 = {'type': 'ineq', 'fun': constraint1} #把限制集定義成字典
cons = [con1] #把con1做成串列 (萬一有多個條件時,可以包在一起)
第4步:求解與結果
Result5 = minimize(f, x0,bounds=bnds,constraints=cons)
螢幕的結果如下
Result5.x
Out[17]: array([100.00691556, 49.99654246])
Result5.fun
Out[18]: 200.0000004780455
f(Result5.x)
Out[19]: 200.0000004780455
可對照數值的結果和第15堂課代數的結果。
接下來我們看「三變數,兩條限制式」,如第15堂課範例3。這個範例足以做很多的推廣
Min.
s.t.
第1步:定義目標函數
import numpy as np
from scipy.optimize import minimize
def f(x, sign=1):
x1 = x[0]
x2 = x[1]
x3 = x[2]
return sign*(x1**2+ x2**2+x3**2)
第2步:定義限制條件
def constraint1(x, sign=1):
return sign*(x[0]+x[1]-3)
def constraint2(x, sign=1):
return sign*(x[0]+x[2]- 5)
第3步:設定求解參數(參數沒有bounds,故不需定義如前提的b1,b2)
x0=[1,1,1]
con1 = {'type': 'ineq', 'fun': constraint1}
con2 = {'type': 'ineq', 'fun': constraint2}
cons = [con1, con2]
第4步:求解與結果
Result6 = minimize(f,x0,constraints=cons)
螢幕的結果如下
Result6 = minimize(f,x0,constraints=cons)
Result6.x
Out[21]: array([2.6666667, 0.3333333, 2.3333333])
Result6.fun
Out[22]: 12.666666666666735
f(Result6.x)
Out[23]: 12.666666666666735
可以確認數值結果和第15堂課的分式,是一樣的。這樣本範圍所有的問題,我們都可以處理了。
練習
1. 修改上面程式,求解本範圍範例和習題,和答案確認結果。
主題3. 最佳化演算(Optimization) 求極值
前面的主題是解滿足一階導函數的根,因此,我們必須先微分求出導函數。但是,最簡單的方法是直接對目標函數求解:同時解出目標極值和臨界值。
Python完成這件事有sympy和scipy,筆者覺得sympy需要宣告的參數太多,尤其是在帶限制式時。所以我們使用模組scipy內的函數optimize()和minimize(),Python程式碼的步驟解說如下。
5.3-1 單變數
我們先看本章範例1的簡單方程式,如下:
第1步:定義函數
from scipy import optimize
def f(x, sign=-1):
return sign*(2*x**3+3*x**2-12*x-7...
推薦序
推薦序
管理數學已為商管領域中數量方法的重要基礎,本書主要內容包括「微積分」與「矩陣代數」,並搭配實務面應用,如「數學規劃」及「管理決策」等。
與數學一樣講求邏輯思維的程式設計,近年來由於大數據與人工智慧的興起,帶動了一股軟體應用程式設計的學習熱潮,而過去幾年Python 語言在 codeeval.com的最夯程式語言中名列第一,毫無疑問Python已成為當今最熱門的程式語言。Python程式碼簡單好理解、有超豐富的函式庫可以運用,是非常適合商管領域初學者學習的程式語言。
將當今最熱門及最適合商管領域初學者學習的程式語言Python與管理數學內容結合起來是本書的最大特色;讀者可將數學的運算邏輯透過程式語言來實現演算,過程中除了可以學習到數量方法與程式語法之外,對於商管領域未來實務應用與發展能力上奠定了深厚的基礎,例如:現今金融業蓬勃發展的金融科技(FinTech)。
末學與何宗武教授是相識多年的好友,同時也是在大數據、人工智慧於金融科技發展上的同好伙伴,深知何教授在財經與金融大數據等研究領域表現卓越,並且也出版多本與商管相關的程式語言書籍,對於商管程式教育不遺餘力。而「管理數學與Python」一書著重以企業管理為主的理論學習架構,搭配Python程式語言實現運算邏輯,內容淺顯易懂,非常適合商管相關科系的學生來學習,在此鄭重推薦給大家研讀,相信收穫一定滿滿。
陳育仁
國立高雄科技大學
會計資訊系、資訊財務碩士學位學程 教授
財金大數據中心 主持人
2019/05/24
推薦序
管理數學已為商管領域中數量方法的重要基礎,本書主要內容包括「微積分」與「矩陣代數」,並搭配實務面應用,如「數學規劃」及「管理決策」等。
與數學一樣講求邏輯思維的程式設計,近年來由於大數據與人工智慧的興起,帶動了一股軟體應用程式設計的學習熱潮,而過去幾年Python 語言在 codeeval.com的最夯程式語言中名列第一,毫無疑問Python已成為當今最熱門的程式語言。Python程式碼簡單好理解、有超豐富的函式庫可以運用,是非常適合商管領域初學者學習的程式語言。
將當今最熱門及最適合商管領域初學者學習的...
作者序
再版序
2019本書初版問世,2022虎年改版。二版的內容延續第一版,除了勘誤的修正之外,在程式實作方面也添加了R的部分。雖然R在解數學問題上,比不上Python和Matlab,但是,依然有它可取之處。至少就延伸資料科學的學習,從此是一個入門。
這次改版要謝謝國立臺灣師範大學管理學院企管系的同學們,這本書用於大一微積分和管理數學,很多用功的同學,有教的部分,題目做爛了,沒教的部分也做很多,因此回饋給我很多勘誤與教學建議,讓第二版修改了不少從學習者角度思考的寫法。同時,數學規劃和矩陣代數也增加了篇幅。學數學必須一再練習致熟能生巧,所以必須「Hands-on」,管理數學「Management Mathematics」,轉句廣告台詞:「M&M,只融你手,不融你口」。
何宗武
於臺師大管理學院 2022/1/20
初版序
過去20年,如果要處理資料都需要去圖書館拿年鑑或月報,然後用人工輸入。近來因為科技發展,讓數據的蒐集和使用愈來愈便捷,很多領域都開始面對大量數據躺在那邊。數字多的學科,須要瞭解資料探勘和數據分析的用途;用文字多的學門,則面臨文字分析和自然語言處理的學習。自己用不用沒關係,但是要能看的懂他人產生的報告。
坊間不缺管理數學的書,但是就內容編寫而言,會反應作者心中的核心學科。例如,有的側重微積分,有的側重作業研究(Operation Research)或數學規劃,有的甚至沒有足夠的矩陣代數篇幅。因此,以管理數學為經,本書設想的是以企業管理為主的學習架構,分四部分:微分和積分與矩陣代數和數學規劃。對於上學期可以講授3學分微積分,下學期可以講授矩陣代數和數學規劃。這是本書內容的第一個特色。
另外,目前商管學院和人文社會相關科系,幾乎都須要有一點程式概念,各校均增添程式教育課程。非資訊相關學門,程式學習入門最好能融入特定課程,而不要一開始就開一門獨立的程式語言課程。在這樣的背景之下,每一個部分結尾,納入循序漸進的Python章節,先把Python當成計算機,可以手算習題,然後用五六行的Python碼驗算。這樣一年課程下來,就會熟悉Python的運行邏輯。將Python融入課程,這是本書第二個特色。
然而,在四部分之後,本書依然續編了5-8部分的Python介紹,以供有興趣的同學在整門課結束後可以利用暑假繼續學習。每部分的Python學習手冊,可以使用Python於習題練習,確認答案,繪圖,以及符號運算。
本書完成,一要感謝臺灣師範大學提供優良的研究與教學環境,讓本人能專心工作;二要感謝五南出版社別具慧眼,在教科書市場競爭之下,願意出版這樣一本教科書。本書有任何疏漏與未竟之處,皆是本人的責任。
何宗武
於臺師大管理學院 2019/5/17
再版序
2019本書初版問世,2022虎年改版。二版的內容延續第一版,除了勘誤的修正之外,在程式實作方面也添加了R的部分。雖然R在解數學問題上,比不上Python和Matlab,但是,依然有它可取之處。至少就延伸資料科學的學習,從此是一個入門。
這次改版要謝謝國立臺灣師範大學管理學院企管系的同學們,這本書用於大一微積分和管理數學,很多用功的同學,有教的部分,題目做爛了,沒教的部分也做很多,因此回饋給我很多勘誤與教學建議,讓第二版修改了不少從學習者角度思考的寫法。同時,數學規劃和矩陣代數也增加了篇幅。學數學必須一再練習...
目錄
推薦序
再版序
初版序
管理數學原理
第 1 堂課 數學基礎
第 2 堂課 函數
Codes Part 1
微分
第 3 堂課 微分方法:單變數
第 4 堂課 微分方法:多變數函數之偏微分與全微分
第 5 堂課 微分的應用與邊際意義
Codes Part 2
積分
第 6 堂課 積分原理
第 7 堂課 積分方法:單變數
第 8 堂課 多變數重積分
第 9 堂課 積分應用
Codes Part 3
矩陣代數
第 10 堂課 矩陣代數基礎
第 11 堂課 矩陣的基本運算與應用
第 12 堂課 矩陣進一步性質與應用
Codes Part 4
數學規劃與管理決策
第 13 堂課 單變數函數的最佳化問題
第 14 堂課 雙變數函數的極值:無限制條件下的極值判斷問題
第 15 堂課 具限制條件的最佳化問題
第 16 堂課 選擇性主題
Codes Part 5
Python 附錄一
Python 附錄二
Python 附錄三
推薦序
再版序
初版序
管理數學原理
第 1 堂課 數學基礎
第 2 堂課 函數
Codes Part 1
微分
第 3 堂課 微分方法:單變數
第 4 堂課 微分方法:多變數函數之偏微分與全微分
第 5 堂課 微分的應用與邊際意義
Codes Part 2
積分
第 6 堂課 積分原理
第 7 堂課 積分方法:單變數
第 8 堂課 多變數重積分
第 9 堂課 積分應用
Codes Part 3
矩陣代數
第 10 堂課 矩陣代數基礎
第 11 堂課 矩陣的基本運算與應用
第 12 堂課 矩陣進一步性質與應用
Codes Part 4
數學規劃與管理決...