这是一个具有脉冲响应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,:))
初始瞬变将出现在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
除以m
)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句