Как интегрировать с помощью scipy массив как часть функции

Я хотел бы использовать интегральную команду в scipy и иметь функцию, которая один раз умножается на каждый элемент массива.

import math 
import matplotlib.pyplot as plt
import numpy as np
import scipy.integrate as integrate
from scipy.integrate import quad, romberg
import scipy.special as special
from numpy import sqrt

yes = np.array([0,1])

def integrate(x,yes):
    return x+yes

result = quad(integrate,0,1,args=(yes))

print(result)

когда я это делаю, я получаю сообщение об ошибке только массивы размера 1 могут быть преобразованы в скаляры Python

Но если я сделаю это

import math 
import matplotlib.pyplot as plt
import numpy as np
import scipy.integrate as integrate
from scipy.integrate import quad, romberg
import scipy.special as special
from numpy import sqrt

yes = np.array([0])

def integrate(x,yes):
    return x+yes

result = quad(integrate,0,1,args=(yes))

print(result)

он дает мне это (0.5, 5.551115123125783e-15) Это именно то, что я хочу, но я хотел бы это для каждого элемента в массиве.

Есть ли способ написать цикл for? Я также слышал о scipy.integrate.quad_vec, но это не сработало. заранее спасибо


person Deangelo Wooley    schedule 02.02.2020    source источник
comment
args должен получить кортеж. (yes) это не кортеж, это просто yes. args=(yes,) - это правильный способ передачи переменной yes в вашу функцию. Тем не менее, quad может интегрировать только одно значение; ваша функция должна возвращать скаляр.   -  person hpaulj    schedule 03.02.2020
comment
Как мне заставить мою функцию возвращать скаляр?   -  person Deangelo Wooley    schedule 03.02.2020


Ответы (1)


Вы можете использовать quadpy, он полностью векторизован. Просто убедитесь, что ваша функция f при вводе данных x определенной длины/формы возвращает объект формы range_shape + x.shape. Результат будет иметь форму range_shape.

import numpy as np
from quadpy import quad


def f(x):
    return np.add.outer(np.array([0, 1]), x)


val, err = quad(f, 0, 1)
print(val)
[0.5 1.5]
person Nico Schlömer    schedule 02.02.2020