如何在scipy中集成numpy数组?

3 投票
3 回答
4873 浏览
提问于 2025-04-16 06:38

我有一个计算起来比较复杂的函数,这个函数接收一个单一的数字(标量),然后返回一个numpy.array()对象。当我尝试用scipy.integrate.romberg来对这个函数进行积分时,出现了一个来自scipy内部的错误,这个错误是因为它用来判断是否收敛的条件出了问题。

Traceback (most recent call last):
  File "wqc.py", line 148, in <module>
    H_cycle = (m.pi / wt) * scipy.integrate.romberg(H_if, 0, m.pi / wt)
  File "/usr/lib/python2.6/site-packages/scipy/integrate/quadrature.py", line 471, in romberg
    while (abs(result - lastresult) > tol) and (i <= divmax):
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

有没有办法一次性对整个数组进行积分,还是说我必须一个元素一个元素地积分?我希望能避免第二种方法,因为计算数组中的单个元素并不简单。

3 个回答

-2

http://www.sagemath.org 这个网站可能提供一些不同的数值积分方法。

0

你想做的事情在数学上有点模糊。这个积分程序不知道你是想同时对几个标量函数进行积分(我理解你是这个意思),还是想做一些更复杂的事情,比如这些:http://en.wikipedia.org/wiki/Vector_calculus#Theorems

我会这样做:先把这个计算量大的函数列成表,然后用插值的方法(可以用scipy.interp1d或者UnivariateSpline)来处理这些数据,再进行积分。

2

问题出现在这里:

abs(result - lastresult) > tol

resultlastresult 可能是 numpy 数组(而不是单个值)。所以上面的整个表达式实际上是在计算一个包含真假值的 数组,而不是单个的 TrueFalse。因此,当你把上面的表达式的结果和 (i <= divmax)and 连接起来时,就会出现错误 数组中有多个元素的真假值是模糊的。 这个 ValueError 提出的建议是正确的。你应该把真假值的数组转换成一个单一的真假值。

example = numpy.array([True, True, True, False])
example.any()
>>> True
example.all()
>>> False

这样就能解决问题。

撰写回答