更新於 2024/06/01閱讀時間約 6 分鐘

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

直觀理解

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

應用

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

程式範例

使用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

單變數函數及其導數的圖

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

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

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

等高線圖: 等高線圖顯示了函數 ( 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 的等高線和偏導數的向量場。等高線展示了函數值的分佈,向量場展示了每一點的變化率方向和大小。

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

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.