未知积分的拉普拉斯变换(时间的函数)
Laplace transform of unknown integral (function of time)
我需要计算积分函数的拉普拉斯变换。看来sympy还不能理解。
假设如下:
from sympy import *
s, t = symbols('s t')
I = Function('I')(t)
eq1 = integrate(I, t)
transforms.laplace_transform(eq1, t, s)
解决方案应该是:I(s) / s
然而,sympy 给出:LaplaceTransform(Integral(I(t), t), t, s)
这似乎是一个悬而未决的问题Issue 7219。有什么解决办法吗?
好像the issue还没有修复
但是,我们可以根据 Eric Wieser 的 "crappy implementation" 给出的导数给出 "crappy workaround"。但是请注意,原始代码段似乎也不适用于导数,因为高阶导数的内部表示自该代码段发布以来似乎已发生变化。
这是我的 "crappy" 解决方法,它只捕获最简单的情况(仅针对 t
的导数,仅针对 t
的不定积分,其中 t
是拉普拉斯变换作用的变量):
from sympy import *
def laplace(e, t, s):
"""Hacked-up Laplace transform that handles derivatives and integrals
Updated generalization of https://github.com/sympy/sympy/issues/7219#issuecomment-154768904
"""
res = laplace_transform(e, t, s, noconds=True)
wf = Wild('f')
lw = LaplaceTransform(wf, t, s)
for exp in res.find(lw):
e = exp.match(lw)[wf]
args = e.args
if isinstance(e, Derivative):
# for derivative check that there's only d/dt^n with n>0
if len(args) == 2 and args[1][0] == t:
n = args[1][1]
if n > 0:
newexp = s**n * LaplaceTransform(e.args[0], t, s)
res = res.replace(exp, newexp)
elif isinstance(e, Integral):
# for integral check that there's only n consecutive indefinite integrals w.r.t. t
if all(len(arg) == 1 and arg[0] == t for arg in args[1:]):
newexp = s**(-len(args[1:])) * LaplaceTransform(args[0], t, s)
res = res.replace(exp, newexp)
# otherwise don't do anything
return res
x = Function('x')
s,t = symbols('s t')
print(laplace(Derivative(x(t), t, 3), t, s))
print(laplace(Integral(Integral(x(t), t), t), t, s))
以上输出
s**3*LaplaceTransform(x(t), t, s)
LaplaceTransform(x(t), t, s)/s**2
符合预期。使用您的具体示例:
I = Function('I')(t)
eq1 = integrate(I, t)
LI = laplace(eq1, t, s)
print(LI)
我们得到
LaplaceTransform(I(t), t, s)/s
这是您预期的“I(s)/s
”的正确表示。
上述解决方法的工作方式是它匹配 LaplaceTransform
的参数并检查内部是否有纯 Derivative
或 Integral
。对于 Derivative
,我们检查是否仅存在与 t
相关的差异;这是 Eric 最初的变通方法所做的,但是虽然他的代码似乎期望 Derivative(x(t), t, t, t)
形式的参数,但当前的导数表示形式是 Derivative(x(t), (t,3))
。这就是必须更改处理此用例的原因。
至于Integral
s,表示和原来的类似:Integral(x(t), t, t)
是一个二重积分。我仍然不得不调整 Eric 的原始表达式,因为此表达式的 args
包含每个积分的元组而不是标量 t
,以适应定积分。因为我们只想处理不定积分的简单情况,所以我确保只有不定积分并且只关于 t
.
如果 LaplaceTransform
的参数是其他任何内容,则表达式保持不变。
我需要计算积分函数的拉普拉斯变换。看来sympy还不能理解。
假设如下:
from sympy import *
s, t = symbols('s t')
I = Function('I')(t)
eq1 = integrate(I, t)
transforms.laplace_transform(eq1, t, s)
解决方案应该是:I(s) / s
然而,sympy 给出:LaplaceTransform(Integral(I(t), t), t, s)
这似乎是一个悬而未决的问题Issue 7219。有什么解决办法吗?
好像the issue还没有修复
但是,我们可以根据 Eric Wieser 的 "crappy implementation" 给出的导数给出 "crappy workaround"。但是请注意,原始代码段似乎也不适用于导数,因为高阶导数的内部表示自该代码段发布以来似乎已发生变化。
这是我的 "crappy" 解决方法,它只捕获最简单的情况(仅针对 t
的导数,仅针对 t
的不定积分,其中 t
是拉普拉斯变换作用的变量):
from sympy import *
def laplace(e, t, s):
"""Hacked-up Laplace transform that handles derivatives and integrals
Updated generalization of https://github.com/sympy/sympy/issues/7219#issuecomment-154768904
"""
res = laplace_transform(e, t, s, noconds=True)
wf = Wild('f')
lw = LaplaceTransform(wf, t, s)
for exp in res.find(lw):
e = exp.match(lw)[wf]
args = e.args
if isinstance(e, Derivative):
# for derivative check that there's only d/dt^n with n>0
if len(args) == 2 and args[1][0] == t:
n = args[1][1]
if n > 0:
newexp = s**n * LaplaceTransform(e.args[0], t, s)
res = res.replace(exp, newexp)
elif isinstance(e, Integral):
# for integral check that there's only n consecutive indefinite integrals w.r.t. t
if all(len(arg) == 1 and arg[0] == t for arg in args[1:]):
newexp = s**(-len(args[1:])) * LaplaceTransform(args[0], t, s)
res = res.replace(exp, newexp)
# otherwise don't do anything
return res
x = Function('x')
s,t = symbols('s t')
print(laplace(Derivative(x(t), t, 3), t, s))
print(laplace(Integral(Integral(x(t), t), t), t, s))
以上输出
s**3*LaplaceTransform(x(t), t, s)
LaplaceTransform(x(t), t, s)/s**2
符合预期。使用您的具体示例:
I = Function('I')(t)
eq1 = integrate(I, t)
LI = laplace(eq1, t, s)
print(LI)
我们得到
LaplaceTransform(I(t), t, s)/s
这是您预期的“I(s)/s
”的正确表示。
上述解决方法的工作方式是它匹配 LaplaceTransform
的参数并检查内部是否有纯 Derivative
或 Integral
。对于 Derivative
,我们检查是否仅存在与 t
相关的差异;这是 Eric 最初的变通方法所做的,但是虽然他的代码似乎期望 Derivative(x(t), t, t, t)
形式的参数,但当前的导数表示形式是 Derivative(x(t), (t,3))
。这就是必须更改处理此用例的原因。
至于Integral
s,表示和原来的类似:Integral(x(t), t, t)
是一个二重积分。我仍然不得不调整 Eric 的原始表达式,因为此表达式的 args
包含每个积分的元组而不是标量 t
,以适应定积分。因为我们只想处理不定积分的简单情况,所以我确保只有不定积分并且只关于 t
.
如果 LaplaceTransform
的参数是其他任何内容,则表达式保持不变。