Interpolacja Lagrange'a i pyplot

0

Cześć :)
W moim programie muszę zbudować wielomian interpolacyjny Lagrange'a, a następnie narysować jego wykres.
Funkcja, która mnie interesuje to
f(x) = 1 / (5 + (x * x)).
Przeprowadzam interpolację za pomocą funkcji lagrange z biblioteki scipy.interpolate i wynik jej działania zapisuję do zmiennej L.
Gdy wypisuję ją na ekran pojawia się wzór powstałego wielomianu. Mam jednak problem z jego narysowaniem. Gdy próbuję to zrobić podając po prostu x i F jako argumenty plt.plot, wykres nie rysuje się poprawnie. Wydaje mi się, że problem jest w tym, że funkcja F jest w postaci, której plot nie potrafi odczytać, gdyż po wypisaniu jej na ekran dostaję poprawny wynik, jednak zapis wygląda tak, że potęgi x zapisane są w sposób x^(5), x^(6) itd. Jeżeli jest tak, jak myślę, to jak mogę sporządzić wykres tej funkcji? Jedyne, co przychodzi mi do głowy, do odczytanie współczynników wielomianu, a następnie przy pomocy pętli while lub for pomnożenie ich przez odpowiednie potęgi x, jednak jest to bardzo nieefektowne rozwiązanie, złożoność programu bardzo by wzrosła, a zależy mi na tym, aby była możliwie jak najmniejsza. Czy jest może jakiś inny sposób na narysowanie tego wykresu?

Fragment kodu:

import matplotlib.pyplot as plt
F = lagrange(x,y)
plt.plot(x, F)
0

W załączniku to co wyświetla F

1

F jest obiektem funkcyjnym a plt.plot oczekuje wektora punktów.
Powinieneś zrobić tak:

plt.plot(x, F(x))

Przy czym - na oko to masz troszkę za duży rząd tego wielomianu interpolacyjnego... nie wiem czy coś sensownego Ci tam wyjdzie...

import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import lagrange

f = lambda x: 1 / (5 + x*x)

# mamy 10 punktów w zakresie -5...5 i obliczamy dla nich f(x)
x1 = np.linspace(-5, 5, 10)
y1 = f(x1)

# wyznaczamy współczynniki 
F = lagrange(x1, y1)

# wyliczamy wartość funkcji F(x) dla "gęściej" rozmieszczonych punktów
x2 = np.linspace(-5, 5, 100)
y2 = F(x2)


plt.figure(figsize=(10,8))
# rysujemy nasze "punkty"
plt.plot(x1, y1, 'b.')

# rysujemy wynik interpolacji
plt.plot(x2, y2, 'r')

# a powinno to wyglądać tak
plt.plot(x2, f(x2), 'g')

title

plt.figure(figsize=(10,8))
# błąd interpolacji
plt.plot(x2, f(x2)-y2)

title

0

Dziękuję bardzo za odpowiedź :)
Dalej mam jednak problem z moim zadaniem, ponieważ w poleceniu mam napisane, że należy wyliczyć wartość funkcji w punktach
-1, -1+1/32, -1+2/32, ... , 1-1/32, 1
Robię to przy pomocy x = np.arange(-1, 1, 1.0/32).
Wtedy mam bardzo dużo punktów i wykres wygląda tak jak w załączniku.
Robię coś źle po drodze czy tak to będzie wyglądać ze względu na dużą ilość punktów?

1

W tych punktach policz wartość funkcji F, natomiast jej współczynniki policz dla mniejszej liczby punktów (zobacz na wiersze 8 i 15 w moim kodzie).

Poczytaj sobie: https://en.wikipedia.org/wiki/Runge%27s_phenomenon

0

Słyszałem o tym i dlatego spodziewam się, że wielomian będzie szalał, jednak w zadaniu mam napisane, aby skonstruować wielomian na podstawie tych właśnie punktów.
Mam też pytanie odnośnie tego samego przykładu, ale ze splajnem kubicznym. Robię go za pomocą polecenia
tck = interpolate.splrep(x, y, s=0). I teraz mam pytanie, a mianowicie - jak mogę go narysować? Jeżeli dobrze rozumiem, teraz w mojej zmiennej tck mam wektor węzłów, współczynniki splajnu oraz stopień splajnu. Jak mogę odczytać poszczególne dane z tej zmiennej? I czy mogę dzięki nim jakoś narysować ten wykres?

1 użytkowników online, w tym zalogowanych: 0, gości: 1