python之scipy库详解

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