""" Tre metodi di integrazione numerica: rettangoli, trapezi, cavalieri tutti con la possibilita' di numeri normali o decimal (in base all'input) tenendo conto pero' che rettangoli e trapezi con i decimals diventano molto lenti molto piu' efficiente cavalieri """ from graftarta2 import Graf from graphics import * import decimal, logaritmo, decimal_mat,math gr=Graf("grafico",500,400) gr.coordinate(-4,-5,4,5,True) def f(z): return z/5-decimal_mat.sin(z) #z**3-2*z**2-z+2 #2*z+logaritmo.ln(z) #z**3-3*z**2-z+3 gr.grafico(f,-4.0,4.0,0.02) def cavalieri(a,b,prec): n=100 dep=(b-a)/1000*(f(a)+f(b))/2 somma=dep+2 while abs(somma-dep)>prec: dep=somma h=(b-a)/n somma=h*(f(a)+f(b)) x=a+2*h while x<(b-h): somma=somma+2*h*f(x) j=x.__float__() #per il grafico bisogna passare ai float k=f(x).__float__() linea=Line(Point(j,0),Point(j,k)) linea.draw(gr) x=x+2*h x=a+h while x<=b: somma=somma+4*h*f(x) j=x.__float__() #per il grafico bisogna passare ai float k=f(x).__float__() linea=Line(Point(j,0),Point(j,k)) linea.draw(gr) x=x+2*h n=n*2 print somma return somma/3,n/2 def trapez(a,b,prec): n=100 dep=(b-a)/1000*(f(a)+f(b))/2 somma=dep+2 while abs(somma-dep)>prec: dep=somma somma=0 h=(b-a)/n x=a while x<=(b-h): somma=somma+h*(f(x)+f(x+h))/2 j=x.__float__() #per il grafico bisogna passare ai float k=f(x).__float__() linea=Line(Point(j,0),Point(j,k)) linea.draw(gr) x=x+h n=n*2 return somma, n/2 def rett(a,b,prec): n=100 sommas=0 #(b-a)*f(a) sommad=1 #(b-a)*f(b) while abs(sommas-sommad)>prec: sommas, sommad = 0, 0 h=(b-a)/n x=a while x<=(b-h): sommas=sommas+h*f(x) sommad=sommad+h*f(x+h) x=x+h print n,sommas, sommad n=2*n return (sommas+sommad)/2, n/2 d=decimal.Decimal a=d(str(-1.0)) b=d(str(2.0)) #decimal.getcontext().prec=9 prec=d(str(10**-9)) #s, n =rett(a,b,prec) #s, n =rett(-1.0,0.0,0.00001) #s, n =trapez(-1.0,1.0,0.000001) s, n =cavalieri(a,b,prec) #s, n =cavalieri(-1.0,1.0,0.0000001) print 'cavalieri', s, n #s, n =trapez(a,b,prec) #print 'trapezi', s, n def primitiva(x): return x**2/10+decimal_mat.cos(x) #x**4/4-2*x**3/3-x**2/2+2*x print 'esatta', primitiva(b)-primitiva(a)