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