我正在尝试创建一个名为calc(f,a,b)
的函数,其中x是带变量f的等式,我想将此代码放在函数中。
def calc(f, a, b):
limits = [a, b]
integral = odeint(lambda y, x : f, 0, limits)
return integral[1]
此函数使用内置的odeint函数获取积分。 这就是我想要做的事情
print calc(x**2, 0, 1)
其中x^2
是要集成的函数。我的问题是这个函数(x**2
)需要在odeint
之后立即传递给y, x: f
函数,其中分号后面的f是来自{{1}的f
}}
我无法弄清楚如何将calc(f,a,b)
从calc函数输入传递到odeint里面。它说f没有声明,如果我把它放在字符串中......它可以工作
当我运行此功能时..它不起作用我收到此错误
f
我不知道如何将我的等式传递到odeint中
由于
答案 0 :(得分:2)
如果要重写函数calc
,如下所示:
def calc(f, a, b):
limits = [a, b]
integral = odeint(lambda y, x: f(x), 0, limits)
return integral[1][0]
然后可以使用这个功能:
>>> calc(lambda x: x ** 2, 0, 1) # Integrate x ** 2 over the interval [0, 1] (expected answer: 0.333...)
0.33333335809177234
>>> calc(lambda x: x, 0, 1) # Integrate x over the interval [0, 1] (expected answer: 0.5)
0.50000001490120016
>>> calc(lambda x: 1, 0, 1) # Integrate 1 over the interval [0, 1] (expected answer: 1.0)
1.0
odeint
模块中的scipy.integrate
函数具有签名:
odeint(func, y0, t, ...)
其中:func
是一个可调用的,它接受参数y, t0, ...
并在给定点返回dy / dt; y0
是表示y的初始条件的序列; t
是表示为y求解的区间的序列(t0是序列中的第一项)。
看来你正在求解dy / dx = f(x)形式的一阶微分方程,在[a,b]区间,其中y0 = 0.在这种情况下,当你通过f(函数odeint接受一个参数),你必须将它包装在一个lambda中,以便传入的函数接受两个参数(y和x - y参数基本上被忽略,因为你不需要将它用于一阶微分方程)。
答案 1 :(得分:1)
我认为odeint
是传递lambda函数的函数。 odeint
可能会调用lambda并需要将x
和y
传递给它。答案是,如果您希望odeint
调用该函数并将其传递给x
和y
,那么您需要将x
和y
传递给{ {1}} 作为参数,除了函数本身。
你到底想要做什么?有了更多细节和更多代码,我们可能会得到更好的答案。
答案 2 :(得分:0)
x不能有两个值;因此,如果您需要两个值,则必须将其中一个命名为其他值。重命名您的一个变量。
修改强>
(咂舌额头):在calc(x**2, 0, 1)
中,x**2
不是一个函数 - 它是一个表达式,在传递给calc之前会被评估 - 因此它会抱怨它需要知道x是什么(为了计算x ** 2)。
尝试
calc(lambda x: x**2, a, b)
代替。这相当于
def unnamedfunction(x):
return x**2
calc(unnamedfunction, a, b)
答案 3 :(得分:0)
我不完全确定,因为odeint()
不是内置的Python函数,所以我对它不太了解,但是你在代码中传递它的第一个参数是 not 计算x^2
的函数。执行此类操作的简单方法是将lambda
函数传递给进行此类计算的calc
。例如:
def calc(f, a, b):
limits = [a, b]
integral = odeint(f, 0, limits)
return integral[1]
print calc(lambda x: x**2, 0, 1)