Newton interpolazioa
Eraiki diferentzia banatuen taula eta ebaluatu Newton-en polinomioa biderketa habiaratuekin modu eraginkorrean.
Funtsezko ideia: diferentzia banatuakMetodo numerikoen tutoriala
Newton interpolazioaren, Lagrange interpolazioaren, interpolazio barizentrikoaren, spline kubikoen, Chebyshev nodoen eta Runge fenomenoaren, grafika, errore eta Python kode berrerabilgarriaren gida praktikoa.
Orri hau Python-en datu puntuak interpolatzen ulertu nahi duen edonorentzat dago idatzia, ez bakarrik formula bat kopiatzeko.
Eraiki diferentzia banatuen taula eta ebaluatu Newton-en polinomioa biderketa habiaratuekin modu eraginkorrean.
Funtsezko ideia: diferentzia banatuakUlertu polinomio interpolatzailearen formula zuzena eta nola sortu SciPy-rekin adibideetarako.
Funtsezko ideia: oinarri polinomikoakKonparatu nodo ekiespaziatuak Chebyshev nodoekin eta ikusi zergatik den garrantzitsua nodoen aukeraketa Runge fenomenorako.
Funtsezko ideia: nodoen kokapen hobeaKonparatu SciPy-k erabiltzen duen interpolazio polinomiko numerikoki egonkorra ebaluazio praktikorako.
Funtsezko ideia: ebaluazio polinomiko egonkorraIkusi zergatik saihesten dituzten zatika kubikoak diren interpolazioek polinomio gradu altuko oszilazio asko.
Funtsezko ideia: zatikako interpolazio leunaNodoen kokapenak interpolazio formulak adina garrantzia izan dezake. Gradu altuko interpolazio polinomikoan, berdin banatutako puntuek tarte ertzetan oszilazio handiak sor ditzakete. Chebyshev nodoak muturretan biltzen dira eta jokabide hori murriztu ohi dute.
Ulertzeko errazak eta ohikoak lehenengo adibideetan, baina muturreko oszilazio handiak sor ditzakete Runge bezalako funtzioetan polinomioaren gradua handitzean.
x_nodes = np.linspace(-1, 1, n)
Nodoak tartearen muturretatik gertu kontzentratzen dira. Normalean errore profil askoz hobea ematen dute nodo ekiespaziatuek baino interpolazio polinomiko globalean.
k = np.arange(1, n + 1)
x_nodes = np.cos((2*k - 1) * np.pi / (2*n))
| Nodo mota | Zer gertatu ohi den | Probatu demoan |
|---|---|---|
| Ekiespaziatua | Banaketa sinplea, baina Runge oszilazioen aurrean ahulagoa. | Erabili Runge funtzioa 11 edo 21 nodorekin. |
| Chebyshev | Muturretako oszilazio txikiagoa adibide global askotan. | Aldatu nodo mota Chebyshev-era eta konparatu kurba. |
Newton interpolazioak polinomioa idazten du diferentzia banatuen taulako koefizienteak erabiliz. Erabilgarria da, datu puntu berri bat gehitzeak ez baitu polinomio osoa berreraikitzea eskatzen.
Hasi (x0, y0), (x1, y1), ... datu puntuekin.
x balioek bakanak izan behar dute.
Lehen zutabea y da. Hurrengo zutabe bakoitzak
aurreko balioen diferentzia zatitzen du x-nodoen arteko distantziaz.
Erabili biderketa habiaratua polinomioaren ebaluazio egonkor eta trinkorako.
import numpy as np
from polynomial_interpolation import (
evaluate_newton_polynomial,
newton_coefficients,
)
x_nodes = np.array([-1.0, -0.5, 0.0, 0.5, 1.0])
y_nodes = 1 / (1 + 25 * x_nodes**2)
coefficients = newton_coefficients(x_nodes, y_nodes)
value = evaluate_newton_polynomial(coefficients, x_nodes, 0.25)
print(float(value))
Nodo berdinak erabiltzean, Lagrange interpolazioak Newton-ek bezalako polinomio bera eraikitzen du. Formula zuzena eta erraz irakurtzekoa denez, ohikoa da metodo numerikoen ikastaroetan.
import numpy as np
from scipy.interpolate import lagrange
x_nodes = np.array([-1.0, -0.5, 0.0, 0.5, 1.0])
y_nodes = 1 / (1 + 25 * x_nodes**2)
polynomial = lagrange(x_nodes, y_nodes)
print(polynomial(0.25))
| Metodoa | Onena ikasteko | Ohar praktikoa |
|---|---|---|
| Newton | Diferentzia banatuak, interpolazio inkrementala | Metodo egokia hutsetik inplementatzeko. |
| Lagrange | Polinomio interpolatzailearen formula ulertzea | Argia matematikoki, baina eguneratzeko ez hain eraginkorra. |
| Barizentrikoa | Interpolazio polinomiko egonkorra | Normalean hobetsia ebaluazio polinomiko numerikorako. |
| Spline kubikoa | Interpolazio leuna gradu altuko oszilaziorik gabe | Sarritan sendoagoa benetako datuetarako. |
Biltegiak Newton metodoa NumPy funtzio txiki eta irakurterrazetan gordetzen du. Hauek dira funtsezko zatiak, zuzenean polynomial_interpolation.py-tik hartuta.
Taula y balioekin hasten da lehen zutabean. Hurrengo
zutabe bakoitzak aurreko zutabearen diferentzia zatitzen du dagozkien
x-nodoen arteko distantziaz. Newton-en koefizienteak amaitutako
taularen lehen errenkada dira.
def divided_difference_table(x, y):
n = len(x)
table = np.zeros((n, n))
table[:, 0] = y
for order in range(1, n):
for row in range(n - order):
numerator = table[row + 1, order - 1] - table[row, order - 1]
denominator = x[row + order] - x[row]
table[row, order] = numerator / denominator
return table
# Newton-en koefizienteak taularen lehen errenkada dira:
coefficients = divided_difference_table(x, y)[0, :]
Polinomioa zabaldu beharrean, ebaluatzaileak koefizienteak atzerantz zeharkatzen ditu eta bidean biderkatzen du. Numerikoki egonkorra da, puntu bakar batean edo NumPy array oso batean funtzionatzen du, eta kostua nodo kopuruan lineala mantentzen du.
def evaluate_newton_polynomial(coefficients, x_nodes, x_eval):
result = np.full_like(x_eval, coefficients[-1], dtype=float)
for i in range(len(coefficients) - 2, -1, -1):
result = result * (x_eval - x_nodes[i]) + coefficients[i]
return result
Esperimentuak biltegi honetako Newton-en polinomioa eta SciPy-ren Lagrange, barizentriko eta spline kubiko interpolatzaileak eraikitzen ditu, eta gero errore maximoa eta L2 errorea neurtzen ditu benetako funtzioaren aurka sareta dentso batean.
from scipy.interpolate import (
BarycentricInterpolator,
InterpolatedUnivariateSpline,
lagrange,
)
# Newton (biltegi honetan inplementatua)
coefficients = newton_coefficients(x_nodes, y_nodes)
y_newton = evaluate_newton_polynomial(coefficients, x_nodes, x_grid)
# Lagrange, barizentrikoa eta spline kubikoa (SciPy)
y_lagrange = lagrange(x_nodes, y_nodes)(x_grid)
y_bary = BarycentricInterpolator(x_nodes, y_nodes)(x_grid)
y_spline = InterpolatedUnivariateSpline(x_nodes, y_nodes, k=3)(x_grid)
# Errorea benetako funtzioaren aurka sareta dentso batean
max_error = np.max(np.abs(y_newton - y_true))
l2_error = np.sqrt(np.trapezoid((y_newton - y_true)**2, x_grid))
Aldatu funtzioa, nodoak eta ebaluazio puntua. Grafikak erakusten du zergatik ematen duten Newton-ek eta Lagrange-k polinomio bera nodo berdinekin, eta zergatik murrizten duten Chebyshev nodoek oszilazioa.
Fitxategi nagusiak esperimentu osoa berregiten du: Newton, Lagrange, metodo barizentrikoa eta spline kubikoa.
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python polynomial_interpolation.py
Babestu proiektua
Kode, grafika eta azalpenekin erreferentzia argia behar dutenentzat sortu nuen. Lagungarria izan bazaizu, kafe batek metodo numerikoen inguruko material gehiago argitaratzen laguntzen dit.