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))
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