代码之家  ›  专栏  ›  技术社区  ›  0x90 Salvador Dali

如何在Matlab中对离散输入信号执行数值拉普拉斯变换和逆拉普拉斯变换?

  •  1
  • 0x90 Salvador Dali  · 技术社区  · 7 年前

    作为一个简单的测试用例,我尝试使用 ilaplace 获取原始信号,但我不确定我的方法是否合理。

    x = sym('x','real');
    y = sym('y','real');
    t=linspace(0,1000,1000);
    f=sin(t);
    s = x+i*y;               
    F_s=sum(f.*exp(-s*t));   
    ilaplace(F_s)
    

    尽管在我真正的问题中,我试图估计媒介,但上述内容可能看起来很愚蠢 Green's function 形式如下 ilaplace(2*F_s/(-s*F_s +f(0))) .

    s 它给了我一系列delta,我不确定它是否正确,误差估计是什么。

    syms s;                                
    F_s = symfun(sum(sin(t).*exp(-s*t)), s);
    ilaplace(F_s)
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   Adriaan Decoder    7 年前

    尝试增加中的元素数 t 更准确地采样正弦函数,或在计算前平滑信号。您面临的另一个问题是,拉普拉斯逆变换需要为其定义一个函数 s>0 ,即无限大。你在 t=1000 因此,拉普拉斯变换也不会无穷大。

    判断 documentation of ilaplace 它试图改变 每个单独的术语 在您的阵列中 F_s . 这是一个由1000个常数乘以某种指数形式的条目之和 exp(-s*t) ,其逆变换为delta脉冲,请参见 this Wikipedia page, second entry of the table F\u s 是一系列1000个delta脉冲,大概就是您使用 sin(t)

    最后:如文档中所述,MATLAB需要一个符号变量 s . 你做的 s 由两个符号变量组成。虽然在数学上是正确的,但MATLAB只将第一个符号变量作为变换变量,因此可以用增量脉冲乘以 exp(1i*y) 作用使用以下代码,您至少可以解决这个问题(但显然要保留增量脉冲的总和):

    t=linspace(0,1000,1000);
    f=sin(t);
    syms s
    F_s=sum(f.*exp(-s*t));   
    ilaplace(F_s)
    
        2
  •  1
  •   0x90 Salvador Dali    7 年前

    好的,这就是我使用matlab对离散信号进行拉普拉斯变换的方法,并使用ilaplace将其恢复回来以进行验证:

    t=linspace(0,10,500);
    f=exp(-t/0.2);   
    syms s;                                
    F_s = sum(f.*exp(-s*t));
    f_t = (ilaplace(F_s)); 
    F_t = (int(f_t));
    
    y=subs(F_t,t);
    Ft_recovered = diff(double(y));
    
    
    subplot(2,2,1)
    plot(t,f)
    title('numerical input exp(-t/0.2)')
    
    
    subplot(2,2,2)
    ezplot(F_s)
    title('numerical laplace')
    
    
    subplot(2,2,3)
    plot(t(1:end-1), Ft_recovered)
    title('recovered signal')
    
    
    subplot(2,2,4)
    syms x;
    fx = symfun(exp(-x/0.2),x);
    ezplot(laplace(fx))
    title('symbolic laplace transform')
    

    这里最大的困难是让matlab计算dirac delta序列的和,所以我做了这个技巧:整合表达式将其转换为heaviside函数序列,计算它,然后绘制导数:

    F_t = (int(f_t));
    y=subs(F_t,t);
    Ft_recovered = diff(double(y));
    

    enter image description here