"""metodo di Newton o delle tangenti per la ricerca degli zeri di una funzione la stessa funzione puo' essere utilizzata o con i numeri normali che con i decimal (basta cambiare l'input) bisogna pero' scrivere f f' ed f'' """ from graftarta2 import Graf from graphics import * import decimal, logaritmo, decimal_mat,math gr=Graf("grafico bisezione",500,400) gr.coordinate(-4,-5,4,5,True) def f(z): return z**3-2*z**2-z+2 def Df(z): return 3*z**2-4*z-1 #1/5-decimal_mat.cos(z) def D2f(z): return 6*z-4 #decimal_mat.sin(z) #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 tange(a,b,e): n=0 if Df(a)==0 or Df(b)==0: print 'derivata nulla in uno degli estremi' else: if f(a)*D2f(a)>0: x0=a else: x0=b x1=x0-f(x0)/Df(x0) while abs(x0-x1)>e: x0=x1 x1=x0-f(x0)/Df(x0) n=n+1 #print x0, x1 h=x0.__float__() #per il grafico bisogna passare ai float k=x1.__float__() L1=Line(Point(k,0),Point(h,f(h))) L1.draw(gr) return x1,n d=decimal.Decimal c=decimal.getcontext().prec-3 a=input('inserisci a ') b=input('inserisci b ') m,n= tange(d(str(a)),d(str(b)),d(str(10**-c))) #m,n=tange(a,b,0.000000001) print m,n print f(m)