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