结构动力响应求解的数值方法

结构动力响应求解的数值方法
慕风本篇文章主要介绍结构动力学中结构响应求解的数值方法:杜哈梅积分、中心差分法和NewMark-β法,并利用python实现。对于matlab版本,将python代码直接扔给AI,应该不难得到,故此处不再给出。
- 地震波时程文件,单位为重力加速度g。
数值算法
杜哈梅积分
中心差分法
NewMark-β法
示例
1 | #### README #### |
由于杜哈梅积分利python实现起来非常耗时,所以此处也给出其matlab版本。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70clear all
clc
% 结构参数
M = diag([120, 120, 120, 120, 120, 120, 120, 110]); % 质量矩阵
k = [300, 260, 260, 260, 200, 200, 200, 200] * 10^3; % 刚度矩阵
K = zeros(length(k), length(k)); % 初始化刚度矩阵
% 刚度矩阵
for i = 1:length(k)-1
K(i, i) = k(i) + k(i+1);
K(i+1, i) = -k(i+1);
K(i, i+1) = -k(i+1);
end
K(end, end) = k(end);
% 阻尼矩阵
a0 = 0.6296;
a1 = 0.003075;
C = a0 * M + a1 * K;
% 地震动时程曲线
time_step = 0.005;
ground_acc = load('ElCentro.txt'); % 读取地震加速度数据
ground_acc = ground_acc * 9.8 * 10^3; % 转换为单位为 mm/s^2 的地震加速度
time = (0:length(ground_acc)-1) * time_step;
% 计算特征值和特征向量
[eigenvectors, eigenvalues] = eig(K, M);
% 初始化总响应
num_modes = length(eigenvalues);
response = zeros(length(ground_acc), 1);
response_test = zeros(length(ground_acc),length(k));
% 逐个振型进行计算并叠加响应
for mode_idx = 1:num_modes
mode = real(eigenvectors(:, mode_idx)); % 当前振型
mode = mode / mode(end); % 规范化处理:顶层振型位移为1
% 计算该振型的广义质量、刚度和阻尼矩阵
M1 = mode' * M * mode;
K1 = mode' * K * mode;
C1 = mode' * C * mode;
% 计算该振型的固有频率、阻尼比和阻尼频率
w1 = sqrt(K1 / M1);
s1 = C1 / (2 * M1 * w1);
wd1 = sqrt(1 - s1^2) * w1;
% 计算该振型的响应
x_mode = zeros(length(ground_acc), 1); % 地震响应时程
for i = 1:length(ground_acc)
temp = 0;
for j = 1:i
p1 = -mode' * M * ones(length(k), 1) * ground_acc(j);
temp = temp + exp(-s1 * w1 * (i - j) * time_step) * sin(wd1 * (i - j) * time_step) * p1 *time_step/ (M1 * wd1);
end
x_mode(i) = temp;
end
% 将该振型的响应加到总响应中
response = response + x_mode;
end
% 绘制顶层位移随时间变化曲线
figure;
plot([time, time(end) + time_step], [0; response]);
xlabel('\it{t}\rm{(s)}');
ylabel('\it{x}\rm{(mm)}');
saveas(gcf, 'Duhamel_Results_matlab.png');
结果
三种方法得到的结果如下图所示。(以顶层相对位移为例)
杜哈梅积分结果(matlab):
中心差分法结果:
Newmark-β法结果: