[Python]導數與偏導數(學習心得)

閱讀時間約 6 分鐘

直觀理解

  • 導數:考慮的是單一變數的函數,描述的是函數在某點的斜率或變化率
  • 偏導數:考慮的是多變數函數,描述的是函數在某個變數變化時的變化率,其他變數保持不變。  (針對各維度的調整 或者稱變化 你要調多少)

應用

  • 導數:在物理學中應用廣泛,例如描述速度和加速度
  • 偏導數:多變量分析、優化問題和機器學習中經常出現,用來計算梯度,以便進行模型訓練和參數調整。

程式範例

使用SymPy求導數和偏導數並繪圖

  • 定義符號變數 x 和 y。
  • 定義函數 f = x^2 和 g = x^2 + y^2。
  • 使用 sp.diff 計算導數 f'(x) 和偏導數 ∂g/∂x, ∂g/∂y。
  • 使用 sp.lambdify 將SymPy函數轉換為數值計算函數。

數值計算:

  • 使用 numpy.linspace 生成 x 軸上的數值點。
  • 計算函數和導數在這些點上的值。

繪圖:

  • 使用 matplotlib.pyplot 繪製函數及其導數的圖。
  • 繪製等高線圖表示多變數函數,並使用 quiver 繪製偏導數的向量場。
import sympy as sp
import numpy as np
import matplotlib.pyplot as plt

# 定義變數
x, y = sp.symbols('x y')

# 定義函數
f = x**2
g = x**2 + y**2

# 求導數
f_prime = sp.diff(f, x)

# 求偏導數
g_prime_x = sp.diff(g, x)
g_prime_y = sp.diff(g, y)

# 打印結果
print("f'(x) =", f_prime)
print("∂g/∂x =", g_prime_x)
print("∂g/∂y =", g_prime_y)

# 將SymPy函數轉換為可用於數值計算的函數
# lambdify 將符號表達式轉換為可以用於數值計算的函數
f_num = sp.lambdify(x, f, 'numpy') # 將 f(x) = x^2 轉換為數值函數
f_prime_num = sp.lambdify(x, f_prime, 'numpy') # 將 f'(x) = 2x 轉換為數值函數
g_num = sp.lambdify((x, y), g, 'numpy') # 將 g(x, y) = x^2 + y^2 轉換為數值函數
g_prime_x_num = sp.lambdify((x, y), g_prime_x, 'numpy') # 將 ∂g/∂x = 2x 轉換為數值函數
g_prime_y_num = sp.lambdify((x, y), g_prime_y, 'numpy') # 將 ∂g/∂y = 2y 轉換為數值函數

# 計算範例點的值
x_vals = np.linspace(-10, 10, 100) # 生成從 -10 到 10 的 100 個點
# 計算 f(x) 和 f'(x) 在這些點上的值
y_vals = f_num(x_vals) # 計算 f(x) = x^2 的值
dy_dx_vals = f_prime_num(x_vals) # 計算 f'(x) = 2x 的值

# 計算範例點的偏導數
X_vals, Y_vals = np.meshgrid(x_vals, x_vals) # 生成 x 和 y 的網格點
# 計算 g(x, y) 及其偏導數在這些網格點上的值
Z_vals = g_num(X_vals, Y_vals) # 計算 g(x, y) = x^2 + y^2 的值
dz_dx_vals = g_prime_x_num(X_vals, Y_vals) # 計算 ∂g/∂x = 2x 的值
dz_dy_vals = g_prime_y_num(X_vals, Y_vals) # 計算 ∂g/∂y = 2y 的值

# 繪製單變數函數及其導數
plt.figure(figsize=(12, 6))
plt.plot(x_vals, y_vals, label='f(x) = x^2')
plt.plot(x_vals, dy_dx_vals, label="f'(x)")
plt.xlabel('x')
plt.ylabel('y')
plt.title('f(x) and f\'(x)')
plt.legend()

# 繪製多變數函數及其偏導數
plt.figure(figsize=(12, 6))
plt.contour(X_vals, Y_vals, Z_vals, levels=20)
plt.quiver(X_vals, Y_vals, dz_dx_vals, dz_dy_vals)
plt.xlabel('x')
plt.ylabel('y')
plt.title('g(x, y) = x^2 + y^2 and its partial derivatives')
plt.show()
raw-image

單變數函數及其導數的圖

raw-image
  1. 藍色曲線:這條曲線是一條開口向上的拋物線。當 x 增大時, f(x) 也會快速增大。
  2. 橙色曲線:代表了 f(x) 在每一點的變化率(也就是斜率)。當 x 增大時, f′(x)也隨之增大;當 x減小時, f′(x)也減小。

總結:這張圖表明了f(x) = x^2的變化率如何隨 x 的變化而變化。橙色的直線顯示了每一點的變化率,反映了拋物線的斜率變化。

多變數函數及其偏導數的圖

raw-image

等高線圖: 等高線圖顯示了函數 ( g(x, y) = x^2 + y^2 ) 的等值線。每條等值線表示函數在該線上的值是相同的。這些線的形狀和分佈可以幫助我們了解函數在不同區域的變化情況。

向量場: 向量場圖顯示了函數的偏導數。每個向量的方向和長度表示函數在該點的變化方向和速率。

總結:這張圖表明了 g(x,y)= x^2 + y^2的值如何隨 x和 y 的變化而變化。同心圓顯示了函數值相同的點,而向量場顯示了每一點的變化率方向和大小。


總結

  • 單變數函數圖:顯示了函數 f(x) = x^2和其導數 f′(x)=2x的變化關係。導數曲線展示了每一點的變化率。
  • 多變數函數圖:顯示了函數 g(x,y)=x^2 + y^2 的等高線和偏導數的向量場。等高線展示了函數值的分佈,向量場展示了每一點的變化率方向和大小。

通過這些圖表,我們可以直觀地理解函數在不同點的行為和變化率。

52會員
109內容數
Python程式設計師,不是在學習就是在學習的路上
留言0
查看全部
發表第一個留言支持創作者!
螃蟹_crab的沙龍 的其他內容
28歲才又重新讀大學(回顧文)
閱讀時間約 2 分鐘
[螃蟹雜食記]食主題[豆腐]篇
閱讀時間約 4 分鐘
運算思維
閱讀時間約 4 分鐘
你可能也想看
Python入門-Day8:物件導向本文介紹了Python中的物件導向程式設計的重要概念,包括類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射。每個概念都有對應的程式碼範例來說明其用法和功能。這些概念對於理解和使用Python進行物件導向程式設計至關重要。
Thumbnail
avatar
浴火重生的雞
2024-05-15
Python中的函式操作們(上)今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
avatar
媗日
2024-04-25
Python四大容器大解析古有四大名著,現今Python四大容器🤣 哪四個?list串列,tuple元組,dict字典,set集合。 那這四個怎麼分? 一起來看看吧! (以下有手寫與上機實際測試請付費觀看) 以上我精心整理主要會使用到的功能 當然python功能太多了,肯定不只。 實際操作: 大概就這樣?(
Thumbnail
avatar
媗日
2024-04-06
【Python】Mac平台上的Jython和JES安裝指導先來名詞解釋jython跟JES: jython是一種實現了Python語言的Java平台版本的解釋器。它允許開發人員在Java虛擬機(JVM)上運行Python代碼,從而實現了Python語言與Java平台的無縫集成。 JES(Jython Environment for Students)是
Thumbnail
avatar
W. C. Chen
2024-03-27
Python 程式札記 : 物件導向的基本概念物件導向(OOP),不僅提供了更結構化的程式碼組織方式,還有助於提高程式碼的可讀性、可重用性和可維護性。本文將介紹物件導向概念中的類別、對象、繼承、封裝和多型,並透過具體範例來展示這些概念如何在實際編程中應用。
Thumbnail
avatar
梧笙
2023-12-06
【💊 Python的解憂錦囊】typing模組 - 自由彈性之下帶點引導的TypedDict 我們在使用Python語言進行軟體開發時, 常常會需要dict這個資料結構來儲存複雜結構的資料, 就如同JSON一般, 我們會具有這樣的Key/Value模式組成的資料結構, 如下圖: 而當我們在Python的世界裡, 除了嚴謹規範資料欄位的@dataclass之外, 更常使用的就是「di
Thumbnail
avatar
阿Han
2023-12-05
不間斷 Python 挑戰 Day 23 - 物件導向程式設計:繼承 (Inheritance)「繼承」顧名思義就是有一個或多個類別延續了某個類別的特性,就如同在人類社會裡,兒女接收了父母的財產、承襲了上代的技能、延續了前一輩的事業。在Python的語言裡,能夠繼承的特性為類別的屬性與方法,繼承的類別稱為子類別(child class / subclass)或衍伸類別(derived clas
Thumbnail
avatar
Wei-Jie Weng
2022-01-29
不間斷 Python 挑戰 Day 22 - 物件導向程式設計:封裝 (Encapsulation)在類別一節中,我們可以用Student類別的實體來存取類別中的name變數、score字典、以及其中的所有方法,這些可以被類別以外的程式碼所直接存取的屬性稱為公有屬性(public attribute)、可以被類別以外的程式碼所直接呼叫的方法稱為公有方法(public method)。
Thumbnail
avatar
Wei-Jie Weng
2022-01-22
不間斷 Python 挑戰 Day 19 - 物件導向程式設計:類別 到目前為止,我們所學習的都是程序性的程式設計(procedural programming),也就是程式碼是透過一連串的指令組成的程序或函數,由上而下依序執行不同的程序或是呼叫函數來完成程式的功能。 Python其實是一種物件導向的程式(object oriented programming, 簡稱
Thumbnail
avatar
Wei-Jie Weng
2022-01-06
程式概念 - python物件導向物件導向的概念,以python程式為範例。
Thumbnail
avatar
薰魚
2021-09-12