振动系统建模与分析:模态矩阵、系统矩阵及响应计算
发布时间: 2025-08-17 00:06:09 阅读量: 1 订阅数: 4 

# 振动系统建模与分析:模态矩阵、系统矩阵及响应计算
## 1. 引言
在振动系统的分析中,准确建模和计算系统响应至关重要。本文将详细介绍如何设置阻尼、定义模态矩阵和频率,构建系统矩阵、输入矩阵、输出矩阵和直接传输矩阵,以及计算频率响应和阶跃响应。同时,还会探讨模型降阶的方法和效果。
## 2. 阻尼、模态矩阵和频率的定义
### 2.1 阻尼值输入
首先,需要输入阻尼值 `zeta`,如果未输入则使用默认值 0.02(即临界阻尼的 2%)。
```matlab
zeta = input('enter value for damping, .02 is 2% of critical (default) ... ');
if (isempty(zeta))
zeta = .02;
end
```
### 2.2 模态矩阵和频率的定义
定义了三种不同的模态矩阵和频率向量:
1. **全模态模型**:使用所有模态和频率,保持原始顺序。
```matlab
xnnew = xn(:,(1:num_modes_total));
freqnew = freqvec((1:num_modes_total));
```
2. **未排序降阶模型**:使用前 `num_modes_used` 个模态,保持原始顺序。
```matlab
xnnew_nosort = xn(:,1:num_modes_used);
freqnew_nosort = freqvec(1:num_modes_used);
```
3. **排序降阶模型**:使用前 `num_modes_used` 个具有最高直流增益的模态。
```matlab
xnnew_sort = xn(:,index_sort(1:num_modes_used));
freqnew_sort = freqvec(index_sort(1:num_modes_used));
```
## 3. 系统矩阵 “a” 的设置
设置了三个状态空间系统矩阵:
1. **全模态系统矩阵 “a”**:包含所有模态,按原始顺序排列。
2. **未排序降阶系统矩阵 “a_nosort”**:具有降阶大小,模态按原始顺序排列。
3. **排序降阶系统矩阵 “a_sort”**:具有降阶数量的模态,按直流增益排序。
### 3.1 定义变量
```matlab
% 全模态系统矩阵变量
w = freqnew*2*pi;
w2 = w.^2;
zw = 2*zeta*w;
% 未排序降阶系统矩阵变量
w_nosort = freqnew_nosort*2*pi;
w2_nosort = w_nosort.^2;
zw_nosort = 2*zeta*w_nosort;
% 排序降阶系统矩阵变量
w_sort = freqnew_sort*2*pi;
w2_sort = w_sort.^2;
zw_sort = 2*zeta*w_sort;
```
### 3.2 定义矩阵大小
```matlab
asize = 2*num_modes_total;
asize_red = 2*num_modes_used;
disp(' ');
disp(' ');
disp(['size of system matrix a is ',num2str(asize)]);
disp(['size of reduced system matrix a is ',num2str(asize_red)]);
```
### 3.3 设置矩阵
```matlab
% 全模态系统矩阵 “a”
a = zeros(asize);
for col = 2:2:asize
row = col-1;
a(row,col) = 1;
end
for col = 1:2:asize
row = col+1;
a(row,col) = -w2((col+1)/2);
end
for col = 2:2:asize
row = col;
a(row,col) = -zw(col/2);
end
% 未排序降阶系统矩阵 “a_nosort”
a_nosort = zeros(asize_red);
for col = 2:2:asize_red
row = col-1;
a_nosort(row,col) = 1;
end
for col = 1:2:asize_red
row = col+1;
a_nosort(row,col) = -w2_nosort((col+1)/2);
end
for col = 2:2:asize_red
row = col;
a_nosort(row,col) = -zw_nosort(col/2);
end
% 排序降阶系统矩阵 “a_sort”
a_sort = zeros(asize_red);
for col = 2:2:asize_red
row = col-1;
a_sort(row,col) = 1;
end
for col = 1:2:asize_red
row = col+1;
a_sort(row,col) = -w2_sort((col+1)/2);
end
for col = 2:2:asize_red
row = col;
a_sort(row,col) = -zw_sort(col/2);
end
```
## 4. 输入矩阵 “b” 的设置
同样设置了三个输入矩阵:
1. **全模态输入矩阵 “b”**
2. **未排序降阶输入矩阵 “b_nosort”**
3. **排序降阶输入矩阵 “b_sort”**
### 4.1 计算力向量
```matlab
% 物理力向量
f_physical = zeros(numdof,1);
f_physical(mid_node_row) = 1.0;
% 主坐标力向量
f_principal = xnnew'*f_physical;
f_principal_nosort = xnnew_nosort'*f_physical;
f_principal_sort = xnnew_sort'*f_physical;
```
### 4.2 设置输入矩阵
```matlab
% 全模态输入矩阵 “b”
b = zeros(2*num_modes_total,1);
for cnt = 1:num_modes_total
b(2*cnt) = f_principal(cnt);
end
% 未排序降阶输入矩阵 “b_nosort”
b_nosort = zeros(2*num_modes_used,1);
for cnt = 1:num_modes_used
b_nosort(2*cnt) = f_principal_nosort(cnt);
end
% 排序降阶输入矩阵 “b_sort”
b_sort = zeros(2*num_modes_used,1);
for cnt = 1:num_modes_used
b_sort(2*cnt) = f_principal_sort(cnt);
end
```
## 5. 输出矩阵 “c” 和直接传输矩阵 “d” 的设置
输出矩阵 “c” 分为位移矩阵 “cdisp” 和速度矩阵 “cvel”,直接传输矩阵 “d” 为零。
### 5.1 设置位移和速度矩阵
```matlab
% 全模态位移和速度矩阵
for col = 1:2:2*length(freqnew)
for row = 1:numdof
cdisp(row,col) = xnnew(row,ceil(col/2));
cvel(row,col) = 0;
end
end
for col = 2:2:2*length(freqnew)
for row = 1:numdof
cdisp(row,col) = 0;
cvel(row,col) = xnnew(row,col/2);
end
end
% 未排序降阶位移和速度矩阵
for col = 1:2:2*length(freqnew_nosort)
for row = 1:numdof
cdisp_nosort(row,col) = xnnew_nosort(row,ceil(col/2));
cvel_nosort(row,col) = 0;
end
end
for col = 2:2:2*length(freqnew_nosort)
for row = 1:numdof
cdisp_nosort(row,col) = 0;
cvel_nosort(row,col) = xnnew_nosort(row,col/2);
end
end
% 排序降阶位移和速度矩阵
for col = 1:2:2*length(freqnew_sort)
for row = 1:numdof
cdisp_sort(row,col) = xnnew_sort(row,ceil(col/2));
cvel_sort(row,col) = 0;
end
end
for col = 2:2:2*length(freqnew_sort)
for row = 1:numdof
cdisp_sort(row,col) = 0;
cvel_sort(row,col) = xnnew_sort(row,col/2);
end
end
```
### 5.2 设置直接传输矩阵
```matlab
d = [0];
```
## 6. 频率范围、“ss” 设置和 Bode 计算
### 6.1 定义频率向量
```matlab
freqlo = 10;
freqhi = 100000;
f
```
0
0
相关推荐










