SISO for Event History#

[1]:
import numpy as np
from mdof.utilities.printing import *
import mdof
from mdof import modal, transform
from mdof.utilities.config import Config

Upload a Dataset and Identify Spectral Quantities#

[2]:
inputs = np.loadtxt("./uploads/opensees_sdof/Accgrd_set1.csv", delimiter=",")
outputs = np.loadtxt("./uploads/opensees_sdof/Accrsp_set1.csv", delimiter=",")
# inputs = np.loadtxt("./uploads/opensees_sdof/Accgrd_set2.csv", delimiter=",")
# outputs = np.loadtxt("./uploads/opensees_sdof/Accrsp_set2.csv", delimiter=",")
t = inputs[0,:]
dt = t[1] - t[0]

Method Inputs#

See `01_SISO_Intro <./01_SISO_Intro.ipynb>`__ for parameter definitions

[3]:
# Set parameters
conf = Config()
conf.m  = 300
conf.horizon = 140
conf.nc = 140
conf.order  =   2
conf.a  =   0
conf.b  =   0
conf.l  =  10
conf.g  =   3
conf.damping = 0.0001
conf.period_band = (0.1, 3.0)

Perform System Identification#

[4]:
mode_predictions = np.empty((inputs.shape[0]-1, 2))
plt.rc
fig, ax = plt.subplots(figsize=(8,4))
for i,motion in enumerate(inputs[1:,:]):
    conf.decimation = 8         # transfer function decimation
    A,B,C,D = mdof.system(method="srim", inputs=motion, outputs=outputs[i+1,:], **conf)
    ss_modes = modal.system_modes((A,B,C,D),dt,decimation=conf.decimation)
    mode_predictions[i,:] = [[1/v["freq"], v["damp"]] for v in ss_modes.values()][0]  # save predicted period and damping
    conf.decimation = 1         # transfer function decimation
    periods, amplitudes = transform.fourier_transfer(inputs=motion, outputs=outputs[i+1,:], step=dt, **conf)
    ax.plot(periods, amplitudes, color="blue", label=["Fourier" if i==0 else None][0])
    periods, amplitudes = transform.response_transfer(inputs=motion, outputs=outputs[i+1,:], step=dt, periods=periods, threads=10, **conf)
    ax.plot(periods, amplitudes, color="green", label=["Response Spectrum" if i==0 else None][0])
    ax.vlines([1/v["freq"] for v in ss_modes.values()], 0, max(amplitudes), colors="r", linestyles="--", label=["State Space" if i==0 else None][0])
plt.legend()
plt.xlabel("Period (s)")
plt.ylabel("Amplitude")
print("   period(s)  damping\n", mode_predictions)
100%|█████████▉| 885/886 [00:00<00:00, 281528.94it/s]
100%|█████████▉| 885/886 [00:00<00:00, 174254.02it/s]
100%|█████████▉| 885/886 [00:00<00:00, 115929.89it/s]
100%|█████████▉| 885/886 [00:00<00:00, 165130.08it/s]
100%|█████████▉| 885/886 [00:00<00:00, 237474.19it/s]
100%|█████████▉| 885/886 [00:00<00:00, 217175.23it/s]
100%|█████████▉| 885/886 [00:00<00:00, 161995.24it/s]
100%|█████████▉| 885/886 [00:00<00:00, 417919.28it/s]
100%|█████████▉| 885/886 [00:00<00:00, 213958.10it/s]
100%|█████████▉| 885/886 [00:00<00:00, 191288.79it/s]
100%|█████████▉| 885/886 [00:00<00:00, 159874.19it/s]
   period(s)  damping
 [[0.41068031 0.02342356]
 [0.41083068 0.02249289]
 [0.4107063  0.00068529]
 [0.41201371 0.02015356]
 [0.41051848 0.02368659]
 [0.4112227  0.02544649]
 [0.40933146 0.01991049]
 [0.41281326 0.0191038 ]
 [0.40928958 0.02311352]
 [0.41883737 0.0023086 ]
 [0.40943662 0.02034821]]
../_images/examples_03_SISO_History_7_2.png