MN_Lab2.py

MN_Lab2.py
def Newton_Interpolation_table(tab, pktX):

    i_roznicowy = [[0]*len(tab) for i in range(len(tab))]

    for i in range(size):
        for j in range(size):
            if (j == 0):
                i_roznicowy[i][j] = tab[i]['y']
            elif (j <= i):
                i_roznicowy[i][j] = round(
                    (i_roznicowy[i][j-1]-i_roznicowy[i-1][j-1])/(tab[i]['x']-tab[i-j]['x']), 5)
            else:
                i_roznicowy[i][j] = ' '

    W = 0
    for k in range(len(tab)):
        p = 1
        for i in range(k):
            p *= (pktX-tab[i]['x'])
        W += p*i_roznicowy[k][k]
    return round(W, 5)


def Newton_Interpolation(tab, pktX):
    W = 0  # W = 1 v W = 1 * tab[i]['y'], dla k in range(1,size)
    for k in range(len(tab)):
        p = 1
        b = 0
        for i in range(k):
            p *= (pktX-tab[i]['x'])
        for i in range(k + 1):
            I = 1
            for j in range(k + 1):
                if i != j:
                    I *= (tab[i]['x'] - tab[j]['x'])
            b += tab[i]['y']/I
        print(round(b, 3), "  ", end='')
        W += p*b
    return round(W, 5)


if __name__ == '__main__':
    f = open('MN-2-p2.txt', 'r')
    tab = []
    for i, line in enumerate(f):
        if i == 0:
            size = int(line[0])
        else:
            l = line.split()
            x = float(l[0])
            y = float(l[1])
            tab.append({"x": x, "y": y})

    f.close()

    print("W którym punkcie policzyć wartość wielomianu? ")
    pktX = input()

    print("Liczba węzłów: ", size)

    for i in tab:
        print("x =", i['x'], "; f(x) =", i['y'])

    print("Wartość wielomianu liczona jest w punkcie: x =", pktX)
    print("Współczynniki wielomianu: ")

    print("\nWartość wielomianu: f(x) =",
          Newton_Interpolation(tab, float(pktX)))
    #print(Newton_Interpolation_table(tab, float(pktX)))