SciPy是一款方便、易於使用、專爲科學和工程設計的python工具包,它包括了統計、優化、整合以及線性代數模塊、傅里葉變換、信號和圖像圖例,常微分方差的求解等
使用前安裝該模塊:使用pycharm可以進入 Settings-> Project ->Project Interpreter -> 點擊右側,綠色加號
在出來的搜索框輸入Scipy -> 點擊下面的Install Package 等待提示安裝成功即可。
積分:
from pylab import *
from scipy.integrate import quad, dblquad, nquad
# 計算積分 定義一個函數 範圍從0到無窮大
print("積分", quad(lambda x: np.exp(-x), 0, np.inf)) # 關於x的函數 函數爲 np.exp(-x) 下界0 上界無窮大
# 計算二元積分
# 方式一
area = dblquad(lambda x, y: x * y, 0, 0.5, lambda x: 0, lambda x: 1 - 2 * x)
print("二元積分面積", area) # 關於x,y的函數 被積函數爲x*y x下界0 x上界0.5 y的下界0 y的上界 1-2y
# 方式二:
def f(x, y): # 定義函數
return x * y
def bound_y(): # y的上下界
return [0, 0.5]
def bound_x(y): # x的上下界
return [0, 1 - 2 * y]
print("二元積分面積", nquad(f, [bound_x, bound_y])) # 指定函數 指定x,y的上下界
# optimizer 優化器
from scipy.optimize import minimize
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={"xtol": 1e-8, "disp": True})
# print("ROSE MINT:", res.x) #不展示過程
print("ROSE MINT:", res) # 展示過程
小結:
- quad(lambda x:函數,下界,上界) 求積分
- dbquad(lambda x,y:函數,下界,上界,lambda x:y的下界,lambda x:y的上界) 求二元積分 方式一
- nquad(函數,[x上下界,y的上下界]) 求二元積分 方式二
- minimize(待優化函數,數組,method="nelder-mead",options={"xtol":1e-8,"disp":True})
插值:
# interpolation 插值
from scipy.interpolate import interp1d # 注意是1,2,3,的1 不是l,m,n,的l
import matplotlib.pyplot as plt
# 圖1
x = np.linspace(0, 10, num=11, endpoint=True) # 0-10之間 11個點
y = np.cos(-x ** 2 / 9.0) # 函數
f = interp1d(x, y)
f2 = interp1d(x, y, kind='cubic') # 'zero', 'slinear', 'quadratic', 'cubic' 分別是:階梯插值 線性插值 二階曲線插值 三階曲線插值
xnew = np.linspace(0, 10, num=41, endpoint=True) # 0-10之間 41個點 最後一個點存在
plt.plot(x, y, 'o', xnew, f(xnew), '-', xnew, f2(xnew), '--') # o表示圓點 -表示實線 --表示虛線
plt.legend(['data', 'linear', 'cubic'], loc='best') # 圖釋
plt.show() # 展示
# 圖2
x = np.linspace(0, 1, 10) # 產生0-1之間10個數
y = np.sin(2 * np.pi * x) # 指定函數
li = interp1d(x, y, kind="cubic") # 定義一個三階函數曲線插值
x_new = np.linspace(0, 1, 50) # 定義0-1 50個數
y_new = li(x_new) # 獲取結果
figure() # 畫出來
plot(x, y, "r") # 用紅色表示原數據
plot(x_new, y_new, "k") # 用黑色表示新數據
show()
print(y_new)
小結:
- np.linspace(0,10,num=11,endpoint=True) 1-10之間,共11個點,最後一個點
- np.cos() 指定函數
- interp1d(x,y,kind="cubic") 三階曲線插值 類型有:zero,slinear,quadratic,cubic 分別是階梯插值,線性插值,二階曲線插值,三階曲線插值
- plt.plot(x,y,'o',xnew,f(xnew),'-',xnew,f2(xnew),'--') 'o'表示圓點,'-'表示實線,'--'表示虛線 指定劃線樣式
- plt.plot(x,y,'r') 表示用紅色線 。'r' 表示紅色 'k' 表示黑色
- plt.legend(['data','linear','cubic'],loc='best') 圖示
- plt.show() 展示
圖片效果:
圖1:
圖2:
傅里葉變換:
from scipy.fftpack import fft
import matplotlib.pyplot as plt
# Number of sample points
N = 600
# sample spacing
T = 1.0 / 800.0
x = np.linspace(0.0, N * T, N)
y = np.sin(50.0 * 2.0 * np.pi * x) + 0.5 * np.sin(80.0 * 2.0 * np.pi * x)
yf = fft(y)
xf = np.linspace(0.0, 1.0 / (2.0 * T), N // 2)
plt.plot(xf, 2.0 / N * np.abs(yf[0:N // 2]))
plt.grid()
plt.show()
圖片效果:
線性代數:
from scipy import linalg as lg
arr = np.array([[1, 2], [3, 4]])
# 1 2
# 3 4
print("Det:", lg.det(arr)) # 計算行列式
print("Inv:", lg.inv(arr)) # 求逆矩陣
b = np.array([6, 14])
print("Sol:", lg.solve(arr, b)) # 求解線性方程組
print("Eig:", lg.eig(arr)) # 求特徵值 特徵向量
print("LU:", lg.lu(arr)) # 矩陣分解
print("QR:", lg.qr(arr)) # 矩陣分解
print("SVD:", lg.svd(arr)) # 矩陣分解
print("Schur:", lg.schur(arr)) # 矩陣分解
小結:linalg as lg
- lg.det(arr) 計算行列式
- lg.inv(arr) 求逆矩陣
- lg.solve(arr1,arr2) 求解線性方程組
- lg.eig(arr) 求特徵值 特徵向量
- lg.lu(arr) 矩陣分解
- lg.qr(arr) 矩陣分解
- lg.svd(arr) 矩陣分解
- lg.schur(arr) 矩陣分解