""" metodo numerico di bisezione confronto con il calcolo a precisione arbitraria del modulo Decimal E' possibile utilizzare sia numeri normali che decimal con la stessa definizione di funzione basta cambiare l'input """ 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/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 zeri(f,a,b,e): n=0 m=(a+b)/2 while (abs(a-b)>e) and (f(m)<>0): m=(a+b)/2 n=n+1 if f(m)*f(a)<0: b=m else: a=m #print a,b,m h=a.__float__() #per il grafico bisogna passare ai float k=b.__float__() L1=Line(Point(h,0),Point(h,f(h))) L1.draw(gr) L2=Line(Point(k,0),Point(k,f(k))) L2.draw(gr) return m, n #decimal.getcontext().prec=40 a=input('inserisci a ') b=input('inserisci b ') d=decimal.Decimal #eseguire sotto se si vuole utilizzare i numerei decimal c=decimal.getcontext().prec-3 m,n=zeri(f,d(str(a)),d(str(b)),d(str(10**-c))) #eseguire sotto se si scelgono i numeri normali #m,n = zeri(f,a,b,10**-9) print m,n print f(m) #L1=Line(Point(a,0),Point(a,f(a))) #L1.draw(gr) #L2=Line(Point(b,0),Point(b,f(b))) #L2.draw(gr)