Scipy的簡單使用

SciPy是一款方便、易於使用、專爲科學和工程設計的python工具包,它包括了統計、優化、整合以及線性代數模塊、傅里葉變換、信號和圖像圖例,常微分方差的求解等

官方:https://www.scipy.org/


使用前安裝該模塊:使用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) 矩陣分解

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章