未知积分的拉普拉斯变换(时间的函数)

时间:2018-10-27 15:04:54

标签: python transform sympy integral

我需要计算积分函数的拉普拉斯变换。似乎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。有什么解决办法吗?

1 个答案:

答案 0 :(得分:1)

似乎the issue尚未修复。

但是,我们可以根据派生工具Eric Wieser的"crappy implementation"给出“糟糕的解决方法”。但是请注意,原始代码段似乎也不适用于衍生产品,因为自该代码段发布以来,高阶衍生产品的内部表示似乎已发生变化。

这是我的“ cr脚”解决方法,它仅捕获最简单的情况(仅关于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的参数匹配并检查内部是否有纯IntegralDerivative。对于t,我们检查是否与Derivative(x(t), t, t, t)有区别;这是Eric最初的解决方法所做的事情,但是尽管他的代码似乎期望使用Derivative(x(t), (t,3))形式的args,但派生词的当前表示形式是Integral。这就是为什么必须更改处理此用例的原因。

对于Integral(x(t), t, t),其表示形式类似于原始表达式:args是一个双整数。我仍然需要调整Eric的原始格式,因为此表达式的t包含每个整数的元组而不是标量t,以便容纳确定的整数。由于我们只想处理不定积分的不费吹灰之力,因此,我确保只有不定积分并且仅针对LaplaceTransform

如果{{1}}的参数为其他任何值,则表达式将保留下来。