In [ ]:
%load_ext autoreload
%autoreload
import common
from common import *
from sympy import init_printing
import sympy as sp
init_printing()
pp_euler = pp(euler_error)
In [139]:
def get_pos(results):
for result in results:
w = result['w']
yield {'1x': w[0], '1y': w[2], '2x': w[4], '2y': w[6], '3x': w[8], '3y': w[10]}
pp_pos = pp(get_pos)
In [142]:
# CP 6.3 10
from sympy.abc import t
from itertools import product
from operator import concat
from functools import reduce
# m1, m2, m3, g = sp.symbols("m_1 m_2 m_3 g")
m1, m2, m3, g = 0.3, 0.03, 0.03, 9.81
def F(t, y):
return body3(y, m1, m2, m3, g)
# y = body3_y()
# display(F(t, y))
iv = body3_iv((0, 0), (0, 0), (2, 2), (0.2, -0.2), (-2, -2), (-0.2, 0.2))
r = euler(F, h=0.005, t=10, iv=(0, iv), method=euler_rk4)
positions = get_pos(r)
common.plot_gen(positions, y_keys=('1y', '2y', '3y'), x_keys=['1x', '2x', '3x'])
In [141]:
# 6.3 CP 11
from sympy.abc import t
from itertools import product
from operator import concat
from functools import reduce
m1, m2, m3, g = 1, 1, 1, 1
def F(t, y):
return body3(y, m1, m2, m3, g)
iv = body3_iv((-0.970, 0.243), (-0.466, -0.433),
(0.970, -0.243), (-0.466, -0.433),
(0, 0), (2*0.466, 2*0.433))
r = euler(F, h=0.01, t=50, iv=(0, iv), method=euler_rk4)
positions = get_pos(r)
common.plot_gen(positions, y_keys=('1y', '2y', '3y'), x_keys=['1x', '2x', '3x'])
# Deloppg b
# Ja, hvis man gjør en liten endring i d/dx(x_3) så vil det få store utslag for banen, dvs de går fort ut av banene sin
In [143]:
# 6.4 CP 1
# f = lambda t, y: t
# f = lambda t, y: (t**2)*y
# f = lambda t, y: 2*(t+1)*y
# f = lambda t, y: 5*(t**4)*y
# f = lambda t, y: 1/(y**2)
f = lambda t, y: (t**3)/(y**2)
pp_euler(f, h=0.1, t=1, iv=(0, 1), method=euler_midpoint)
In [148]:
%matplotlib inline
# 6.4 CP 3
# f = lambda t, y: t
# f = lambda t, y: (t**2)*y
# f = lambda t, y: 2*(t+1)*y
# f = lambda t, y: 5*(t**4)*y
f = lambda t, y: 1/(y**2)
# f = lambda t, y: (t**3)/(y**2)
# pp_euler(f, h=10, t=100, iv=(0, 1), method=euler_rk4)
common.plot(euler_error(f, h=1, t=40, iv=(0, 1), method=euler_rk4), estimate_key='w', x_key='t')
In [150]:
# 6.4 CP 11
s, r, b = 10, 28, 8/3
def F(t, y):
return sp.Matrix([
[-s*y[0] + s*y[1]],
[-y[0]*y[2] + r*y[0] - y[1]],
[y[0]*y[1] - b*y[2]]
])
iv = sp.Matrix([[5], [5], [5]])
results = euler(F, h=0.01, t=40, iv=(0, iv), method=euler_rk4)
def transform(results):
for result in results:
yield {'x': result['w'][0], 'z': result['w'][2]}
common.plot_gen(transform(results), y_keys=('z'), x_keys=('x'))