Rで1自由度系剛性劣化型非線形地震応答を計算します。
本ポストのデータ(地震波、パラメータ)、数式、導出は全て以下の資料(以降「引用資料」) を引用参照しています。
- https://www.ritsumei.ac.jp/se/rv/izuno/software.html
- 酒井 久和, 澤田 純男, 土岐 憲三, 収束計算を行わない動的非線形FEMのための時間積分法, 土木学会論文集, 1995, 1995 巻, 507 号, p. 137-147
「引用資料1」で公開されています「1自由度系剛性劣化型非線形地震応答計算」のエクセルシート(clough-j.xlsx)をRで実現します。
始めに以下のパラメータを入力します。
library(dplyr)
<- 0.01 # 時間刻み(s)
Delta_t <- 3000 # データ数
N <- 740 # 質量(t)
m <- 0.02 # 減衰定数
h <- 2795 # 降伏耐力(kN)
Py <- 0.0265 # 降伏変位(m)
delta_y <- 4341 # 最大耐力(kN)
Pu <- 0.0823 # 最大耐力時変位(m) delta_u
以下は上記入力パラメータのみで決定されるパラメータです。
# 初期剛性(kN/m) = 降伏耐力(kN) / 降伏変位(m)
<- Py / delta_y
k1 # 第2剛性(kN/m) = (終局耐力(kN) - 降伏耐力(kN)) / (終局変位(m) - 降伏変位(m))
<- (Pu - Py) / (delta_u - delta_y)
k2 # 固有円振動数(rad/s) = (初期剛性(kN/m)/質量(t))^0.5
<- (k1 / m)^0.5
omega # 固有振動数(Hz)
<- omega / 2 / pi
f # 固有周期 T(s)
<- 2 * pi / omega
T # 粘性減衰係数(kN・s/m) = 2*減衰定数*(質量*初期剛性)^0.5
<- 2 * h * (m * k1)^0.5
viscous_damping_coefficient list(k1 = k1, k2 = k2, omega = omega, f = f, T = T, viscous_damping_coefficient = viscous_damping_coefficient)
$k1
[1] 105471.7
$k2
[1] 27706.09
$omega
[1] 11.93856
$f
[1] 1.900082
$T
[1] 0.5262932
$viscous_damping_coefficient
[1] 353.3815
サンプルとする地震波(m/s2)は以下のとおりです( Figure 1 )。
library(ggplot2)
<- Delta_t * seq(N)
T ggplot(mapping = aes(x = T, y = earthquake_wave)) +
geom_line() +
geom_hline(yintercept = 0) +
labs(y = "地震波(m/s^2)")
最大地震加速度(m/s2)を求めます、
<- max(abs(earthquake_wave))) (maximum_earthquake_acceleration
[1] 8.1202
以下に各種応答の算出式を記します。
相対変位(m)
最小復元力(kN)
最大変位(m)
最大復元力(kN)
復元力(kN)
X0(m)
Y1(kN)
Y2(kN)
Y3(kN)
Y4(kN)
Y5(kN)
調整外力(kN)
調整外力の増分(kN)
相対速度(m/s)
相対加速度(m/s2)
絶対加速度(m/s2)
履歴エネルギー(kN・m)
入力エネルギー(kN・m)
累積履歴エネルギー吸収量(kN・m)
累積入力エネルギー量(kN・m)
最大塑性率(-)
それではサンプル地震波に対する時間刻み毎の応答を求めます。Figure 2 が各種応答の推移です。
<-
relative_displacement <-
minimum_displacement <-
minimum_restoring <-
maximal_displacement <-
maximal_restoring <- Y1 <- Y2 <- Y3 <- Y4 <- Y5 <-
X0 <-
median_y1y2y4 <-
median_y1y3y5 <-
restoring <-
external_force <-
external_force_diff <-
relative_velocity <-
relative_acceleration <-
absolute_acceleration <-
hysteretic_energy <-
input_energy <-
cumulative_hysteretic_energy_absorption <- rep(0, N)
cumulative_input_energy # 式(3)
<- k1 + 2 * viscous_damping_coefficient / Delta_t + 4 * m / Delta_t^2
eq03 # 式(23)
<- m + Delta_t * viscous_damping_coefficient / 2
eq23 # 初期値
1] <- -delta_y # 式(5)
minimum_displacement[1] <- -Py # 式(7)
minimum_restoring[1] <- delta_y # 式(9)
maximal_displacement[1] <- Py # 式(11)
maximal_restoring[1] <- k1 * relative_displacement[1] # 式(13)
restoring[for (n in 2:N) {
# 相対変位 式(4)
<- -m * earthquake_wave[n]
term1 <- external_force[n - 1]
term2 # 式(1)
<- 4 * relative_displacement[n - 1] / Delta_t^2
eq01_1 <- 4 * relative_velocity[n - 1] / Delta_t
eq01_2 <- relative_acceleration[n - 1]
eq01_3 <- m * (eq01_1 + eq01_2 + eq01_3)
eq01 <- viscous_damping_coefficient * (2 * relative_displacement[n - 1] / Delta_t + relative_velocity[n - 1])
eq02 <- (term1 + term2 + eq01 + eq02) / eq03
relative_displacement[n] # 最小変位 式(6)
<- min(relative_displacement[n], minimum_displacement[n - 1])
minimum_displacement[n] # 最小復元力 式(8)
<- min(restoring[n - 1], minimum_restoring[n - 1])
minimum_restoring[n] # 最大変位 式(10)
<- max(relative_displacement[n], maximal_displacement[n - 1])
maximal_displacement[n] # 最大復元力 式(12)
<- max(restoring[n - 1], maximal_restoring[n - 1])
maximal_restoring[n] # 復元力 式(20)
<- relative_displacement[n - 1] - restoring[n - 1] / k1 # 式(14)
X0[n] <- k1 * (relative_displacement[n] - X0[n]) # 式(15)
Y1[n] <- (relative_displacement[n] - X0[n]) * maximal_restoring[n] / (maximal_displacement[n] - X0[n]) # 式(16)
Y2[n] <- (relative_displacement[n] - X0[n]) * minimum_restoring[n] / (minimum_displacement[n] - X0[n]) # 式(17)
Y3[n] <- restoring[n - 1] + (maximal_restoring[n] - restoring[n - 1]) * (relative_displacement[n] - relative_displacement[n - 1]) / (maximal_displacement[n] - relative_displacement[n - 1]) # 式(18)
Y4[n] <- restoring[n - 1] + (restoring[n - 1] - minimum_restoring[n]) * (relative_displacement[n] - relative_displacement[n - 1]) / (relative_displacement[n - 1] - minimum_displacement[n]) # 式(19)
Y5[n] <- median(c(Y1[n], Y2[n], Y4[n]))
median_y1y2y4[n] <- median(c(Y1[n], Y3[n], Y5[n]))
median_y1y3y5[n] if (relative_displacement[n] >= relative_displacement[n - 1]) {
if (relative_displacement[n] > maximal_displacement[n - 1]) {
<- Py + (relative_displacement[n] - delta_y) * k2
restoring[n] else {
} <- median_y1y2y4[n]
restoring[n]
}else {
} if (relative_displacement[n] < minimum_displacement[n - 1]) {
<- -Py + (relative_displacement[n] + delta_y) * k2
restoring[n] else {
} <- median_y1y3y5[n]
restoring[n]
}
}# 調整外力 式(21)
<- k1 * relative_displacement[n] - restoring[n]
external_force[n] # 調整外力の増分 式(22)
<- external_force[n] - external_force[n - 1]
external_force_diff[n] # 相対速度 式(24)
<- -1 * relative_velocity[n - 1] + 2 * (relative_displacement[n] - relative_displacement[n - 1]) / Delta_t + external_force_diff[n] * Delta_t / 2 / eq23
relative_velocity[n] # 相対加速度 式(25)
<- -1 * relative_acceleration[n - 1] - 4 * relative_velocity[n - 1] / Delta_t + 4 * (relative_displacement[n] - relative_displacement[n - 1]) / Delta_t^2 + external_force_diff[n] / eq23
relative_acceleration[n] # 履歴エネルギー 式(27)
<- (restoring[n] + restoring[n - 1]) * (relative_displacement[n] - relative_displacement[n - 1]) / 2
hysteretic_energy[n] # 入力エネルギー 式(28)
<- -1 * (earthquake_wave[n - 1] * relative_velocity[n - 1] + earthquake_wave[n] * relative_velocity[n]) * Delta_t / 2 * m
input_energy[n] # 累積履歴エネルギー吸収量 式(29)
<- hysteretic_energy[n] + cumulative_hysteretic_energy_absorption[n - 1]
cumulative_hysteretic_energy_absorption[n] # 累積入力エネルギー量 式(30)
<- input_energy[n] + cumulative_input_energy[n - 1]
cumulative_input_energy[n]
}# 絶対加速度 式(26)
<- earthquake_wave + relative_acceleration absolute_acceleration
<-
dfresponse data.frame(
T,
earthquake_wave,
relative_displacement,
restoring,
external_force,
relative_velocity,
relative_acceleration,
absolute_acceleration,
hysteretic_energy,
input_energy,
cumulative_hysteretic_energy_absorption,
cumulative_input_energy
)colnames(dfresponse) <-
c(
"時間軸(s)",
"地震波(m/s^2)",
"相対変位(m)",
"復元力(kN)",
"調整外力(kN)",
"相対速度(m/s)",
"相対加速度(m/s^2)",
"絶対加速度(m/s^2)",
"履歴エネルギー(kN・m)",
"入力エネルギー(kN・m)",
"累積履歴エネルギー吸収量(kN・m)",
"累積入力エネルギー量(kN・m)"
)<- dfresponse %>% tidyr::gather(key = "key", value = "value", colnames(.)[-1])
tidyresponse $key <- tidyresponse$key %>% factor(levels = unique(.))
tidyresponse%>% ggplot(mapping = aes(x = `時間軸(s)`, y = value)) +
tidyresponse geom_line() +
facet_wrap(. ~ key, scale = "free_y", ncol = 3) +
theme(axis.title.y = element_blank()) +
geom_hline(yintercept = 0)
最後に各応答の最大値を確認します。
list(
`最大応答加速度(m/s^2)` = max(abs(absolute_acceleration)),
`最大応答変位(m)` = max(abs(relative_displacement)),
`最大応答速度(m/s)` = max(abs(relative_velocity)),
`最大復元力(kN)` = max(abs(restoring)),
`最大塑性率(-)` = max(abs(relative_displacement)) / delta_y
)
$`最大応答加速度(m/s^2)`
[1] 8.256843
$`最大応答変位(m)`
[1] 0.1454733
$`最大応答速度(m/s)`
[1] 0.960762
$`最大復元力(kN)`
[1] 6091.285
$`最大塑性率(-)`
[1] 5.489557
以上です。