已知质量矩阵和刚度矩阵M=[10 0;0 2],K=[1000 -200;-200 200],麻烦使用matlab程序来进行绘制响应的波形图和傅里叶变换的幅值谱图。(fft时注意横纵坐标的数值,fourier变换后纵坐标需要除以N/2,fft(x)/N*2.。)
时间: 2023-06-20 15:06:55 浏览: 183
单元质量和刚度矩阵
好的,以下是Matlab程序:
```
%定义质量矩阵和刚度矩阵
M = [10 0; 0 2];
K = [1000 -200; -200 200];
%求解特征值和特征向量
[V, D] = eig(K, M);
%求解自然频率和阻尼比
omega_n = sqrt(diag(D));
zeta = [0.1 0.2];
%定义时间范围和时间步长
t = 0:0.01:10;
dt = t(2) - t(1);
%定义激励力信号
F = zeros(size(t));
F(1:100) = 10;
%定义初始位移和速度
q0 = [0; 0];
v0 = [0; 0];
%求解强迫响应
q = zeros(2, length(t));
for i = 1:length(zeta)
c = 2*zeta(i)*omega_n(i);
for j = 2:length(t)
q(:, j) = exp(-zeta(i)*omega_n(i)*t(j))*((q0 - V(:, i)*((V(:, i)'*q0)/(V(:, i)'*M*V(:, i))))*cos(omega_n(i)*sqrt(1-zeta(i)^2)*t(j))...
+ (v0 + (q0 - V(:, i)*((V(:, i)'*q0)/(V(:, i)'*M*V(:, i))))*zeta(i)*omega_n(i)*V(:, i)/(V(:, i)'*M*V(:, i))...
*sin(omega_n(i)*sqrt(1-zeta(i)^2)*t(j)))/sqrt(1-zeta(i)^2)...
+ V(:, i)*(F(j-1)/omega_n(i)/omega_n(i)/sqrt((1-zeta(i)^2)^2+(2*zeta(i)*sqrt(1-zeta(i)^2))^2));
end
%绘制响应的波形图
figure(i)
plot(t, q(1, :), 'r', t, q(2, :), 'b')
xlabel('Time (s)')
ylabel('Displacement (m)')
legend('q1', 'q2')
title(['Forced Response with \zeta = ' num2str(zeta(i))])
%求解傅里叶变换的幅值谱图
N = length(q(1, :));
Y = fft(q(1, :))/N*2;
f = 1/dt*(0:N/2-1)/N;
figure(i+2)
plot(f, abs(Y(1:N/2)))
xlabel('Frequency (Hz)')
ylabel('Magnitude')
title(['FFT of q1 with \zeta = ' num2str(zeta(i))])
end
```
程序中,首先定义了质量矩阵M和刚度矩阵K,然后求解特征值和特征向量,进而得到自然频率和阻尼比。接着定义了时间范围和时间步长,并设定了激励力信号、初始位移和速度。然后,利用强迫响应的公式求解了两个自由度系统的响应,并分别绘制了波形图和傅里叶变换的幅值谱图。最后,利用Matlab的fft函数进行傅里叶变换,并注意将变换后的结果除以N/2。
阅读全文