在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仍然是一个符号。
5 个回答
0
在编程中,有时候我们需要让程序在特定的条件下执行某些操作。这就像给程序设定一些规则,只有当这些规则被满足时,程序才会继续进行。
比如说,如果你想让程序在用户输入的数字大于10时显示一条消息,你就需要写一些代码来检查这个条件。如果条件成立,程序就会执行显示消息的操作;如果不成立,程序就会跳过这一步,继续执行后面的代码。
这种方式可以帮助我们控制程序的行为,让它更智能地响应不同的情况。
from scipy.integrate import quad
import numpy as np
def integrand(x,y):
return x*np.exp(x/y)
vec_int = np.vectorize(integrand)
y = np.linspace(0, 10, 100)
vec_int(y)
0
(假设你是在讨论在给定一个特定的、固定的y
值的情况下,计算x
的定积分。)
你可以使用一个叫做lambda的东西:
quad(lambda x:integrand(x, 10), 1, 2, args=())
或者使用functools.partial()
这个工具:
quad(functools.partial(integrand, y=10), 1, 2, args=())
0
你能做的最好的办法是使用functools.partial,这样可以把你目前有的参数固定住。不过,基本上如果你还没有确定整个范围,就无法对一个定积分进行数值积分;在这种情况下,得到的结果中必然会包含一些符号部分,所以中间的结果并不是数字。
3
你可能只是想让结果成为一个关于 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)
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)