-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex-eu.html
More file actions
538 lines (510 loc) · 20.4 KB
/
Copy pathindex-eu.html
File metadata and controls
538 lines (510 loc) · 20.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
<!doctype html>
<html lang="eu">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Interpolazio metodoak Python-en | Newton, Lagrange eta splineak</title>
<meta
name="description"
content="Ikasi interpolazio metodoak Python-en: Newton, Lagrange, interpolazio barizentrikoa, spline kubikoak, diferentzia banatuak, Chebyshev nodoak, grafikak eta iturburu kodea."
>
<meta
name="keywords"
content="Newton interpolazioa Python, Lagrange interpolazioa Python, interpolazio barizentrikoa Python, spline kubikoak Python, diferentzia banatuak Python, interpolazio polinomikoa Python, Chebyshev nodoak Python, Runge fenomenoa, metodo numerikoak Python, SciPy interpolazioa"
>
<meta name="author" content="Jon Ramos">
<meta name="robots" content="index, follow, max-image-preview:large">
<link
rel="canonical"
href="https://jonramos.dev/newton-lagrange-interpolation-python/index-eu.html"
>
<link
rel="alternate"
hreflang="en"
href="https://jonramos.dev/newton-lagrange-interpolation-python/index.html"
>
<link
rel="alternate"
hreflang="es"
href="https://jonramos.dev/newton-lagrange-interpolation-python/index-es.html"
>
<link
rel="alternate"
hreflang="eu"
href="https://jonramos.dev/newton-lagrange-interpolation-python/index-eu.html"
>
<link
rel="alternate"
hreflang="x-default"
href="https://jonramos.dev/newton-lagrange-interpolation-python/index.html"
>
<meta property="og:type" content="website">
<meta
property="og:title"
content="Interpolazio metodoak Python-en"
>
<meta
property="og:description"
content="Newton, Lagrange, interpolazio barizentriko, spline kubiko, Python kode eta demo interaktiboaren gida praktikoa."
>
<meta name="twitter:card" content="summary_large_image">
<meta
name="twitter:title"
content="Interpolazio metodoak Python-en"
>
<meta
name="twitter:description"
content="Ikasi interpolazio polinomikoa Newton, Lagrange, barizentriko, spline kubiko eta adibide interaktiboekin."
>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareSourceCode",
"name": "Interpolazio metodoak Python-en",
"description": "Newton interpolazioa, Lagrange interpolazioa, interpolazio barizentrikoa, spline kubikoak, diferentzia banatuak, Chebyshev nodoak eta Runge fenomenoaren gida eta Python kodea.",
"programmingLanguage": "Python",
"inLanguage": "eu",
"learningResourceType": "Tutorial",
"keywords": [
"Newton interpolazioa Python",
"Lagrange interpolazioa Python",
"interpolazio barizentrikoa Python",
"spline kubikoak Python",
"diferentzia banatuak Python",
"interpolazio polinomikoa",
"Chebyshev nodoak",
"Runge fenomenoa"
],
"codeRepository": "https://github.com/jramosg/newton-interpolation-method-python"
}
</script>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header>
<nav aria-label="Nabigazio nagusia">
<strong>Interpolazio metodoak Python-en</strong>
<div>
<a href="#methods">Metodoak</a>
<a href="#nodes">Nodoak</a>
<a href="#implementation">Kodea</a>
<a href="#demo">Demo interaktiboa</a>
<a href="#support">Babestu</a>
<a href="index.html" lang="en">English</a>
<a href="index-es.html" lang="es">Español</a>
<a href="polynomial_interpolation.py">Iturburu kodea</a>
</div>
</nav>
</header>
<div class="hero">
<div class="hero-inner">
<div>
<p class="eyebrow">Metodo numerikoen tutoriala</p>
<h1>Interpolazio metodoak Python-en</h1>
<p class="lead">
Newton interpolazioaren, Lagrange interpolazioaren, interpolazio
barizentrikoaren, spline kubikoen, Chebyshev nodoen eta Runge
fenomenoaren, grafika, errore eta Python kode berrerabilgarriaren
gida praktikoa.
</p>
<div class="hero-actions">
<a class="button primary" href="#demo">Probatu demoa</a>
<a class="button coffee-link" href="#support">
Babestu gida hau
</a>
<a class="button" href="polynomial_interpolation.py">
Ireki Python fitxategia
</a>
<a
class="button"
href="https://github.com/jramosg/newton-interpolation-method-python"
>
GitHub biltegia
</a>
</div>
</div>
<figure class="hero-visual" aria-label="Interpolazioaren aurrebista">
<div class="visual-toolbar">
<strong>Runge funtzioa, 11 nodo</strong>
<div class="legend">
<span><i class="dot" style="background:#17202a"></i>Erreala</span>
<span><i class="dot" style="background:#1e5eff"></i>Newton</span>
<span><i class="dot" style="background:#c0392b"></i>Nodoak</span>
</div>
</div>
<canvas id="heroChart" width="720" height="420"></canvas>
</figure>
</div>
</div>
<main>
<section class="support-strip" aria-label="Babestu doako gida hau">
<div>
<strong>Doako interpolazio gida.</strong>
Gida honek denbora aurrezten badizu, tutorial, adibide eta kode ireki
gehiago babes ditzakezu.
</div>
<div class="coffee-button">
<a class="coffee-cta" href="https://www.buymeacoffee.com/jramosg">
Erosi niri kafe bat
</a>
</div>
</section>
<section id="methods" aria-labelledby="what">
<h2 id="what">Zer ikasiko duzun</h2>
<p class="section-lead">
Orri hau Python-en datu puntuak interpolatzen ulertu nahi duen
edonorentzat dago idatzia, ez bakarrik formula bat kopiatzeko.
</p>
<div class="grid">
<article class="card">
<h3>Newton interpolazioa</h3>
<p>
Eraiki diferentzia banatuen taula eta ebaluatu Newton-en polinomioa
biderketa habiaratuekin modu eraginkorrean.
</p>
<strong>Funtsezko ideia: diferentzia banatuak</strong>
</article>
<article class="card">
<h3>Lagrange interpolazioa</h3>
<p>
Ulertu polinomio interpolatzailearen formula zuzena eta nola sortu
SciPy-rekin adibideetarako.
</p>
<strong>Funtsezko ideia: oinarri polinomikoak</strong>
</article>
<article class="card">
<h3>Chebyshev nodoak</h3>
<p>
Konparatu nodo ekiespaziatuak Chebyshev nodoekin eta ikusi
zergatik den garrantzitsua nodoen aukeraketa Runge fenomenorako.
</p>
<strong>Funtsezko ideia: nodoen kokapen hobea</strong>
</article>
<article class="card">
<h3>Interpolazio barizentrikoa</h3>
<p>
Konparatu SciPy-k erabiltzen duen interpolazio polinomiko
numerikoki egonkorra ebaluazio praktikorako.
</p>
<strong>Funtsezko ideia: ebaluazio polinomiko egonkorra</strong>
</article>
<article class="card">
<h3>Spline kubikoak</h3>
<p>
Ikusi zergatik saihesten dituzten zatika kubikoak diren
interpolazioek polinomio gradu altuko oszilazio asko.
</p>
<strong>Funtsezko ideia: zatikako interpolazio leuna</strong>
</article>
</div>
</section>
<section id="nodes" aria-labelledby="nodes-title">
<h2 id="nodes-title">Chebyshev nodoak vs nodo ekiespaziatuak</h2>
<p class="section-lead">
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.
</p>
<div class="comparison-grid">
<article class="card">
<h3>Nodo ekiespaziatuak</h3>
<p>
Ulertzeko errazak eta ohikoak lehenengo adibideetan, baina muturreko
oszilazio handiak sor ditzakete Runge bezalako funtzioetan
polinomioaren gradua handitzean.
</p>
<pre><code>x_nodes = np.linspace(-1, 1, n)</code></pre>
</article>
<article class="card">
<h3>Chebyshev nodoak</h3>
<p>
Nodoak tartearen muturretatik gertu kontzentratzen dira. Normalean
errore profil askoz hobea ematen dute nodo ekiespaziatuek baino
interpolazio polinomiko globalean.
</p>
<pre><code>k = np.arange(1, n + 1)
x_nodes = np.cos((2*k - 1) * np.pi / (2*n))</code></pre>
</article>
</div>
<table>
<thead>
<tr>
<th>Nodo mota</th>
<th>Zer gertatu ohi den</th>
<th>Probatu demoan</th>
</tr>
</thead>
<tbody>
<tr>
<td>Ekiespaziatua</td>
<td>Banaketa sinplea, baina Runge oszilazioen aurrean ahulagoa.</td>
<td>Erabili Runge funtzioa 11 edo 21 nodorekin.</td>
</tr>
<tr>
<td>Chebyshev</td>
<td>Muturretako oszilazio txikiagoa adibide global askotan.</td>
<td>Aldatu nodo mota Chebyshev-era eta konparatu kurba.</td>
</tr>
</tbody>
</table>
</section>
<section id="newton" aria-labelledby="newton-title">
<h2 id="newton-title">Newton interpolazioa Python-en</h2>
<p class="section-lead">
Newton interpolazioak polinomioa idazten du diferentzia banatuen
taulako koefizienteak erabiliz. Erabilgarria da, datu puntu berri
bat gehitzeak ez baitu polinomio osoa berreraikitzea eskatzen.
</p>
<div class="steps">
<article class="step">
<h3>Aukeratu interpolazio nodoak</h3>
<p>
Hasi <code>(x0, y0), (x1, y1), ...</code> datu puntuekin.
<code>x</code> balioek bakanak izan behar dute.
</p>
</article>
<article class="step">
<h3>Eraiki diferentzia banatuen taula</h3>
<p>
Lehen zutabea <code>y</code> da. Hurrengo zutabe bakoitzak
aurreko balioen diferentzia zatitzen du x-nodoen arteko distantziaz.
</p>
</article>
<article class="step">
<h3>Ebaluatu Newton-en polinomioa</h3>
<p>
Erabili biderketa habiaratua polinomioaren ebaluazio
egonkor eta trinkorako.
</p>
</article>
</div>
<pre><code>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))</code></pre>
</section>
<section id="lagrange" aria-labelledby="lagrange-title">
<h2 id="lagrange-title">Lagrange interpolazioa Python-en</h2>
<p class="section-lead">
Nodo berdinak erabiltzean, Lagrange interpolazioak Newton-ek bezalako
polinomio bera eraikitzen du. Formula zuzena eta erraz irakurtzekoa
denez, ohikoa da metodo numerikoen ikastaroetan.
</p>
<pre><code>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))</code></pre>
<table>
<thead>
<tr>
<th>Metodoa</th>
<th>Onena ikasteko</th>
<th>Ohar praktikoa</th>
</tr>
</thead>
<tbody>
<tr>
<td>Newton</td>
<td>Diferentzia banatuak, interpolazio inkrementala</td>
<td>Metodo egokia hutsetik inplementatzeko.</td>
</tr>
<tr>
<td>Lagrange</td>
<td>Polinomio interpolatzailearen formula ulertzea</td>
<td>Argia matematikoki, baina eguneratzeko ez hain eraginkorra.</td>
</tr>
<tr>
<td>Barizentrikoa</td>
<td>Interpolazio polinomiko egonkorra</td>
<td>Normalean hobetsia ebaluazio polinomiko numerikorako.</td>
</tr>
<tr>
<td>Spline kubikoa</td>
<td>Interpolazio leuna gradu altuko oszilaziorik gabe</td>
<td>Sarritan sendoagoa benetako datuetarako.</td>
</tr>
</tbody>
</table>
</section>
<section id="implementation" aria-labelledby="implementation-title">
<h2 id="implementation-title">Python inplementazioaren barnean</h2>
<p class="section-lead">
Biltegiak Newton metodoa NumPy funtzio txiki eta irakurterrazetan
gordetzen du. Hauek dira funtsezko zatiak, zuzenean
<a href="polynomial_interpolation.py">polynomial_interpolation.py</a>-tik
hartuta.
</p>
<h3>Diferentzia banatuen taula eraikitzen</h3>
<p>
Taula <code>y</code> 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.
</p>
<pre><code>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, :]</code></pre>
<h3>Biderketa habiaratuarekin ebaluatzen (Horner-en eskema)</h3>
<p>
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.
</p>
<pre><code>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</code></pre>
<h3>Lau metodo nodo berdinekin konparatzen</h3>
<p>
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.
</p>
<pre><code>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))</code></pre>
</section>
<section id="demo" aria-labelledby="demo-title">
<h2 id="demo-title">Interpolazio demo interaktiboa</h2>
<p class="section-lead">
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.
</p>
<div class="demo">
<aside class="controls" aria-label="Interpolazio kontrolak">
<div class="field">
<label for="functionSelect">Funtzioa</label>
<select id="functionSelect">
<option value="runge">Runge: 1 / (1 + 25x²)</option>
<option value="sin">sin(x)</option>
<option value="gaussian">exp(-20x²)</option>
</select>
</div>
<div class="field">
<label for="nodeSelect">Nodo mota</label>
<select id="nodeSelect">
<option value="equispaced">Nodo ekiespaziatuak</option>
<option value="chebyshev">Chebyshev nodoak</option>
</select>
</div>
<div class="field">
<label for="countInput">Nodo kopurua</label>
<input id="countInput" type="number" min="3" max="25" value="11">
</div>
<div class="field">
<label for="pointInput">Ebaluatu x-n</label>
<input
id="pointInput"
type="number"
min="-1"
max="1"
step="0.05"
value="0.25"
>
</div>
<div class="result" id="demoResult">P(0.25) = ...</div>
</aside>
<figure class="wide-visual">
<div class="visual-toolbar">
<strong>Polinomio interpolatzailearen grafika</strong>
<div class="legend">
<span><i class="dot" style="background:#17202a"></i>Erreala</span>
<span><i class="dot" style="background:#1e5eff"></i>Newton</span>
<span><i class="dot" style="background:#c0392b"></i>Nodoak</span>
</div>
</div>
<canvas id="demoChart" width="860" height="430"></canvas>
</figure>
</div>
</section>
<section aria-labelledby="uso-title">
<h2 id="uso-title">Nola exekutatu biltegia</h2>
<p class="section-lead">
Fitxategi nagusiak esperimentu osoa berregiten du: Newton, Lagrange,
metodo barizentrikoa eta spline kubikoa.
</p>
<pre><code>python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python polynomial_interpolation.py</code></pre>
</section>
<section id="support" class="support-panel" aria-labelledby="support-title">
<div>
<p class="eyebrow">Babestu proiektua</p>
<h2 id="support-title">Lagundu gida hau doan mantentzen</h2>
<p class="section-lead">
Kode, grafika eta azalpenekin erreferentzia argia behar dutenentzat
sortu nuen. Lagungarria izan bazaizu, kafe batek metodo numerikoen
inguruko material gehiago argitaratzen laguntzen dit.
</p>
</div>
<div class="coffee-button">
<a class="coffee-cta" href="https://www.buymeacoffee.com/jramosg">
Erosi niri kafe bat
</a>
<p>
<a href="https://www.buymeacoffee.com/jramosg">
Ireki Buy Me a Coffee
</a>
</p>
</div>
</section>
<footer>
<p>
Iturburu kodea:
<a href="polynomial_interpolation.py">polynomial_interpolation.py</a>.
Beste hizkuntzak:
<a href="index.html" lang="en">English</a> ·
<a href="index-es.html" lang="es">Español</a>.
</p>
</footer>
</main>
<script src="app.js" defer></script>
<script
data-name="BMC-Widget"
data-cfasync="false"
src="https://cdnjs.buymeacoffee.com/1.0.0/widget.prod.min.js"
data-id="jramosg"
data-description="Support me on Buy Me a Coffee!"
data-message=""
data-color="#FFDD00"
data-position="Right"
data-x_margin="18"
data-y_margin="18"
></script>
</body>
</html>