Интеграл с переменными пределами в python - PullRequest
2 голосов
/ 08 мая 2020

Я пытаюсь вычислить следующий интеграл

enter image description here

с помощью scipy с помощью следующей программы:

def E(z):
    result = 1/np.sqrt(Om*(1 + z)**3 + Ode + Ox*(1 + z)**2)
    return result 

def r(z, E): 
    result, error  = quad(E, 0, z) # integrate E(z) from 0 to z
    return result

z - независимая переменная, а Om Ode и Ox - просто константы (присвоенные ранее). Когда я затем пытаюсь вызвать функцию:

z = np.linspace(1e-3, 4, 300)
plt.plot(z, r(z))

, я получаю сообщение об ошибке

flip, a, b = b < a, min(a, b), max(a, b)

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() 
or a.all()

В чем проблема? Scipy.quad не может интегрироваться до переменной? Большое спасибо за вашу помощь

1 Ответ

1 голос
/ 08 мая 2020

Вы можете использовать комбинацию Python s map(function, iterable, ...) function,

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

и functools partial(func[,*args][, **keywords]) метод:

Возвращает новый частичный объект, который при вызове будет вести себя как забавный c, вызываемый с помощью аргументы позиционных аргументов и ключевые слова аргументов ключевых слов.

import numpy as np
from scipy.integrate import quad
import matplotlib.pyplot as plt
from functools import partial


def E(z):
    Om = 0.32
    Ode = 0.68
    Ox = 0
    result = 1/np.sqrt(Om*(1 + z)**3 + Ode + Ox*(1 + z)**2)

    return result


def r(z):
    result = np.array(
        list(map(partial(quad, E, 0), z))
    )[:, 0]  # integrate E(z) from 0 to z

    return result


z = np.linspace(1e-3, 4, 300)
fig, ax = plt.subplots()
ax.plot(z, r(z))
fig.show()

enter image description here

...