使用mpmath在Python中进行拉普拉斯逆

时间:2016-11-23 22:06:41

标签: python python-2.7 mpmath

我想用“DE HOOG”算法进行数值拉普拉斯逆变换。我想使用“mpmath”包,我从链接中安装了它:

this paper

假设我需要在t = 1时找到以下函数的逆拉普拉斯变换:

f = 1 /(s-1)

f的逆拉普拉斯变换是:e ^(t)

在t = 1时,结果预计为= e

import mpmath as mp
import numpy as np

def f(s):
    return 1 / (s-1)

t = np.linspace(0.01,0.5,10)

G = []

for i in range(0,4):
    G.append(mp.invlapdehoog(f, t[i]))

print G 

只有当我将“i”的范围设置为小于4时才能完美地工作。例如,一旦我替换:

for i in range(0,5): #or for i in range(0,more than 5):

我收到此错误:

https://github.com/klkuhlm/mpmath

你能帮我解决这个问题吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

对象InverseLaplaceTransform具有属性degrees,该属性决定了达到给定精度水平所需的近似水平。每次使用越来越小的值调用InverseLaplaceTransform时,degrees的副本都会更新degrees。最终,fp非常小,参数invlapdehoog只有一个值,这还不足以继续进行进一步的计算。

解决方案:编辑您对invertlaplace的来电,每次都重置学位。不过我建议直接拨打invlapdehoog而不是for i in xrange(0,10): G.append(mp.invertlaplace(f, t[i], method = 'dehoog', degree = 18))

mp.invertlaplace

修改 原始海报在对此解决方案的评论中询问了相关问题。他们问到为什么计算时间会随着mp.invertlaplace的连续调用而增加(非常大)。简而言之,for i in xrange(0,10): G.append(mp.invertlaplace(f, t[i], method = 'dehoog', dps = 10, degree = 18)) 正在更新其属性精度,该精度决定了在计算反拉角时应计算的小数位数。与上面的解决方案一样,我们可以将精度传递给每个调用,以确保我们获得所需的精度(例如 - 小数点后10位):

G = map( lambda x: mp.invertlaplace(f, x, method = 'dehoog', dps = 10, degree = 18), t)

PS - 您可以使用以下代码段一次性对所有t应用反拉角:

Get-ADComputer -Filter * | Select-Object -property name | Sort-Object -Property name | out-file -filepath C:\temp\names.txt