在继续学习SciPy之前,您需要对下面的知识有基本的了解:
Python
NumPy
SciPy是世界上著名的Python开源科学计算库,建立在NumPy之上。它增加的功能包括数值积分、最优化、统计和一些专用函数。 SciPy函数库在NumPy库的基础上增加了众多的数学、科学以及工程计算中常用的库函数。例如线性代数、常微分方程数值求解、信号处理、图像处理、稀疏矩阵等等。
SciPy 官网:https://www.scipy.org/
SciPy中文文档 https://www.osgeo.cn/scipy/
在正常情况下,使用pip安装SciPy时不需要你手动先安装NumPy,因为pip会自动为你安装所需的依赖库。
在Windows平台上安装scipy,可在cmd命令行中,输入如下命令:
pip3 install scipy
回车,默认情况使用国外线路较慢,我们可以使用国内的镜像网站:
豆瓣:https://pypi.doubanio.com/simple/
清华:https://pypi.tuna.tsinghua.edu.cn/simple
例如使用清华的镜像
pip3 install scipy -i https://pypi.tuna.tsinghua.edu.cn/simple
电脑上安装了多个Python版本,你可以为特定版本的Python安装模块(库、包)。例如我的电脑中安装了多个Python版本,要在Python 3.10版本中安装,并使用清华的镜像,cmd命令行中,输入如下命令
py -3.10 -m pip install scipy -i https://pypi.tuna.tsinghua.edu.cn/simple
回车即可。
安装成功后,就可以使用了。
以下是一个仅使用SciPy库进行数值积分的示例:
from scipy import integrate
# 定义被积函数
def f(x):
return x**2
# 进行数值积分
result, error = integrate.quad(f, 0, 1)
# 输出积分结果
print("积分结果:", result)
print("误差估计:", error)
输出效果:
在这个示例中,我们定义了被积函数f(x) = x^2,然后使用SciPy的quad函数进行数值积分。最后,我们输出了积分结果和误差估计。
SciPy 基本简明教程 https://cankaoshouce.com/scipy/scipy-course.html
下面给出一个数据拟合示例:
曲线拟合的应用在生活中随处可见,不知道大家是否还记得物理实验中的自由落体运动中下降高度与时间关系之间的探究,在初速度为0的情况下,我们想要探究下降高度与时间的关系。
我们当时采用的方法是通过设置不同的下降时间来记录下降的高度,测量记录多组数据之后,再利用二维坐标系将记录的点绘制到坐标系当中去,然后保证绘制的曲线到这些点的距离之和最小,最终得到的曲线就是h与t的关系:
为了探究下降高度与时间的关系,我们可以首先模拟一些数据,然后使用 SciPy 库中的 curve_fit 函数来拟合这些数据。这里,我们将模拟一些带有随机误差的自由落体运动数据,然后用曲线拟合的方法来估计重力加速度 (g)。
源码如下:
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
# 1、模拟自由落体运动数据
# 设置真实的重力加速度
g_real = 9.8 # m/s^2
# 模拟一些时间数据(例如,从 0 到 2 秒,共 20 个数据点)
t = np.linspace(0, 2, 20)
# 根据自由落体运动公式计算高度,同时添加一些随机噪声来模拟实际测量中的误差
h = 0.5 * g_real * t**2 + np.random.normal(0, 0.2, t.size)
# 2、曲线拟合
# 定义模型函数 h(t) = 0.5 * g * t^2
def model(t, g):
return 0.5 * g * t**2
# 使用 curve_fit 进行拟合,得到重力加速度的估计值
params, covariance = curve_fit(model, t, h)
# 打印拟合得到的重力加速度
print(f"Estimated g: {params[0]:.2f} m/s^2")
# 绘制实际数据点和拟合曲线
plt.scatter(t, h, label='Measured Data')
plt.plot(t, model(t, params[0]), label='Fitted Curve', color='red')
plt.xlabel('Time (s)')
plt.ylabel('Height (m)')
plt.title('Free Fall Motion: Height vs. Time')
plt.legend()
plt.show()
运行效果: