Untitled

 avatar
unknown
plain_text
5 months ago
1.9 kB
5
Indexable
import numpy as np
import matplotlib.pyplot as plt  # importiamo il modulo pyplot di matplotlib


def Ordineh(f, h):
    n = len(f)
    der = np.zeros(n)
    for i in range(0, n - 1):
        der[i] = (f[i + 1] - f[i]) / h
    return der

def Ordineh2(f, h):
    n = len(f)
    der = np.zeros(n)
    for i in range(1, n - 1):
        der[i] = (f[i + 1] - f[i - 1]) / (2 * h)
    return der

def Ordineh4(f, h):
    n = len(f)
    der = np.zeros(n)
    for i in range(2, n - 2):
        der[i] = (-f[i + 2] + 8 * f[i + 1] - 8 * f[i - 1] + f[i - 2]) / (12 * h)
    return der


def main():
    # questo programma crea una lista di n numeri equispaziati
    x_max = float(input('Dammi X massimo: '))
    n = int(input('Dammi n: '))

    x = []  # lista per i valori di x
    f = []  # lista per i valori della funzione f
    fa = []  # lista per i valori della derivata analitica

    h = x_max / n

    for i in range(n):
        x_val = x_max / n * i
        x.append(x_val)
        f.append(np.sin(x_val))
        fa.append(np.cos(x_val))

    foh = Ordineh(f, h)
    foh2 = Ordineh2(f, h)
    foh4 = Ordineh4(f, h)

    # Calcolo dell'errore
    Errh = foh - fa
    Errh2 = foh2 - fa
    Errh4 = foh4 - fa

    # Creazione del grafico
    fig, ax = plt.subplots()

    plt.rcParams.update({'font.size': 14})
    ax.set_xlim(0, x_max)
    ax.set_ylim(np.min(Errh4), np.max(Errh4))  # Usare gli errori di Ordineh4 per i limiti

    # Grafico degli errori per ciascun metodo
    ax.plot(x, Errh, label="Errore Ordine h", linestyle='-', marker='o')
    ax.plot(x, Errh2, label="Errore Ordine h2", linestyle='-', marker='s')
    ax.plot(x, Errh4, label="Errore Ordine h4", linestyle='-', marker='^')

    # Mostra legenda correttamente
    ax.legend()

    ax.set_xlabel("X")
    ax.set_ylabel("Errore")

    plt.show()


if __name__ == "__main__":
    main()
Editor is loading...
Leave a Comment