我有一个函数,它接受标量值作为输入,然后输出一个矩阵(下面是一个大小为2x2的MRE,我的实际函数具有特定于问题的矩阵维度,比如100x100).我想在一定范围内对上述函数进行积分.

import numpy as np
from scipy.integrate import quad

def func(x):
    return np.array([[np.cos(x), np.sin(x)], [np.sin(x), np.cos(x)]])

quad(func, 0, np.pi)

这会给我带来以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/scipy/integrate/_quadpack_py.py", line 465, in quad
    retval = _quad(func, a, b, args, full_output, epsabs, epsrel, limit,
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/scipy/integrate/_quadpack_py.py", line 577, in _quad
    return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: only size-1 arrays can be converted to Python scalars

我想避免循环遍历每个单独的函数,所以我向量化了集成操作,希望它能适应这样的函数:

grid_quad = np.vectorize(quad)
grid_quad(func, 0, np.pi)

我仍然收到相同的错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/numpy/lib/function_base.py", line 2329, in __call__
    return self._vectorize_call(func=func, args=vargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/numpy/lib/function_base.py", line 2407, in _vectorize_call
    ufunc, otypes = self._get_ufunc_and_otypes(func=func, args=args)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/numpy/lib/function_base.py", line 2367, in _get_ufunc_and_otypes
    outputs = func(*inputs)
              ^^^^^^^^^^^^^
  File "/scipy/integrate/_quadpack_py.py", line 465, in quad
    retval = _quad(func, a, b, args, full_output, epsabs, epsrel, limit,
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/scipy/integrate/_quadpack_py.py", line 577, in _quad
    return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: only size-1 arrays can be converted to Python scalars

当我显式地将被积函数写出为数组数组时,此方法起作用

efunc = [[np.cos, np.sin],[np.sin, np.cos]]
grid_quad(efunc, 0, np.pi)

并给出了预期yields

(array([[4.92255263e-17, 2.00000000e+00],
       [2.00000000e+00, 4.92255263e-17]]), array([[2.21022394e-14, 2.22044605e-14],
       [2.22044605e-14, 2.21022394e-14]]))

它是包含通过对与每个矩阵位置相关联的"函数"进行积分而获得的值的矩阵.

在纸和笔方面,我有一个矩阵,它的条目是依赖于变量的函数.我想要在一个区间上对这些函数中的每一个进行积分,并接收一个确定的积分值的矩阵作为输出.

有没有一种"(Num)Python 式"的方法来实现这一点?

推荐答案

试一试scipy.integrate.quad_vec.

import numpy as np
from scipy.integrate import quad_vec

def func(x):
    return np.array([[np.cos(x), np.sin(x)], [np.sin(x), np.cos(x)]])

quad_vec(func, 0, np.pi)
# (array([[2.22044605e-16, 2.00000000e+00],
#         [2.00000000e+00, 2.22044605e-16]]),
#  1.3312465980656846e-13)

第一个输出是您的结果,第二个是误差估计.

Python相关问答推荐

如何记录脚本输出

如何在Django基于类的视图中有效地使用UTE和RST HTIP方法?

海上重叠直方图

将输入聚合到统一词典中

为什么Django管理页面和我的页面的其他CSS文件和图片都找不到?'

Maya Python脚本将纹理应用于所有对象,而不是选定对象

如何使用使用来自其他列的值的公式更新一个rabrame列?

在代码执行后关闭ChromeDriver窗口

当条件满足时停止ODE集成?

polars:有效的方法来应用函数过滤列的字符串

处理Gekko的非最优解

在Python中控制列表中的数据步长

如何从比较函数生成ngroup?

数据框,如果值在范围内,则获取范围和

如何重新组织我的Pandas DataFrame,使列名成为列值?

在我融化极点数据帧之后,我如何在不添加索引的情况下将其旋转回其原始形式?

如何获得满足掩码条件的第一行的索引?

如果不使用. to_list()[0],我如何从一个pandas DataFrame中获取一个值?

Matplotlib中的曲线箭头样式

时长超过24小时如何从Excel导入时长数据