Mam problem z programem który ma wyliczać interpolację oraz rysować ją na wykresie.
Interpolacja ma być zrobiona na podstawie punktów (x,z) na podstawie y wybranego przez użytkownika.
Aby funckja interpolacyjna była dokładniejsza, zrobiłem ją na podprzedziałach głównego przedziału.
Wygląda lepiej niż oryginalnie, ale na łączeniach przedziałów funkcja nie jest tak jakby funkcją.
Wygląda bardziej jak połączenie punktów prostą linią. Nie wiem co zrobiłem nie tak.
Dane są w załączniku tak jak i wykresobraz_2023-05-28_224832302.pngdane.txt
Kod:

import numpy as np
import matplotlib.pyplot as plt

# Wczytanie danych z pliku
data = np.loadtxt('dane.txt')

# Podział danych na kolumny
x = data[:, 0]
y = data[:, 1]
z = data[:, 2]

wybrany_y =0.7

x2 = x[np.isclose(y,wybrany_y)]
z2 = z[np.isclose(y,wybrany_y)]

def f(x,wsp,xn):
    y=wsp[0]*(xn-x[1])*(xn-x[2])*(xn-x[3])+wsp[1]*(xn-x[0])*(xn-x[2])*(xn-x[3])+wsp[2]*(xn-x[0])*(xn-x[1])*(xn-x[3])+wsp[3]*(xn-x[0])*(xn-x[1])*(xn-x[2])
    return y
# Funkcja do obliczania wartości interpolowanej dla danego x
def interp_lag(X,Y):
    n=X.shape[0]
    m=np.zeros(n)
    a=np.zeros(n)    
    for i in range(n):
        m[i] = 1
        for j in range(n):
            if(i!=j):
                m[i] = m[i] * (X[i]-X[j])
        a[i] =Y[i]/m[i]  
    return a  

# Wygenerowanie wartości x_interp dla wykresu
x_interp0=np.linspace(0,0.3, 200)
x_interp1=np.linspace(0.3,0.6, 200)
x_interp2=np.linspace(0.6,0.9, 200)
x_interp3=np.linspace(0.9,1.2, 200)
x_interp4=np.linspace(1.2,1.5, 200)
x_interp5=np.linspace(1.5,1.8, 200)
x_interp6=np.linspace(1.8,2.0, 200)

tab_x=np.zeros((7,4))
tab_z=np.zeros((7,4))
k=0
for i in range(6):
    for j in range(4):
        tab_x[i][j]=x2[j+k]
        tab_z[i][j]=z2[j+k]
    k+=3
for i in range(4):
    tab_x[6][i]=x2[17+i]
    tab_z[6][i]=z2[17+i]    
print(tab_x)
print(tab_z)
wsp=np.zeros((7,4))
for i in range(7):
    wsp[i]=interp_lag(tab_x[i],tab_z[i])
print(wsp)
z_interp0=f(tab_x[0],wsp[0],x_interp0)
z_interp1=f(tab_x[1],wsp[1],x_interp1)
z_interp2=f(tab_x[2],wsp[2],x_interp2)
z_interp3=f(tab_x[3],wsp[3],x_interp3)
z_interp4=f(tab_x[4],wsp[4],x_interp4)
z_interp5=f(tab_x[5],wsp[5],x_interp5)
z_interp6=f(tab_x[6],wsp[6],x_interp6)

# Wykres punktów x2 i z2
plt.scatter(x2, z2, color='red', label='Punkty')

# Wykres funkcji interpolacyjnych
plt.plot(x_interp0, z_interp0, label='Interpolacja 0-0.3',color='blue')
plt.plot(x_interp1, z_interp1, label='Interpolacja 0.3-0.6',color='blue')
plt.plot(x_interp2, z_interp2, label='Interpolacja 0.6-0.9',color='blue')
plt.plot(x_interp3, z_interp3, label='Interpolacja 0.9-1.2',color='blue')
plt.plot(x_interp4, z_interp4, label='Interpolacja 1.2-1.5',color='blue')
plt.plot(x_interp5, z_interp5, label='Interpolacja 1.5-1.8',color='blue')
plt.plot(x_interp6, z_interp6, label='Interpolacja 1.7-2.0',color='blue')

plt.xlabel('x')
plt.ylabel('z')
plt.title('Wykres interpolacji Lagrange\'a')
plt.legend()
plt.grid(True)
plt.show()
```python