Radice quadrata con metodo babilonese

1

Esegue 5 passi dell’algoritmo e visualizza la sequenza delle approssimazioni

n=256

x=n/2
for i in range(5):
    x=(x+n/x)/2
    print(i, ':', x)

2

Evidenzia che: date due approssimazioni, la loro media è un’approssimazione migliore…

n=256

xM=n/2
for i in range(5):
    xA=xM
    xB=n/xA
    xM=(xA+xB)/2
    print(i, ':', xA, xB, xM)

3

Input da tastiera

n=float(input("n = "))
passi=int(input("Passi = "))

xM=n/2
for i in range(passi):
    xA=xM
    xB=n/x1
    xM=(xA+xB)/2
    print(i, ':', xA, xB, xM)

4

Output formattato per colonne

n=float(input("n = "))
passi=int(input("Passi = "))

xM=n/2
for i in range(passi):
    xA=xM 
    xB=n/xA 
    xM=(xA+xB)/2 
    print("%2d %15.8f %15.8f %15.8f" %(i, xA, xB, xM))

5

Valutazione dell’errore assoluto

n=float(input("n = "))
passi=int(input("Passi = "))

xM=n/2
for i in range(passi):
    xA=xM 
    xB=n/xA
    xM=(xA+xB)/2
    eA=abs(xA-xM)
    print("%2d %15.8f %15.8f %15.8f %15.8f" %(i, xA, xB, xM,eA))

6

Valutazione dell’errore assoluto e dell’errore relativo

n=float(input("n = "))
passi=int(input("Passi = "))

xA=n/2
for i in range(passi):
    xA=xM 
    xB=n/xA
    xM=(xA+xB)/2
    eA=abs(xA-xM)
    eR=eA/xM 
    print("%2d %15.8f %15.8f %15.8f %15.8f %15.8f" %(i, xA, xB, xM, eA, eR))
babylon5

7

L’iterazione continua se l’errore relativo è ancora troppo grande

ER=0.01
eR=1.00

n=float(input("n = "))
xM=n/2
while(eR >= ER):
    xA=xM
    xB=n/xA
    xM=(xA+xB)/2
    eA=abs(xA-xM)
    eR=eA/xM 
    print("%15.8f %15.8f %15.8f %15.8f %15.8f" %(xA, xB, xM, eA, eR))

matplotlib

import matplotlib.pyplot as plt

X =[]
XA=[]
XB=[]
XM=[]

n=256
ER=0.01
eR=1.00
xM=n/2
i=1
while(eR >= ER):
    xA = xM
    xB = n/xA
    xM = (xA+xB)/2
    eA = abs(xA-xM)
    eR = eA/xM
    print("%i %12.6f %12.6f %12.6f %12.6f %12.6f" %(i+1, xA, xB, xM, eA, eR))
    X.append(i)
    XA.append(xA)
    XB.append(xB)
    XM.append(xM)
    i+=1

plt.grid()
plt.plot(X, XA, label="xA", linewidth="2")
plt.plot(X, XB, label="xB", linewidth="2")
plt.plot(X, XM, label="xM", linewidth="3")
plt.title("Metodo babilonese, n = " + str(n))
plt.xlabel("Iterazione")
plt.ylabel("Approsimazione")
plt.legend()

plt.show()

Forse è più chiaro con la soluzione approsssimata sull’asse delle ascisse?

Nella funzione plt.plot() scrivi X dopo xA, xB, xM

import matplotlib.pyplot as plt 

X =[] 
XA=[] 
XB=[] 
XM=[]

n=256 
ER=0.01 
eR=1.00 
xM=n/2 
i=1 
while(eR >= ER): 
    xA = xM 
    xB = n/xA 
    xM = (xA+xB)/2 
    eA = abs(xA-xM) 
    eR = eA/xM 
    print("%i %12.6f %12.6f %12.6f %12.6f %12.6f" %(i+1, xA, xB, xM, eA, eR)) 
    X.append(i) 
    XA.append(xA) 
    XB.append(xB) 
    XM.append(xM) 
    i+=1 

plt.grid() 
plt.plot(XA, X, label="xA", linewidth="2") 
plt.plot(XB, X, label="xB", linewidth="2") 
plt.plot(XM, X, label="xM", linewidth="3") 
plt.title("Metodo babilonese, n = " + str(n)) 
plt.xlabel("Approssimazione")
plt.ylabel("Iterazione")
plt.ylim(6.2, 0.8)
plt.legend() 

plt.show()

Se n < 4 al 2° passo ci sarà uno scambio tra xA e xB