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()
總結:這張圖表明了f(x) = x^2的變化率如何隨 x 的變化而變化。橙色的直線顯示了每一點的變化率,反映了拋物線的斜率變化。
等高線圖: 等高線圖顯示了函數 ( g(x, y) = x^2 + y^2 ) 的等值線。每條等值線表示函數在該線上的值是相同的。這些線的形狀和分佈可以幫助我們了解函數在不同區域的變化情況。
向量場: 向量場圖顯示了函數的偏導數。每個向量的方向和長度表示函數在該點的變化方向和速率。
總結:這張圖表明了 g(x,y)= x^2 + y^2的值如何隨 x和 y 的變化而變化。同心圓顯示了函數值相同的點,而向量場顯示了每一點的變化率方向和大小。
通過這些圖表,我們可以直觀地理解函數在不同點的行為和變化率。