假设我有一个质量弹簧阻尼系统......
这是我的代码(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获得的情节有当幅度应该像.05时那样幅度为2。
那么,如何使用FFT解决该系统的稳态响应。我想使用FFT,因为它比数值积分方法快3个数量级。
请记住,我将我的周期性输入定义为cos(t)
,其周期为2 * pi,这就是我在跨越0到2 * pi(1个周期)的时间向量上仅使用FFT的原因。我还注意到,如果我将tMax
时间更改为2 * pi的倍数,例如10 * pi,我得到了一个类似的情节,但振幅是4而不是2,无论哪种方式都不是.05!。也许有一些因素我需要乘以?
我还绘制了:plot(t,Fw)
期望看到一个峰值为1,因为强制函数是cos(t)
,但我没有看到任何峰值(也许我不应该绘制Fw
vs t
)
我知道使用傅立叶变换/ fft可以解决稳态响应,我只是遗漏了一些东西!我需要帮助和理解!!
答案 0 :(得分:0)
运行您提供的代码并将结果与your other question中发布的RK4代码进行比较,我们得到以下答案:
其中蓝色曲线表示基于FFT的实现,红色曲线表示您的备用RK4实现。正如您所指出的,曲线是完全不同的。
最明显的问题当然是幅度,这个问题中发布的代码幅度差异的主要来源与我在my answer to your other question中指出的相同:
dt
正确地缩放求和值。基于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>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
。
通过将驱动力表示为a,可以将上述方法推广到更任意的周期性驱动力 傅立叶级数(假设驱动力函数满足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
案例。在这种情况下,振荡永远不会消失,并且均匀方程的一般解决方案不一定是微不足道的。
在这种情况下,最终的“稳态”可能会或可能不会与驱动力具有相同的周期。事实上,如果一般解的周期振荡与驱动力的周期与有理数(整数比)无关,那么它可能根本不是周期性的。