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) 矩阵分解