Metodo numerikoen tutoriala

Interpolazio metodoak Python-en

Newton interpolazioaren, Lagrange interpolazioaren, interpolazio barizentrikoaren, spline kubikoen, Chebyshev nodoen eta Runge fenomenoaren, grafika, errore eta Python kode berrerabilgarriaren gida praktikoa.

Runge funtzioa, 11 nodo
Erreala Newton Nodoak
Doako interpolazio gida. Gida honek denbora aurrezten badizu, tutorial, adibide eta kode ireki gehiago babes ditzakezu.

Zer ikasiko duzun

Orri hau Python-en datu puntuak interpolatzen ulertu nahi duen edonorentzat dago idatzia, ez bakarrik formula bat kopiatzeko.

Newton interpolazioa

Eraiki diferentzia banatuen taula eta ebaluatu Newton-en polinomioa biderketa habiaratuekin modu eraginkorrean.

Funtsezko ideia: diferentzia banatuak

Lagrange interpolazioa

Ulertu polinomio interpolatzailearen formula zuzena eta nola sortu SciPy-rekin adibideetarako.

Funtsezko ideia: oinarri polinomikoak

Chebyshev nodoak

Konparatu nodo ekiespaziatuak Chebyshev nodoekin eta ikusi zergatik den garrantzitsua nodoen aukeraketa Runge fenomenorako.

Funtsezko ideia: nodoen kokapen hobea

Interpolazio barizentrikoa

Konparatu SciPy-k erabiltzen duen interpolazio polinomiko numerikoki egonkorra ebaluazio praktikorako.

Funtsezko ideia: ebaluazio polinomiko egonkorra

Spline kubikoak

Ikusi zergatik saihesten dituzten zatika kubikoak diren interpolazioek polinomio gradu altuko oszilazio asko.

Funtsezko ideia: zatikako interpolazio leuna

Chebyshev nodoak vs nodo ekiespaziatuak

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

Nodo ekiespaziatuak

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)

Chebyshev nodoak

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 interpolazioa Python-en

Newton interpolazioak polinomioa idazten du diferentzia banatuen taulako koefizienteak erabiliz. Erabilgarria da, datu puntu berri bat gehitzeak ez baitu polinomio osoa berreraikitzea eskatzen.

Aukeratu interpolazio nodoak

Hasi (x0, y0), (x1, y1), ... datu puntuekin. x balioek bakanak izan behar dute.

Eraiki diferentzia banatuen taula

Lehen zutabea y da. Hurrengo zutabe bakoitzak aurreko balioen diferentzia zatitzen du x-nodoen arteko distantziaz.

Ebaluatu Newton-en polinomioa

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))

Lagrange interpolazioa Python-en

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.

Python inplementazioaren barnean

Biltegiak Newton metodoa NumPy funtzio txiki eta irakurterrazetan gordetzen du. Hauek dira funtsezko zatiak, zuzenean polynomial_interpolation.py-tik hartuta.

Diferentzia banatuen taula eraikitzen

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, :]

Biderketa habiaratuarekin ebaluatzen (Horner-en eskema)

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

Lau metodo nodo berdinekin konparatzen

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))

Interpolazio demo interaktiboa

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.

Polinomio interpolatzailearen grafika
Erreala Newton Nodoak

Nola exekutatu biltegia

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

Lagundu gida hau doan mantentzen

Kode, grafika eta azalpenekin erreferentzia argia behar dutenentzat sortu nuen. Lagungarria izan bazaizu, kafe batek metodo numerikoen inguruko material gehiago argitaratzen laguntzen dit.