在Scipy中对双变量函数进行单变量定积分

3 投票
5 回答
11028 浏览
提问于 2025-04-18 17:19

我正在尝试用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)

撰写回答