MATLAB使用FFT求周期输入力的稳态响应(质量-弹簧-阻尼系统)

MATLAB使用FFT求周期输入力的稳态响应(质量-弹簧-阻尼系统),matlab,fft,Matlab,Fft,假设我有一个质量弹簧阻尼系统 这是我的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

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

这是我的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)
所以我可以成功地检索一个图,但是我得到了奇怪的响应,我还编程了一个RK4方法,它可以解微分方程组,这样我就知道图应该是什么样子,我使用FFT得到的图的振幅是like 2,而它的振幅应该是like.05

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

请记住,我将周期性输入定义为周期为2*pi的成本,这就是为什么我只在0到2*pi 1周期的时间向量上使用FFT。我还注意到,如果我把tMax时间改为2*pi的倍数,比如10*pi,我会得到一个类似的图,但振幅是4而不是2,无论如何都不是。05!。也许有某种因素我需要乘以

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

我知道可以用傅里叶变换/fft求解稳态响应,我只是缺少了一些东西!我需要帮助和理解

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

其中,蓝色曲线表示基于FFT的实现,红色曲线表示备选RK4实现。正如你所指出的,曲线是完全不同的

获得正确的响应 最明显的问题当然是振幅,问题中公布的代码振幅差异的主要来源与我在中指出的相同:

RK4实现执行数值积分,通过积分步骤dt正确缩放求和值。基于FFT的实现缺乏这种缩放。 基于FFT的实现中使用的脉冲响应与由质量m缩放的驱动力一致,质量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的计算速度仍然相当快,但将其转换为稳态似乎有点浪费

那么,让我们回头看一看问题域。你可能知道, 该过程由微分方程控制:

式中,ft是这种情况下的驱动力。 请注意,齐次方程的通解具有以下形式:

关键是要认识到,在c>0和m>0的情况下,一般解在稳定状态下消失,t趋于无穷大。 因此,稳态解仅依赖于非齐次方程的特定解。 这个特殊的解决方案可以通过,为形式的驱动力找到

相应地假设解的形式为

代入微分方程可得出以下方程:

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

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

一般化 通过将驱动力表示为 假设驱动力为f的傅里叶级数 功能满足以下要求:

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

对于特定的解决方案,可以采用与前面案例非常类似的方式进行求解。这将导致以下实施:

% 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的情况。在这种情况下,振荡永远不会消失,齐次方程的通解不必是平凡的

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