Laplace数值逆运算的讨论

■ 问题提出


在博文 逆Laplace数值逆变换 给出了数值计算Laplace逆变换的简易程序。其中存在以下几个问题需要讨论:

  • 问题1: 程序实现过程原理以及优化;
  • 问题2: 运算参数: σ \sigma σ ω max ⁡ \omega_{\max} ωmax N i n t N_{{\mathop{\rm int}} } Nint对于积分数值的影响。从上篇博文中明显看到有些计算出的结果大大偏离的实际值。比如其中的函数 sin ⁡ ( t ) \sin \left( t \right) sin(t)所计算出来的幅值超过了1.



 

01程序实现原理以及优化


1.Laplace逆运算


所以,算法的核心是对 F ( s ) F\left( s \right) F(s)进行傅里叶反变换,然后在乘以 e σ t e^{\sigma t} eσt

由于确认变换后的函数 f ( t ) f\left( t \right) f(t)是实函数,因此,为了节省计算时间,只对傅里叶反变换的积分,进行正半轴的积分,同时积分的上限有参数 ω max ⁡ \omega _{\max } ωmax决定。对积分的数值取齐实部,再乘以2便可以得到 f ( t ) f\left( t \right) f(t)


2.Python积分程序实现优化

使用梯形积分来实现函数的积分,可以获得更精确的积分值。理论分析可知:


其中 Δ x = ( b − a ) / N \Delta x = \left( {b - a} \right)/N Δx=(ba)/N 以及 x i = a + i Δ x x_i = a + i\Delta x xi=a+iΔx。那么积分误差上限为:

其中, ∣ f ′ ′ ( x ) ∣ ≤ K 2 \left| {f^{''} \left( x \right)} \right| \le K_2 f(x)K2 x ∈ [ a , b ] x \in \left[ {a,b} \right] x[a,b]
▲ 图2.1 梯形积分方法示意图

▲ 图2.1 梯形积分方法示意图

计算 T N ( f ) T_N \left( f \right) TN(f)可以由两种方式:

方式1: 对左、右黎曼积分加权平均:

方式2: 利用如下的公式计算:

最后实现的代码为:

def trapz(f, a, b, N=50):
    x = linspace(a, b, N+1)
    y = f(x)
    y_right = y[1:]
    y_left = y[:-1]
    dx = (b-a) / N
    T = dx/2 * sum(y_right + y_left)
    return T

利用上述公式,对 sin ⁡ ( t ) \sin \left( t \right) sin(t)进行积分测试:

printf(trapz(sin, 0, pi/2, 1000))

所得到结果为:0.9999997943832332。
可以看到使用n=1000对应的结果后面的积分精度达到了小数点后面6位9的小数点的位数。

3.实现Laplace逆运算

通过上面梯形积分方法,实现Laplace数值逆变换,具体的子程序如下面所示。

#------------------------------------------------------------
def invlt(t, fs, sigma, omiga, nint):
    omigadim = linspace(0, omiga, nint+1, endpoint=True)
    y = [(exp(1j*o*t) * fs(sigma+1j*o)).real for o in omigadim]
    y_left = y[:-1]
    y_right = y[0:]
    T = sum(y_right + y_left) * omiga/nint
    return exp(sigma*t) * T/ pi / 2

#------------------------------------------------------------
def fs(s):
    return 1/(s*s+1)

#------------------------------------------------------------
sigma = 0.2
omiga=200
nint=omiga*50

tdim = linspace(0, 2*pi* 3, 200)
ft = [invlt(t, fs, sigma, omiga, nint) for t in tdim]



 

02一些基本函数的实验


下面通过对一些基本常见函数的laplace变换,来测试一下上述程序的性能。

Ⅰ.sin(t)

sigma=0.2, omiga=200, nint=omiga*50


Ⅱ.exp(-t)

sigam=-1+0.1, omiga=200, nint=omiga*50


Ⅲ.u(t)

Ⅳ.u(t-1)

Ⅴ.周期化脉冲信号


Ⅵ.三角形


▲ omiga从10变化到1000

▲ omiga从10变化到1000

 

※ 结论


通过原理分析,可以获得建议的Laplace数值逆运算的正确的PYTHON算法程序

这个程序是直接对Laplace反变换公式利用梯形积分方法获得计算结果。通过对几种常见的信号Laplace的反变换,验证了这个算法的正确性。

通过在此过程,可以看到,对于参数sigma, omiga, nint对于计算结果还是有很大的影响。另外,对于时间t,只能在比较小的范围内有效,当t超过一定长度,前面所计算的结果都会出现比较大的误差

▲ 对于方波进行Laplace数值反变换的结果

▲ 对于方波进行Laplace数值反变换的结果

 

§ 参考文献


  1. Numerical Inverse Laplace Transorms for Electrical Engineering Simulation

  2. Laplace transform numerical inversion

  3. MATLAB Algorithms for the laplace Transform inversion

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卓晴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值