import numpy as numpy
import matplotlib as plt
import pandas as pd
#Euler = y(x+h) = y(x) + h*f(x, y(x))
#looking at table A4.2, step size of 0.001 seems optimal
#y = cos t, harmonic oscilator
step_vals = numpy.linspace(0.0001, 0.005, 100) #not quite sure how the step sizes - todo: ask TA
def deriv(x1, x2):
return [x2, -x1]
avg_error = [];
final_error = [];
for step in step_vals:
y_0 = 1
y_1 = 0
t = numpy.arange(0, 100*numpy.pi, step)
yy_0 = []
yy_1 = []
true_vals = []
errors = []
for item in t:
[dy_0, dy_1] = deriv(y_0, y_1)
y_0 = y_0 + step*dy_0
y_1 = y_1 + step*dy_1
yy_0.append(y_0)
yy_1.append(y_1)
true_val = numpy.cos(item)
true_vals.append(true_val)
error = abs(y_0-true_val)
errors.append(error)
final_error.append(error)
avg_error.append(numpy.mean(errors))
df = pd.DataFrame();
df['step-values'] = pd.Series(step_vals);
df['final-error'] = pd.Series(final_error);
df['avg-error'] = pd.Series(avg_error);
df #the results confirm the table