这是一个质量弹簧 - 阻尼系统,具有脉冲响应h
和任意强制函数f
(在这种情况下为cos(t)
)。我正在尝试使用Matlab的FFT函数来在频域中执行卷积。我期望输出(ifft(conv)
)是具有指定强制的质量弹簧阻尼系统的解决方案,但是我的情节看起来完全错误!所以,我必须实施一些错误的东西。请帮我在下面的代码中找到我的错误!感谢
clear
%system parameters
m=4;
k=256;
c=1;
wn=sqrt(k/m);
z=c/2/sqrt(m*k);
wd=wn*sqrt(1-z^2);
w=sqrt(4*k*m-c^2)/(2*m);
x0=0; %initial conditions
v0=0;
%%%%%%%%%%%%%%%%%%%%%%%%%
t=0:.01:2*pi ;%time vector
f=[cos(t),zeros(1,length(t)-1)]; %force f
F=fft(f);
h=[1/m/wd*exp(-z*wn*t).*sin(wd*t),zeros(1,length(t)-1)]; %impulse response
H=fft(h);
conv=H.*F; %convolution is multiplication in freq domain
plot(0:.01:4*pi,ifft(conv))
要查看预期的内容,请运行此代码。输入cos(t); 4; 1; 256为输入。您可以看到它的振幅与上述FFT代码生成的曲线大不相同。
%%%FOR UNDERDAMPED SYSTEMS
func=input('enter function of t---> ','s');
m=input('mass ');
c=input('c ');
k=input('k ');
z=c/2/sqrt(k*m);
wn=sqrt(k/m);
wd=wn*sqrt(1-z^2);
dt=.001;
tMax=20;
x0=0;
v0=0;
t0=0;
t=0:dt:tMax;
X(:,1)=[x0;v0;t0];
functionForce=inline(func);
tic
for i=1:length(t)-1
a=([0, 1, 0; -wn^2, -2*z*wn, 0; 0,0,0]*[X(1,i);X(2,i);X(3,i)]+[0;functionForce(X(3,i));0]);
Xtemp=X(:,i)+[0;0;dt/2] + a*dt/2;
b=([0, 1, 0; -wn^2, -2*z*wn, 0; 0,0,0]*[Xtemp(1);Xtemp(2);Xtemp(3)]+[0;functionForce(X(3,i));0]);
Xtemp=Xtemp+[0;0;dt/2] + b*dt/2;
c=([0, 1, 0; -wn^2, -2*z*wn, 0; 0,0,0]*[Xtemp(1);Xtemp(2);Xtemp(3)]+[0;functionForce(X(3,i));0]);
Xtemp=Xtemp + [0;0;dt] +c*dt;
d=([0, 1, 0; -wn^2, -2*z*wn, 0; 0,0,0]*[Xtemp(1);Xtemp(2);Xtemp(3)]+[0;functionForce(X(3,i));0]);
X(:,i+1)=X(:,i)+(a+2*b+2*c+d)*dt/6+[0;0;dt];
end
toc
figure(1)
axis([0 tMax min(X(1,:)) max(X(1,:))])
plot(t,X(1,:))
答案 0 :(得分:2)
初始瞬态将出现在FFT方法中,因此您需要增加时间跨度(例如t=0:0.01:15*pi
)以确保结果包括稳定状态。顺便提一下,由于您在相同的持续时间后截断h
,因此增加时间跨度也会使您的脉冲响应h
更接近实际无限长度脉冲响应。
所以,将代码更新为:
T=15*pi;
N=floor(T/.01);
t=[0:N-1]*0.01; ;%time vector
...
plot([0:2*N-2]*0.01, real(ifft(conv)));
axis([0 T]); % only show the duration where the driving force is active
会相应地显示以下回复:
显示初始瞬态,最终显示稳态。您可能会注意到该图与您的备用实现类似,直到比例因子。
这种缩放的差异来自两个因素。第一个问题仅仅是因为基于FFT的实现中的卷积计算了一个总和,该总和不是时间步长的权重(与第二个实现中使用的dt
缩放比较)。第二个问题来自于第二个实施没有考虑到驱动力影响的质量m
。
在考虑这两个因素后,您应该得到以下答案:
其中蓝色曲线表示基于FFT的实现(与上面的曲线相同,但按dt=0.01
缩小),红色曲线表示您的备用实现(functionForce
除以{{1 }})。