Skip to content

Commit 7388fb8

Browse files
committed
Created using Colab
1 parent 44cc9d1 commit 7388fb8

File tree

1 file changed

+101
-0
lines changed

1 file changed

+101
-0
lines changed
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "markdown",
5+
"metadata": {
6+
"id": "view-in-github",
7+
"colab_type": "text"
8+
},
9+
"source": [
10+
"<a href=\"https://colab.research.google.com/github/GEORMC/Nnumerical_Methods_Course/blob/main/Newmark_Beta_SDOF_Load_Cases_(1).ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
11+
]
12+
},
13+
{
14+
"cell_type": "code",
15+
"source": [
16+
"import numpy as np\n",
17+
"import pandas as pd\n",
18+
"import nbformat as nbf\n",
19+
"\n",
20+
"# Initialize parameters for Newmark-beta method\n",
21+
"m = 1.0 # mass in kg\n",
22+
"c = 0.1 # damping coefficient in Ns/m\n",
23+
"k = 2.0 # stiffness in N/m\n",
24+
"dt = 0.1 # time step in seconds\n",
25+
"t_max = 1.0 # maximum time in seconds\n",
26+
"gamma = 0.5 # Newmark parameter (constant average acceleration)\n",
27+
"beta = 0.25 # Newmark parameter (constant average acceleration)\n",
28+
"\n",
29+
"# Time steps\n",
30+
"n_steps = int(t_max / dt) + 1\n",
31+
"time = np.arange(0, t_max + dt, dt)\n",
32+
"\n",
33+
"# Prepare force functions\n",
34+
"def constant_load(t):\n",
35+
" return 1.0 # constant force\n",
36+
"\n",
37+
"def variable_load(t):\n",
38+
" return np.sin(2 * np.pi * t) # sinusoidal force\n",
39+
"\n",
40+
"def earthquake_load(t):\n",
41+
" return 0.3 * np.exp(-((t - 0.5) ** 2) / (2 * 0.1 ** 2)) # synthetic earthquake\n",
42+
"\n",
43+
"# Function to solve SDOF system using Newmark-beta method for a given load function\n",
44+
"def newmark_beta(load_func):\n",
45+
" # Initialize displacement, velocity, and acceleration arrays\n",
46+
" u = np.zeros(n_steps) # displacement\n",
47+
" v = np.zeros(n_steps) # velocity\n",
48+
" a = np.zeros(n_steps) # acceleration\n",
49+
"\n",
50+
" # Initial acceleration from equilibrium equation at t=0\n",
51+
" a[0] = (load_func(0) - c * v[0] - k * u[0]) / m\n",
52+
"\n",
53+
" # Precompute constants for Newmark method\n",
54+
" a0 = 1 / (beta * dt ** 2) * m + gamma / (beta * dt) * c\n",
55+
" a1 = 1 / (beta * dt) * m + (gamma / beta - 1) * c\n",
56+
" a2 = (1 / (2 * beta) - 1) * m + dt * (gamma / (2 * beta) - 1) * c\n",
57+
"\n",
58+
" # Iterate through each time step\n",
59+
" for n in range(n_steps - 1):\n",
60+
" # Calculate effective force\n",
61+
" p_eff = load_func(time[n+1]) + a0 * u[n] + a1 * v[n] + a2 * a[n]\n",
62+
"\n",
63+
" # Displacement at next time step\n",
64+
" u[n+1] = p_eff / (k + a0)\n",
65+
"\n",
66+
" # Velocity and acceleration at next time step\n",
67+
" v[n+1] = gamma / (beta * dt) * (u[n+1] - u[n]) + (1 - gamma / beta) * v[n] + dt * (1 - gamma / (2 * beta)) * a[n]\n",
68+
" a[n+1] = 1 / (beta * dt ** 2) * (u[n+1] - u[n]) - 1 / (beta * dt) * v[n] - (1 / (2 * beta) - 1) * a[n]\n",
69+
"\n",
70+
" return pd.DataFrame({\"Time (s)\": time, \"Displacement (m)\": u, \"Velocity (m/s)\": v, \"Acceleration (m/s^2)\": a})\n",
71+
"\n",
72+
"# Calculate results for each load case\n",
73+
"df_constant = newmark_beta(constant_load)\n",
74+
"df_variable = newmark_beta(variable_load)\n",
75+
"df_earthquake = newmark_beta(earthquake_load)\n",
76+
"\n"
77+
],
78+
"metadata": {
79+
"id": "A3cOqETNMMh9"
80+
},
81+
"id": "A3cOqETNMMh9",
82+
"execution_count": 6,
83+
"outputs": []
84+
}
85+
],
86+
"metadata": {
87+
"colab": {
88+
"provenance": [],
89+
"include_colab_link": true
90+
},
91+
"language_info": {
92+
"name": "python"
93+
},
94+
"kernelspec": {
95+
"name": "python3",
96+
"display_name": "Python 3"
97+
}
98+
},
99+
"nbformat": 4,
100+
"nbformat_minor": 5
101+
}

0 commit comments

Comments
 (0)