Scipy是一个用于数学、科学、工程领域的常用软件包,可以处理插值、积分、优化、图像处理、常微分方程数值解的求解、信号处理等问题。它用于有效计算Numpy矩阵,使Numpy和Scipy协同工作,高效解决问题。
Scipy 由不同科学计算领域的子模块组成:
子模块
描述
cluster
聚类算法
constants
物理数学常数
fftpack
快速傅里叶变换
integrate
积分和常微分方程求解
interpolate
插值
io
输入输出
linalg
线性代数
odr
正交距离回归
optimize
优化和求根
signal
信号处理
sparse
稀疏矩阵
spatial
空间数据结构和算法
special
特殊方程
stats
统计分布和函数
weave
C/C++ 积分
在使用 Scipy 之前,为了方便,假定这些基础的模块已经被导入:
import numpy as np
import scipy as sp
import matplotlib as mpl
import matplotlib.pyplot as plt
由于 Scipy 以 Numpy 为基础,因此很多基础的 Numpy 函数可以在scipy 命名空间中直接调用
1.插值
样条插值法是一种以可变样条来作出一条经过一系列点的光滑曲线的数学方法
from scipy.interpolate import interp1d
np.set_printoptions(precision=2, suppress=True) #设置 Numpy 浮点数显示格式
#从文本中读入数据
data = np.genfromtxt("JANAF_CH4.txt",
delimiter="\t", # TAB 分隔
skiprows=1, # 忽略首行
names=True, # 读入属性
missing_values="INFINITE", # 缺失值
filling_values=np.inf) # 填充缺失值
ch4_cp = interp1d(data['TK'], data['Cp']) #默认情况下,输入值要在插值允许的范围内,否则插值会报错
我们可以通过 kind 参数来调节使用的插值方法,来得到不同的结果:
nearest 最近邻插值
zero 0阶插值
linear 线性插值
quadratic 二次插值
cubic 三次插值
4,5,6,7 更高阶插值
对于径向基函数,其插值的公式为:
通过数据点 xj来计算出 nj 的值,来计算 x处的插值结果
from scipy.interpolate.rbf import Rbf
cp_rbf = Rbf(data['TK'], data['Cp'], function = "multiquadric")
plt.plot(data['TK'], data['Cp'], 'k+')
p = plt.plot(data['TK'], cp_rbf(data['TK']), 'r-')
高维 RBF 插值:
from mpl_toolkits.mplot3d import Axes3D
x, y = np.mgrid[-np.pi/2:np.pi/2:5j, -np.pi/2:np.pi/2:5j]
z = np.cos(n