Python - Как построить аргумент в интеграле, который не является интегрируемым значением - PullRequest
0 голосов
/ 15 октября 2018

Я хочу интегрировать функцию, которая не имеет решения в закрытой форме, с неизвестной переменной, а затем построить график с неизвестной переменной.Чтобы попробовать более простой тест, я попытался использовать интеграл f(x,c) = (x^2+c), интегрированный относительно x и построить график с различными значениями c.Тем не менее, приведенный ниже код получает ошибку

только массивы размера 1 могут быть преобразованы в скаляры Python

, даже если это целое число, например integral(5),кажется, возвращает правильное скалярное значение.

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


def f(x,c):
    return x**2+c

def integral(c):
    return integrate.quad(f,0,10, args = (c,))[0]
y = np.linspace(0,20,200)


plt.plot(y, integral(y))

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

онно был немного быстрее.Но вот мое подобное решение.Вам нужно перебрать все различные c:

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


def f(x,c):
    return x**2+c

def getIntegral(c_list):
    result = []
    for c in c_list:
        integral = integrate.quad(f,0,10,args = c)[0]
        result.append(integral)
    return result

if __name__ == "__main__":


    c_list = np.linspace(0,20,200)

    plt.plot(c_list, getIntegral(c_list))
    plt.show()
0 голосов
/ 15 октября 2018

В качестве аргумента c вы передаете массив numpy, в то время как вы хотите интегрировать более x для всех элементов c.Поэтому вы можете использовать это:

def f(x,c):
    return x**2+c

def integrate_f(c):
    result = np.zeros(len(c))
    counter = 0
    for item in c:
        result[counter] = integrate.quad(f,0,10, args = (item))[0]
        counter +=1
    return result

c_array = np.linspace(0,1,200)
plt.plot(c_array, integrate_f(c_array))
...