Определенный интеграл по одной переменной в функции с двумя переменными в Scipy

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

from scipy.integrate import quad
import numpy as np
def integrand(x,y):
    return x*np.exp(x/y)

quad(integrand, 1,2, args=())

И он возвращает ошибку этого типа:

TypeError: integrand() takes exactly 2 arguments (1 given)

Однако это работает, если я помещаю число в args. Но я не хочу, потому что я хочу, чтобы y оставался y, а не числом. Кто-нибудь знает, как это можно сделать?

РЕДАКТИРОВАТЬ: Извините, не думаю, что я был ясен. Я хочу, чтобы конечный результат был функцией y, а y по-прежнему оставался символом.


person Hannah    schedule 14.08.2014    source источник
comment
quad предназначен для численного интегрирования, поэтому его можно выполнить только для определенного значения y (в этом случае вы можете использовать частичную функцию). Вы хотели символическую интеграцию? В таком случае посмотрите на sympy.   -  person mdurant    schedule 14.08.2014
comment
Я хочу, чтобы ответ был функцией y. Могу ли я использовать sympy (как в y=Symbol('y') в сочетании с scipy?   -  person Hannah    schedule 14.08.2014
comment
Я так не думаю, scipy чисто числовой (но попробуйте - может быть, символ распространяется); вам следует использовать интеграцию внутри sympy docs.sympy.org/dev/modules/integrals /интеграл.html   -  person mdurant    schedule 15.08.2014
comment
Да, я пробовал использовать их в комбинации, это не сработало. Но не будет ли у меня такой же проблемы с sympy, просто теперь он будет выполнять только символическую интеграцию? Мне все еще нужно 'x' для интеграции.   -  person Hannah    schedule 15.08.2014
comment
Нет: sympy действительно может выполнять действительно определенное (и неопределенное) интегрирование, возвращая числовые значения для коэффициентов оставшегося неизвестного символа, в данном случае y.   -  person mdurant    schedule 15.08.2014
comment
Спасибо, использование Sympy работает только для этого примера.   -  person Hannah    schedule 18.08.2014


Ответы (4)


Благодаря mdurant, вот что работает:

from sympy import integrate, Symbol, exp
from sympy.abc import x
y=Symbol('y')
f=x*exp(x/y)
integrate(f, (x, 1, 2))

Отвечать:

-(-y**2 + y)*exp(1/y) + (-y**2 + 2*y)*exp(2/y)
person Hannah    schedule 18.08.2014
comment
Привет, в приведенном выше коде y является символом. Если мы установим int_f = integrate(f, (x, 1, 2)), в принципе, int_f является функцией y, как мы можем получить значение int_f, если мы установим разные значения y? Спасибо~ - person Huanian Zhang; 25.07.2017

Лучшее, что вы можете сделать, это использовать functools.partial, чтобы связать аргументы, которые у вас есть на данный момент. Но в принципе нельзя численно интегрировать определенный интеграл, если вы еще не определили всю область; в этом случае результирующее выражение обязательно будет содержать символьные части, поэтому промежуточный результат не будет числовым.

person Eelco Hoogendoorn    schedule 14.08.2014
comment
Я хочу, чтобы результат содержал y как символ, извините, если это неясно. - person Hannah; 14.08.2014
comment
численное интегрирование не поможет, если это не ясно;) - person Eelco Hoogendoorn; 14.08.2014

(Предполагая, что вы говорите о вычислении определенного интеграла по x при заданном фиксированном значении y.)

Вы можете использовать лямбду:

quad(lambda x:integrand(x, 10), 1, 2, args=())

or functools.partial():

quad(functools.partial(integrand, y=10), 1, 2, args=())
person NPE    schedule 14.08.2014
comment
Я хочу, чтобы ответ был функцией y-извините, если это было неясно. - person Hannah; 14.08.2014

Вероятно, вы просто хотите, чтобы результат был функцией y, верно?:

from scipy.integrate import quad
import numpy as np
def integrand(x,y):
    return x*np.exp(x/y)

partial_int = lambda y: quad(integrand, 1,2, args=(y,))
print partial_int(5)
#(2.050684698584342, 2.2767173686148355e-14)
person CT Zhu    schedule 14.08.2014
comment
Могу ли я распечатать это, чтобы он показывал результат как функцию y? - person Hannah; 14.08.2014