import numpy as np
import matplotlib.pyplot as plt

def eksplisitt_euler(f, g, y0, z0, h, v):
	y = [y0]
	z = [z0]
	for i in range(1000):
		y.append(y[i] + h*f(y[i],z[i],v))
		z.append(z[i] + h*g(y[i],z[i]))
	return y, z

def symplektisk_euler(f, g, y0, z0, h, v):
	y = [y0]
	z = [z0]
	for i in range(1000):
		y.append(y[i] + h*f(y[i],z[i],v))
		z.append(z[i] + h*g(y[i+1],z[i]))
	return y, z

def f(y,z,v):
	return -2*y + z + v

def g(y,z):
	return y - 2*z

def losning(t,v,a,b):
	return -a*np.exp(-3*t) + b*np.exp(-t) + 2*v/3, a*np.exp(-3*t) + b*np.exp(-t) + v/3
	
t = np.linspace(0,1000, 10000)
y = []
z = []

for t0 in t:
	x = losning(t0, 2, 1, 1)
	y.append(x[0])
	z.append(x[1])

#plt.plot(y,z)

y1, z1 = eksplisitt_euler(f, g, 2, 1, 0.1, 0)
y2, z2 = symplektisk_euler(f, g, 0, 1, 0.1, 0)

for i in range(-5,5):
	for j in range(-5,5):
		#y1, z1 = eksplisitt_euler(f, g, i, j, 0.1, 0)
		#plt.plot(y1,z1)
		y2, z2 = symplektisk_euler(f, g, i, j, 0.1, 0)
		plt.plot(y2,z2)

#plt.plot(y1,z1)
#plt.plot(y2,z2)
plt.grid(True)
plt.show()