【问题标题】:MATLAB using FFT to find steady state response to a periodic input force (mass spring damper system)MATLAB 使用 FFT 找到对周期性输入力的稳态响应(质量弹簧阻尼系统)
【发布时间】:2015-04-04 22:47:27
【问题描述】:

假设我有一个质量弹簧阻尼系统......

这是我的代码(matlab)...

% system parameters
m=4; k=256; c=1; wn=sqrt(k/m); z=c/2/sqrt(m*k); wd=wn*sqrt(1-z^2);

% initial conditions
x0=0; v0=0;

%% time
dt=.001; tMax=2*pi; t=0:dt:tMax;

% input
F=cos(t); Fw=fft(F);

% impulse response function
h=1/m/wd*exp(-z*wn*t).*sin(wd*t); H=fft(h);

% convolution
convolution=Fw.*H; sol=ifft(convolution);

% plot
plot(t,sol)

所以我可以成功检索一个绘图,但是我得到了奇怪的响应当它的振幅应该是 0.05 时,振幅应该是 2。

那么,如何使用 FFT 求解该系统的稳态响应。我想使用 FFT,因为它比数值积分方法快大约 3 个数量级。

请记住,我将周期性输入定义为 cos(t),它的周期为 2*pi,这就是为什么我只在跨越 0 到 2*pi(1 个周期)的时间向量上使用 FFT。我还注意到,如果我将 tMax 时间更改为 2*pi 的倍数,例如 10*pi,我会得到一个类似的图,但幅度是 4 而不是 2,无论哪种方式仍然不是 0.05!。也许我需要乘以某种因素?

我还绘制了:plot(t,Fw) 期望在 1 处看到一个峰值,因为强制函数是 cos(t),但我没有看到任何峰值(也许我不应该绘制 Fwt

我知道可以使用傅立叶变换/fft 来解决稳态响应问题,我只是错过了一些东西!我需要帮助和理解!

【问题讨论】:

    标签: matlab fft


    【解决方案1】:

    原始结果

    运行您提供的代码并将结果与​​your other question 中发布的 RK4 代码进行比较,我们得到以下响应:

    蓝色曲线代表基于 FFT 的实现,红色曲线代表您的替代 RK4 实现。正如您所指出的,曲线完全不同。

    得到正确的响应

    最明显的问题当然是幅度,而本题贴出的代码幅度差异的主要来源与我在my answer to your other question中指出的相同:

    1. RK4 实现执行数字积分,通过积分步骤dt 正确缩放总和值。基于 FFT 的实现缺乏这种缩放。
    2. 在基于 FFT 的实现中使用的脉冲响应与按质量 m 缩放的驱动力一致,这是 RK4 实现中缺少的一个因素。

    解决这两个问题会产生更接近但仍不相同的响应。正如您可能发现的那样,鉴于您发布的其他问题的代码发生了变化,缺少的另一件事是输入和脉冲响应的零填充,没有它,您将获得 圆形 卷积而不是比线性卷积:

    f=[cos(t),zeros(1,length(t)-1)];   %force f
    h=[1/m/wd*exp(-z*wn*t).*sin(wd*t),zeros(1,length(t)-1)];  %impulse response
    

    最后,确保卷积产生良好结果的最后一个元素是使用对无限长脉冲响应的良好近似。多长时间足够长取决于脉冲响应的衰减率。使用您提供的参数,在大约11*pi 之后,脉冲响应将下降到其原始值的 1%。因此,将时间跨度扩展到tMax=14*pi(在脉冲响应消失后包括完整的2*pi 循环)可能就足够了。

    获得稳态响应

    获得稳态响应的最简单方法是丢弃初始瞬态。在这个过程中,我们丢弃了参考驱动力的整数个周期(这当然需要知道驱动力的基频):

    T0    = tMax-2*pi;
    delay = min(find(t>T0));
    sol   = sol(delay:end);
    plot([0:length(sol)-1]*dt, sol, 'b');
    axis([0 2*pi]);
    

    然后得到的响应是:

    蓝色曲线再次代表基于 FFT 的实现,红色曲线代表您的替代 RK4 实现。好多了!

    另一种方法

    计算多个周期的响应,等待瞬态响应消退,然后提取对应的剩余样本 尽管由于 FFT 计算仍然相当快,但到稳定状态可能看起来有点浪费。

    所以,让我们回过头来看看问题域。你可能知道, mass-spring-damper system 由微分方程控制:

    f(t) 在这种情况下是驱动力。 请注意,齐次方程的通解具有以下形式:

    然后关键是要认识到c>0m>0 在稳定状态下消失的情况下的一般解决方案(t 趋于无穷大)。 因此,稳态解仅取决于非齐次方程的特定解。 这个特殊的解决方案可以通过method of undetermined coefficients找到,求驱动的形式

    相应地假设解决方案具有以下形式

    代入微分方程得到方程:

    因此,解决方案可以实现为:

    EF0 = [wn*wn-w*w 2*z*wn*w; -2*z*wn*w wn*wn-w*w]\[1/m; 0];
    sol = EF0(1)*cos(w*t)+EF0(2)*sin(w*t);
    plot(t, sol);
    

    在你的情况下w=2*pi

    概括

    通过将驱动力表示为 傅里叶级数(假设驱动力函数满足Dirichlet conditions):

    可以相应地假设特解具有以下形式

    求解特定解的方法与前面的情况非常相似。这导致以下实现:

    % normalize
    y = F/m;
    
    % compute coefficients proportional to the Fourier series coefficients
    Yw = fft(y);
    
    % setup the equations to solve the particular solution of the differential equation 
    % by the method of undetermined coefficients
    k = [0:N/2];
    w = 2*pi*k/T;
    A = wn*wn-w.*w;
    B = 2*z*wn*w;
    
    % solve the equation [A B;-B A][real(Xw); imag(Xw)] = [real(Yw); imag(Yw)] equation
    % Note that solution can be obtained by writing [A B;-B A] as a scaling + rotation
    % of a 2D vector, which we solve using complex number algebra
    C = sqrt(A.*A+B.*B);
    theta = acos(A./C);
    Ywp = exp(j*theta)./C.*Yw([1:N/2+1]);
    
    % build a hermitian-symmetric spectrum
    Xw = [Ywp conj(fliplr(Ywp(2:end-1)))];
    
    % bring back to time-domain (function synthesis from Fourier Series coefficients)
    x = ifft(Xw);
    

    最后一点

    我在上面的推导中故意避免了无阻尼的c=0 情况。在这种情况下,振荡永远不会消失,齐次方程的通解也不一定是微不足道的。

    在这种情况下,最终的“稳态”可能与驱动力具有相同的周期,也可能不同。事实上,如果通解的周期振荡与驱动力的周期通过有理数(整数比)无关,则它可能根本不是周期性的。

    【讨论】:

      猜你喜欢
      • 2019-11-07
      • 1970-01-01
      • 1970-01-01
      • 2013-10-27
      • 2019-09-28
      • 1970-01-01
      • 2013-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多