SciPy 是一個用于數學、科學和工程計算的 Python 庫,它建立在 NumPy 之上,提供了許多高效的算法和工具,用于解決各種科學計算問題。
CONTENT
- 1. 數值積分
- 功能
- 代碼
- 2. 優化問題求解
- 功能
- 代碼
- 3. 線性代數運算
- 功能
- 代碼
- 4. 信號處理
- 功能
- 代碼
- 5. 插值
- 功能
- 代碼
- 6. 統計分析
- 功能
- 代碼
1. 數值積分
功能
使用 scipy.integrate
模塊中的函數進行數值積分,例如計算定積分的值。
代碼
import numpy as np
from scipy.integrate import quad# 定義被積函數
def f(x):return x**2# 計算定積分,積分區間為 [0, 1]
result, error = quad(f, 0, 1)
print(f"積分結果: {result}")
print(f"估計誤差: {error}")
在這段代碼中,定義了一個被積函數 f(x) = x**2
,然后使用 quad
函數計算該函數在區間 [0, 1]
上的定積分,并輸出積分結果和估計誤差。
2. 優化問題求解
功能
scipy.optimize
模塊可用于求解各種優化問題,如尋找函數的最小值。
代碼
from scipy.optimize import minimize
import numpy as np# 定義目標函數
def rosen(x):return sum(100.0*(x[1:]-x[:-1]**2.0)**2.0 + (1 - x[:-1])**2.0)# 初始猜測值
x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])# 求解最小值
res = minimize(rosen, x0, method='nelder-mead',options={'xatol': 1e-8, 'disp': True})
print("最優解:", res.x)
此代碼定義了一個 Rosenbrock
函數作為目標函數,使用 minimize
函數以 Nelder - Mead
方法求解該函數的最小值,并輸出最優解。
3. 線性代數運算
功能
scipy.linalg
模塊提供了許多線性代數運算的功能,如矩陣求逆、特征值分解等。
代碼
import numpy as np
from scipy.linalg import inv, eig# 定義一個矩陣
A = np.array([[1, 2], [3, 4]])# 矩陣求逆
A_inv = inv(A)
print("矩陣的逆:")
print(A_inv)# 特征值分解
eigenvalues, eigenvectors = eig(A)
print("特征值:")
print(eigenvalues)
print("特征向量:")
print(eigenvectors)
代碼中定義了一個矩陣 A
,使用 inv
函數求矩陣的逆,使用 eig
函數進行特征值分解,并輸出結果。
4. 信號處理
功能
scipy.signal
模塊可用于信號處理,例如濾波操作。
代碼
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt# 生成一個包含噪聲的信號
t = np.linspace(0, 1, 1000, False)
sig = np.sin(2*np.pi*10*t) + np.sin(2*np.pi*20*t)
noise = 0.5 * np.random.randn(*sig.shape)
noisy_sig = sig + noise# 設計一個低通濾波器
b, a = signal.butter(3, 0.05)# 應用濾波器
filtered_sig = signal.lfilter(b, a, noisy_sig)# 繪制原始信號、含噪聲信號和濾波后的信號
plt.figure(figsize=(10, 6))
plt.subplot(3, 1, 1)
plt.plot(t, sig)
plt.title('Original Signal')
plt.subplot(3, 1, 2)
plt.plot(t, noisy_sig)
plt.title('Noisy Signal')
plt.subplot(3, 1, 3)
plt.plot(t, filtered_sig)
plt.title('Filtered Signal')
plt.tight_layout()
plt.show()
該代碼生成了一個包含噪聲的信號,使用 signal.butter
函數設計了一個低通濾波器,然后使用 signal.lfilter
函數對信號進行濾波操作,并繪制了原始信號、含噪聲信號和濾波后的信號。
5. 插值
功能
scipy.interpolate
模塊可用于數據插值,例如一維插值。
代碼
import numpy as np
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt# 原始數據點
x = np.array([0, 1, 2, 3, 4])
y = np.array([0, 2, 1, 3, 2])# 創建插值函數
f = interp1d(x, y, kind='cubic')# 生成更多的插值點
x_new = np.linspace(0, 4, 100)
y_new = f(x_new)# 繪制原始數據點和插值結果
plt.plot(x, y, 'o', label='Original data')
plt.plot(x_new, y_new, '-', label='Interpolated data')
plt.legend()
plt.show()
代碼中定義了一些原始數據點,使用 interp1d
函數創建了一個三次插值函數,然后生成更多的插值點并繪制原始數據點和插值結果。
6. 統計分析
功能
scipy.stats
模塊提供了豐富的統計分布和統計檢驗功能,例如計算正態分布的概率密度函數值。
代碼
from scipy.stats import norm
import numpy as np
import matplotlib.pyplot as plt# 定義正態分布的參數
mu = 0
sigma = 1# 生成 x 值
x = np.linspace(-5, 5, 100)# 計算正態分布的概率密度函數值
pdf = norm.pdf(x, mu, sigma)# 繪制概率密度函數曲線
plt.plot(x, pdf)
plt.title('Normal Distribution PDF')
plt.xlabel('x')
plt.ylabel('Probability Density')
plt.show()
此代碼定義了一個正態分布的參數,使用 norm.pdf
函數計算該正態分布在一系列 x
值上的概率密度函數值,并繪制概率密度函數曲線。