Interpolacja Lagrange'a i pyplot

Interpolacja Lagrange'a i pyplot
H5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 66
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:

Kopiuj
import matplotlib.pyplot as plt
F = lagrange(x,y)
plt.plot(x, F)
H5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 66
0

W załączniku to co wyświetla F

BG
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 293
1

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

Kopiuj
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...

Kopiuj
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

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

title

H5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 66
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?

BG
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 293
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

H5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 66
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?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.