PythonSciPy科学计算项目教程_优化积分信号处理案例

16次阅读

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

PythonSciPy科学计算项目教程_优化积分信号处理案例

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,若被积函数震荡剧烈,需调小 epsabsepsrel
  • trapezoid 对非均匀网格敏感,务必确认 time 数组严格单调递增
  • signal.convolve 默认 ‘full’ 模式会延长输出长度,做模型匹配时注意截取有效段
  • 优化时参数量纲差异大(如 A=1e3,τ=1e-6),务必用 options={'x_scale': [...]} 或标准化变量
text=ZqhQzanResources