Почему моя определенная функция не принимает массив в качестве входных данных? - PullRequest
0 голосов
/ 13 марта 2020

Я работаю с двойным интегралом, а внутренний интеграл имеет переменные границы. Я написал функцию, используя четырехугольную интеграцию SciPy, которая позволяет мне оценить этот интеграл. Тем не менее, я хочу просто оценить внутренний интеграл, чтобы у меня остался только один не оцененный интеграл по некоторой переменной. Затем я хочу построить этот «наполовину» оцененный двойной интеграл в зависимости от диапазона этой переменной, чтобы я мог увидеть некоторую тенденцию. Однако, когда я ввожу массив этой переменной (это просто 0-10000, но с шагом 1, он выдает следующее сообщение об ошибке:

"ValueError: Истинное значение массива с более чем одним элементом равно неоднозначный. Используйте a.any () или a.all () "

Я определил функции до этого, которые позволяют мне вводить массив (который выводит эту функцию в любом количестве точек в массиве), поэтому я Я не уверен относительно того, почему это сообщение появляется сейчас. Я думаю, что это как-то связано со мной, используя интеграцию SciPy "quad" при определении функции. Как мне go обойти это, чтобы я мог ввести массив?

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


#This is the array of values of the variable I ultimately want to have the function plotted 
against
timearray = np.arange(0,10000,1)

#This below defines the general function, that is with respect to two variables (p and t)
def thomtest(p,t):
    d = 3.086e22
    c = 2.998e10
    return (3*((np.cos(p + (2*t/(d*p))))**2))/(8*(t+((p**2)*d/(2*c))))


#The function below evaluates just the inner-integral
def phib(t):
    d = 3.086e22
    c = 2.998e10
    return quad(thomtest,0.00001*(c*t)/d,np.pi, args=(t))[0]


#This evaluates the outer-integral, giving me the complete numerical answer
doubleintegral = quad(phib,0,((3.086e22)/(2.998e10)))


#This below is what gives me the error message: "ValueError: The truth 
#value of an array with more than one element is ambiguous.
#Use a.any() or a.all()". Apparently I cannot input an array
print(phib(timearray))

Прилагается картинка полного сообщения об ошибке

1 Ответ

1 голос
/ 14 марта 2020
In [2]: doubleintegral                                                                                               
Out[2]: (0.9892936902920587, 1.3643899787751934e-08)
In [3]: phib(0)                                                                                                      
Out[3]: 6.377997354641736e-10
In [4]: phib(np.arange(0,5))                                                                                         
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-4-89b7b858c2f5> in <module>
----> 1 phib(np.arange(0,5))

<ipython-input-1-4c64e69e4f62> in phib(t)
     10     d = 3.086e22
     11     c = 2.998e10
---> 12     return quad(thomtest,0.00001*(c*t)/d,np.pi, args=(t))[0]
     13 
     14 doubleintegral = quad(phib,0,((3.086e22)/(2.998e10)))

/usr/local/lib/python3.6/dist-packages/scipy/integrate/quadpack.py in quad(func, a, b, args, full_output, epsabs, epsrel, limit, points, weight, wvar, wopts, maxp1, limlst)
    336 
    337     # check the limits of integration: \int_a^b, expect a < b
--> 338     flip, a, b = b < a, min(a, b), max(a, b)
    339 
    340     if weight is None:

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

Ошибка возникает при тестировании границ интегрирования, когда первое число меньше второго.

Но с массивом t этот тест является многозначным и не может использоваться :

In [6]: d = 3.086e22  
   ...: c = 2.998e10                                                                                                 
In [7]: 0.00001*(c*np.arange(5))/d                                                                                   
Out[7]: 
array([0.00000000e+00, 9.71484122e-18, 1.94296824e-17, 2.91445237e-17,
       3.88593649e-17])

С quad вы должны запустить свой код, phib и doubleintegral один раз для каждого элемента t. В numpy мы стараемся избегать итераций, но quad работает только со скалярными границами. Так что старая добрая итерация обязательна.

...