Source code for smt_optim.benchmarks.misc.avt

import numpy as np
from smt_optim.benchmarks.base import BenchmarkProblem


# rhs for first-order system of ODEs in spring-mass system
[docs] def f(t, y, m, k): f = np.array([0.0, 0.0, 0.0, 0.0]) f[0] = y[2] f[1] = y[3] f[2] = (-k[0] - k[1]) / m[0] * y[0] + k[1] / m[0] * y[1] f[3] = k[1] / m[1] * y[0] + (-k[0] - k[1]) / m[1] * y[1] return f
# RK-4 method
[docs] def rk4(y0, t0, tf, h, m, k): # Calculating number of time steps n = int((tf - t0) / h) # Time-march with RK4 for i in range(n): k1 = h * (f(t0, y0, m, k)) k2 = h * (f((t0 + h / 2), (y0 + k1 / 2), m, k)) k3 = h * (f((t0 + h / 2), (y0 + k2 / 2), m, k)) k4 = h * (f((t0 + h), (y0 + k3), m, k)) kt = (k1 + 2 * k2 + 2 * k3 + k4) / 6.0 y0 = y0 + kt t0 = t0 + h return y0[0]
[docs] class Mass(BenchmarkProblem): def __init__(self): super().__init__() self.num_dim = 2 self.num_cstr = 0 self.num_fidelity = 2 self.bounds = np.array([ [1, 4], [1, 4] ]) self.costs = [0.15/9, 1] obj_hf = lambda x, dt=0.01: self.mass(x, dt) obj_lf = lambda x, dt=0.6: self.mass(x, dt) self.objective = [obj_lf, obj_hf] self.constraints = [] self.t0 = 0.0 self.tf = 6.0 self.y0 = np.array([1.0, 0.0, 0.0, 0.0]) self.k = np.array([1.0, 1.0])
[docs] def mass(self, x: np.ndarray, dt: float): f = rk4(self.y0, self.t0, self.tf, dt, x, self.k) return f
[docs] class Spring(BenchmarkProblem): def __init__(self): super().__init__() self.num_dim = 2 self.num_cstr = 0 self.num_fidelity = 2 self.bounds = np.array([ [1, 4], [1, 4] ]) self.costs = [0.15/9, 1] obj_hf = lambda x, dt=0.01: self.spring(x, dt) obj_lf = lambda x, dt=0.6: self.spring(x, dt) self.objective = [obj_lf, obj_hf] self.constraints = [] self.t0 = 0.0 self.tf = 6.0 self.y0 = np.array([1.0, 0.0, 0.0, 0.0]) self.m = np.array([1.0, 1.0])
[docs] def spring(self, x: np.ndarray, dt: float): f = rk4(self.y0, self.t0, self.tf, dt, self.m, x) return f
[docs] class SpringMass(BenchmarkProblem): def __init__(self): super().__init__() self.num_dim = 4 self.num_cstr = 0 self.num_fidelity = 2 self.bounds = np.array([ [1, 4], [1, 4] ]) self.costs = [0.15/9, 1] obj_hf = lambda x, dt=0.01: self.spring(x, dt) obj_lf = lambda x, dt=0.6: self.sping(x, dt) self.objective = [obj_lf, obj_hf] self.constraints = [] self.t0 = 0.0 self.tf = 6.0 self.y0 = np.array([1.0, 0.0, 0.0, 0.0])
[docs] def spring_mass(self, x: np.ndarray, dt: float): m = x[2:4] k = x[0:2] f = rk4(self.y0, self.t0, self.tf, dt, m, k) return f