如何用Scipy计算无解析表达式的观测数据乘积积分?
没问题,咱们一步步来解决你的问题:
首先,Scipy完全可以实现这个数值积分需求,scipy.integrate.simps确实是合适的方法——它基于辛普森法则,专门用来处理离散观测数据的积分,尤其是当你的x坐标是等距(或近似等距)的时候,效果很好。
不过你代码里的调用方式都不对,得先搞清楚simps的参数逻辑:
- 第一个参数必须是被积函数在每个x点的取值,也就是你要积分的
a·b·c本身,所以得先把三个数组对应元素相乘得到y = a * b * c - 第二个参数是对应的x坐标数组(比如你定义的
x),如果x是等距的,也可以不传x,直接用dx参数指定步长(就是x[1]-x[0])
你之前的写法比如simps(a * b, c, dx),是把c当成了积分的x坐标,这完全偏离了你的需求——你的积分变量是x,c是被积函数的一部分,不是坐标。
下面是修正后的代码示例:
import numpy as np from scipy.integrate import simps # 生成模拟观测数据 a = np.random.random(10) b = np.random.uniform(0, 10, 10) c = np.random.normal(2, .8, 10) x = np.linspace(0, 1, 10) dx = x[1] - x[0] # 计算被积函数:每个x点对应的a·b·c值 y = a * b * c # 两种等价的积分计算方式 integral1 = simps(y, x) integral2 = simps(y, dx=dx) print(f"∫a·b·c dx的积分结果是:{integral1}(用x数组计算),{integral2}(用dx步长计算)")
补充几个细节:
- 因为你的x是等距的(
linspace生成的),所以两种计算方式的结果几乎一致(浮点误差可以忽略) - 如果你的x不是等距的,必须传入
x参数,不能用dx;如果数据点数量是偶数,simps的even参数可以控制处理方式(默认是'avg',取两种分段方式的平均)
总结一下核心步骤:
- 将三个观测数组对应元素相乘,得到被积函数的离散取值数组
- 用
simps传入这个数组和对应的x坐标(或等距步长),就能得到积分结果
内容的提问来源于stack exchange,提问作者kilojoules
相关产品推荐
相关产品推荐

