from scipy.integrate import odeint
from scipy import arange
from math import *
from array import array

lvalues=[10,1,0,-1,-10**3,-10**6,-10**9,-10**12]
tauvalues=range(3,11)
#print tauvalues

def f0(y,x):
	return 10*(y - sin(x)) + cos(x)
def f1(y,x):
	return 1*(y - sin(x)) + cos(x)
def f2(y,x):
	return 0*(y - sin(x)) + cos(x)
def f3(y,x):
	return -1*(y - sin(x)) + cos(x)
def f4(y,x):
	return -1000*(y - sin(x)) + cos(x)
def f5(y,x):
	return -1000000*(y - sin(x)) + cos(x)
def f6(y,x):
	return -1000000000*(y - sin(x)) + cos(x)
def f7(y,x):
	return -1000000000000*(y - sin(x)) + cos(x)

def solutions(lmbda,init,xvalues,abstol,reltol):
	if(lmbda == 10):
		return odeint(f0,init,xvalues,atol=abstol,rtol=reltol,full_output=1)
	if(lmbda == 1):
		return odeint(f1,init,xvalues,atol=abstol,rtol=reltol,full_output=1)
	if(lmbda == 0):
		return odeint(f2,init,xvalues,atol=abstol,rtol=reltol,full_output=1)
	if(lmbda == -1):
		return odeint(f3,init,xvalues,atol=abstol,rtol=reltol,full_output=1)
	if(lmbda == -1000):
		return odeint(f4,init,xvalues,atol=abstol,rtol=reltol,full_output=1)
	if(lmbda == -1000000):
		return odeint(f5,init,xvalues,atol=abstol,rtol=reltol,full_output=1)
	if(lmbda == -1000000000):
		return odeint(f6,init,xvalues,atol=abstol,rtol=reltol,full_output=1)
	if(lmbda == -1000000000000):
		return odeint(f7,init,xvalues,atol=abstol,rtol=reltol,full_output=1)

def answers(sol):
	nfe=sol[1]['nfe']
	numeval=nfe[len(nfe)-1]
	#get answer at endpoint
	b=sol[0][len(sol[0])-1].tolist()
	b=b[0]
	#give it back
	return b,numeval

x=arange(0,10.01,0.01)

#now that everything is set up, we get down to business
y=sin(10)
print "\\tt"
for i in lvalues:
	print "\\vspace{0.3in}"
	print "\\begin{tabular}{|llll|}"
	print "\\hline"
	print " $\\lambda$ & = ",i,"&& \\\\ \\hline"
	print "$\\tau$ & $y_{n}$ & rel error & num func eval \\\\ \\hline"
	for j in tauvalues:
		tau=10**-j
		ans = answers(solutions(i,0,x,tau/10**2,tau))
		err = abs((y - ans[0]) / y)
		print tau,"&",ans[0],"&",err,"&",ans[1],
		if(j != tauvalues[len(tauvalues)-1]):
			print "\\\\"
		else:
			print "\\\\ \\hline"

	print "\\end{tabular}\\\\"

print "\\rm"











