SciPy科学计算核心是优化、积分、信号处理三模块协同:用optimize拟合含积分约束模型,signal滤波降噪后integrate数值积分,signal与integrate联合做脉冲响应辨识。

Python 中用 SciPy 做科学计算,核心在于把数学问题映射到合适的模块:优化用 scipy.optimize,积分用 scipy.integrate,信号处理用 scipy.signal。三者常组合使用——比如拟合带积分约束的模型、对含噪声信号先滤波再数值积分、或用优化反推信号参数。下面通过一个连贯案例串起这三类操作。
用 optimize 拟合含积分约束的衰减模型
假设某物理过程输出信号形式为 f(t) = A·exp(−t/τ) + B,但实验只能测得其在区间 [0, T] 上的积分值(如总能量),而非点测量。此时直接拟合 f(t) 不可行,需将积分结果作为目标函数的一部分。
- 先用
scipy.integrate.quad计算理论积分:int_f = quad(lambda t: A*np.exp(-t/tau) + B, 0, T)[0] - 定义损失函数:实际积分值与模型积分值之差的平方
- 调用
scipy.optimize.minimize(推荐 'L-BFGS-B' 或 'trust-constr')求解 (A, τ, B),并给 τ 加正约束
对实测信号做积分前的预处理
真实传感器数据常含高频噪声,直接数值积分会放大误差。应先滤波再积分:
- 用
scipy.signal.butter设计低通巴特沃斯滤波器(如截止频率设为采样率的 1/5) - 用
scipy.signal.filtfilt零相位滤波,避免时延失真 - 对滤波后信号用
scipy.integrate.trapezoid(推荐)或simplify做离散积分;若时间非等距,传入x=times参数
用 signal + integrate 联合分析脉冲响应
系统辨识中,常通过输入脉冲激励和输出响应反推系统特性。例如已知输入 u(t) 是单位矩形脉冲,输出 y(t) 是实测曲线,想验证是否符合一阶惯性环节:
立即学习“Python免费学习笔记(深入)”;
- 构造理论脉冲响应 h(t) = (1/τ)·exp(−t/τ),卷积 u(t) 得理论输出 y_th = convolve(u, h, method='direct')
- 用
scipy.integrate.cumulative_trapezoid对 y_th 和 y 实际做累积积分,比对面积一致性 - 若差异大,可将 τ 作为变量,用
optimize.least_squares最小化 y_th 与 y 的 L2 距离
关键细节提醒
这些操作容易出错的地方集中在边界与精度:
-
quad默认精度是 1.49e-8,若被积函数震荡剧烈,需调小epsabs或epsrel -
trapezoid对非均匀网格敏感,务必确认 time 数组严格单调递增 -
signal.convolve默认 'full' 模式会延长输出长度,做模型匹配时注意截取有效段 - 优化时参数量纲差异大(如 A=1e3,τ=1e-6),务必用
options={'x_scale': [...]}或标准化变量










