SciPy科学计算核心是优化、积分、信号处理三模块协同:用optimize拟合含积分约束模型,signal滤波降噪后integrate数值积分,signal与integrate联合做脉冲响应辨识。
Python 中用 SciPy 做科学计算,核心在于把数学问题映射到合适的模块:优化用 scipy.optimize,积分用 scipy.integrate,信号处理用 scipy.signal。三者常组合使用——比如拟合带积分约束的模型、对含噪声信号先滤波再数值积分、或用优化反推信号参数。下面通过一个连贯案例串起这三类操作。
假设某物理过程输出信号形式为 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 参数系统辨识中,常通过输入脉冲激励和输出响应反推系统特性。例如已知输入 u(t) 是单位矩形脉冲,输出 y(t) 是实测曲线,想验证是否符合一阶惯性环节:
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' 模式会延长输出长度,做模型匹配时注意截取有效段options={'x_scale': [...]} 或标准化变量