Handboek · hoofdstuk 36Numerieke methoden en wetenschappelijk rekenen
Een getal is pas een resultaat als je ook zijn fout en gevoeligheid kent
De digitale tweeling bevat onbekende parameters en differentiaalvergelijkingen. Je gebruikt arrays, nulpuntsmethoden en gecontroleerde integratie om uit data een model te maken. Je onderscheidt afronding, discretisatie, meetruis en een ontoereikend model.

- Je kan NumPy-arrays vectoriseren met bewuste vormen en eenheden.
- Je kan bisectie en Newton afleiden en hun convergentievoorwaarden toetsen.
- Je kan een parameterfit opzetten met residuen, grenzen en validatiedata.
- Je kan Euler en RK4 vergelijken op foutorde en stabiliteit.
- Je kan numerieke en fysische onzekerheid onderscheiden.
Arrays zijn meer dan kortere lussen
Een NumPy-array heeft een vaste dtype, vorm (shape) en geheugenindeling. t=np.arange(0,3601,60) geeft 61 tijdstippen in seconde. T=5+20*np.exp(-t/10800) evalueert dezelfde formule over alle punten. NumPy voert veel elementbewerkingen in gecompileerde code uit; de uitdrukking maakt ook zichtbaar dat alle samples dezelfde regel volgen.
Een tabel met n tijden en twee temperaturen heeft vorm (n,2). De vector met twee capaciteiten heeft vorm (2,); broadcasting deelt elke kolom door de bijbehorende capaciteit. Vorm (n,1) naast (n,) kan onbedoeld een (n, n)-array maken. Controleer vormen, eenheden en assen voordat een snelle berekening een groot verkeerd resultaat produceert. Gebruik @ voor matrixproducten, * voor elementgewijze producten.
| uitdrukking | betekenis |
|---|---|
| y[:,0] | luchtkolom |
| y.mean(axis=0) | gemiddelde per sensor |
| A @ x | matrix-vectorproduct |
| np.isfinite(y) | masker van eindige waarden |
Een wortel insluiten: bisectie
Een nulpunt voldoet aan . Als f continu is en , ligt minstens één nulpunt tussen a en b. Bereken het midden en behoud de helft met tekenwisseling. De invariant is dus een continu interval met een ingesloten wortel. Bij een sprong kan tekenwisseling zonder nulpunt bestaan; continuïteit is essentieel.
Na k stappen is de intervalbreedte . Geef je het midden terug, dan is de fout hoogstens . Dit levert een echte garantie zonder afgeleide. Stop zowel op een absolute als relatieve breedte in praktische code; een kleine functiewaarde alleen is onvoldoende bij een vlakke functie.
Een tolerantie plannen
- vereiste fout ≤ 10⁻⁶
- Minimum aantal bisectiestappen
- 1, en f is continu.
- 2geeft .
- 3Na 19 halveringen is de middenfout maximaal .
Newton: de raaklijn voorspelt de wortel
Lineariseer bij : . Zet dit gelijk aan nul:
Bij een eenvoudige wortel, gladde f en een goede start is de convergentie lokaal kwadratisch: het aantal goede cijfers kan ongeveer verdubbelen. De methode heeft geen algemene globale garantie. Een kleine afgeleide geeft een enorme sprong; een slecht startpunt kan naar een andere wortel leiden of blijven slingeren. Voor gaat start 0 naar 1 en weer naar 0.
Een safeguarded methode bewaart een betrouwbaar bracket en aanvaardt Newton alleen als de stap daarbinnen ligt en voldoende voortgang maakt; anders volgt bisectie. In meerdere dimensies wordt de afgeleide een Jacobiaan en los je een lineair stelsel op. Dat vraagt goed geschaalde variabelen en een controle op singulariteit.
Fitten: parameters moeten de proef verklaren
Het model voorspelt ; de data geven . Kleinste kwadraten kiest parameters die minimaliseren. Gewichten passen bij de meetonzekerheid. Ze maken een grof instrument niet belangrijker doordat het veel samples levert. Gecorreleerde samples vragen een covariantiemodel of passende subsampling.
Een warmteproef moet input en beginvoorwaarden kennen. De proef hier gebruikt de modulecapaciteiten , , buiten 5 °C, koppeling 30 W/K en verlies 20,2 W/K. De capaciteiten worden vastgehouden; de fit schat alleen verlies UA en koppeling H. Twee sensoren en opwarm- én afkoelfase maken die parameters beter onderscheidbaar. Dit model hoort bij de module; de 540 kJ/K van e39 is een afzonderlijke snelle stationsknoop.
Het begin van de warmteproef
- Ca=80000 J/K, UA=20,2 W/K
- Ta=Tb=18 °C
- De beginhellingen van beide knopen
- 1De lucht-bufferstroom is 30×(18−18)=0 W.
- 2Buitenverlies is 20,2×(18−5)=262,6 W; netto naar de lucht 537,4 W.
- 3dTa/dt=537,4/80000=0,0067175 K/s=24,183 K/h. De bufferhelling is op dit eerste ogenblik nul; zodra de lucht warmer is, begint de buffer te volgen.
De balans wordt een numerieke functie
De lucht ontvangt vermogen P, verliest warmte naar buiten en wisselt warmte uit met de buffer. De buffer ontvangt precies die laatste stroom. Daarom:
Optellen schrapt de interne uitwisseling: . Dat is een controle op energiebewaring. Een fout in het teken van H zou bij twee gelijke temperaturen onzichtbaar kunnen blijven maar later energie creëren. Integratie en residuen worden met dezelfde modelroutine berekend, zodat grafiek en fit niet uiteenlopen.
Euler en RK4 afleiden
Euler gebruikt de helling aan het begin: . De lokale fout per stap is , de globale fout over een vaste tijd . RK4 gebruikt hellingen aan begin, twee middenpunten en einde: , , , . De combinatie is:
De gewichten vallen niet uit een gemiddelde-intuïtie alleen af te leiden; ze zijn gekozen om de Taylorontwikkeling tot en met h⁴ te laten overeenkomen. De globale fout is bij voldoende gladheid . Bij een inputschakelaar is het proces niet glad over de stap: laat de integrator precies op het schakelmoment eindigen. Adaptieve methoden schatten de fout en verkleinen de stap waar nodig.
Fit en integratie uit één modelroutine
Alle model metingen zijn synthetisch: startwaarde 36 geeft reproduceerbare Gaussruis met σ = 0,05 K. De least_squares-fit werkt op logparameters en positieve grenzen. De getoonde rms is trainingsresidu, geen onafhankelijke voorspellingsfout.
import numpy as npfrom scipy.optimize import least_squares def bisectie(f, a, b, tol=1e-8): fa, fb = f(a), f(b) if fa == 0: return a if fb == 0: return b if fa * fb > 0: raise ValueError("geen tekenwisseling") while (b-a)/2 > tol: m = (a+b)/2 fm = f(m) if fm == 0: return m if fa*fm < 0: b = m else: a, fa = m, fm return (a+b)/2 def rk4(f, y, h): k1 = f(y) k2 = f(y+h*k1/2) k3 = f(y+h*k2/2) k4 = f(y+h*k3) return y+h*(k1+2*k2+2*k3+k4)/6 # Twee knopen, dezelfde rekenwaarden als i31/e17. Tijd in seconde.C = np.array([80000.0, 1100000.0])t = np.arange(0, 8*3600+1, 600)def model(logp): ua, koppeling = np.exp(logp) # positieve W/K, schaalbaar fitten y = np.array([18.0,18.0]) waarden = [y.copy()] for links,rechts in zip(t,t[1:]): vermogen = 800.0 if links < 4*3600 else 0.0 def f(z): lucht, buffer = z q = koppeling*(lucht-buffer) return np.array([vermogen-ua*(lucht-5)-q,q])/C for _ in range(10): y = rk4(f,y,60.0) waarden.append(y.copy()) return np.array(waarden) rng = np.random.default_rng(36)waar = model(np.log([20.2,30.0]))metingen = waar + rng.normal(0,0.05,waar.shape)fit = least_squares(lambda p: (model(p)-metingen).ravel()/0.05, np.log([18,26]), bounds=(np.log([5,5]),np.log([80,100])))ua, koppeling = np.exp(fit.x)print("UA, H", *(f"{v:.3f}" for v in (ua,koppeling)), "W/K")print("residu rms", f"{np.sqrt(np.mean((model(fit.x)-metingen)**2)):.4f}", "K")print("nulpunt x^2-2", f"{bisectie(lambda x:x*x-2,1,2):.8f}")for h in (1800,900,450): euler = 20.0 r = 20.0 for _ in range(int(10800/h)): euler += h*(-euler/10800) r = rk4(lambda z:-z/10800,r,h) exact = 20*np.exp(-1) print("stap", h, "Eulerfout", f"{abs(euler-exact):.6f}", "RK4-fout", f"{abs(r-exact):.6f}")assert abs(ua-20.2)<0.2 and abs(koppeling-30)<0.5UA, H 20.179 30.036 W/K residu rms 0.0441 K nulpunt x^2-2 1.41421356 stap 1800 Eulerfout 0.659629 RK4-fout 0.000054 stap 900 Eulerfout 0.317676 RK4-fout 0.000003 stap 450 Eulerfout 0.156001 RK4-fout 0.000000
Stabiliteit is een ander criterium dan nauwkeurigheid
Voor geeft Euler . Een werkelijk uitdovend systeem blijft alleen numeriek uitdoven als . Bij betekent dit . Als wisselt de numerieke oplossing van teken, hoewel echte afkoeling dat niet doet. Voor monotone afkoeling is h≤τ noodzakelijk in deze test; voor nauwkeurigheid kies je veel kleiner.
In het tweeknoopsmodel bepalen beide eigenwaarden van de systeemmatrix de stapgrens. De snelle lucht kan een stap klein maken terwijl de buffer urenlang verandert: een stijve situatie. RK4 heeft een groter maar eindig stabiliteitsgebied. Een impliciete methode kan helpen, maar verplaatst het werk naar stelseloplossingen. Onvoorwaardelijke stabiliteit betekent evenmin automatisch nauwkeurigheid.
Een stabiel systeem numeriek laten ontploffen
- y0=20 K
- De eerste twee Eulerwaarden en de conclusie
- 1De factor is 1−30000/10800=−1,77778, met modulus groter dan 1.
- 2y1=−35,5556 K; y2=63,2099 K. De tekenwisseling en groei komen uit de integrator, niet uit de warmtebalans.
- 3Een kleinere stap moet eerst de stabiliteitsgrens halen en daarna voldoende nauwkeurig zijn. De fysieke parameters aanpassen om de numerieke explosie weg te werken zou de fout verbergen.
Afronding, subtractie en conditionering
Float 64 bewaart ongeveer 16 significante decimale cijfers. Ronding ontstaat bij elke niet exact representeerbare operatie. hoeft binair niet exact 0,3 te zijn. Gebruik een tolerantie die uit de toepassing volgt; willekeurig ‘meer decimalen’ tonen is geen onzekerheidsanalyse.
Bij subtractie van bijna gelijke getallen verdwijnt relatieve informatie. is voor klein x nauwkeuriger als . Voor exponentiële kleine veranderingen helpt np.expm 1(x). Numeriek differentiëren verlaagt truncatiefout bij kleiner h, maar versterkt meetruis en afronding door 1/h. Een goede stap is dus een afweging. Conditionering betreft het probleem; stabiliteit betreft het algoritme dat het oplost.
| foutbron | controle |
|---|---|
| afronding | stabiele algebra, geschikte dtype |
| tijdstap | h halveren en verschil meten |
| meetruis | onzekerheidsmodel en replicatie |
| modeltekort | residuen tegen tijd/input plotten |
Een fit beoordelen en weigeren
Een klein residu kan ontstaan door te veel vrije parameters. Fit niet alle warmtecapaciteiten, koppelingen en sensorvertragingen tegelijk op één korte luchtmeting. Plot residuen tegen tijd, temperatuur en input; een langdurig tekenpatroon wijst op vertraging of een ontbrekende knoop. Valideer op een andere vermogenscyclus en buitenconditie.
Bereken gevoeligheden numeriek: verander één parameter licht en bekijk de verandering van de voorspelling. Bij bijna parallelle gevoeligheidskolommen zijn parameters onderling uitwisselbaar. Een covariance uit lokale linearizatie is dan instabiel. Rapporteer de vastgehouden parameters, grenzen, meetruis, validatiefout en geldigheidsgebied. Een ‘fit’ op synthetische data controleert het programma; ze toont nog niet dat Habitat werkelijk dit model volgt.
| acceptatiebewijs | afwijzingssignaal |
|---|---|
| onafhankelijke proef | zelfde data voor fit en test |
| stabiele parameters bij herhaling | fit raakt grens |
| residuen zonder structuur | fasefout na iedere schakelaar |
| voldoende gevoeligheid | sterk gecorreleerde parameters |
Wetenschappelijk rekenen wordt reproduceerbaar
De NumPy-documentatie beschrijft broadcasting als vormcompatibiliteit vanaf de laatste dimensie: maten zijn gelijk of één. SciPy onderscheidt lokale least-squares-optimalisatie van integratie met fouttoleranties. Deze API-contracten zijn onderdeel van het experiment, naast de fysische vergelijkingen.
Bronnen: NumPy broadcasting, SciPy least_squares en solve_ivp, geraadpleegd 30-09-2026. Een logboek bewaart pakketversies, startwaarde, proefdata, codecommit en fitinstellingen. Dat laat een ander dezelfde uitkomst narekenen en een modelkeuze tegenspreken.
| bestand | inhoud |
|---|---|
| data.csv | tijd, input, beide sensoren, kwaliteit |
| model.py | balans en integrator |
| manifest.json | versies, grenzen, startwaarde |
| resultaat | parameters, residuen en testfout |
Van proef naar digitale tweeling
Het model moet fysica, code en statistiek tegelijk verdragen. De fit levert een onderbouwde parametercombinatie; systeemidentificatie beoordeelt de dynamiek en sensorfusie bewaakt de metingen.
Warmtebalansen en knoopwaarden.
Euler en eerste dynamische modellen.
Eigenwaarden en staprespons.
Validatie en residuen van voorspelmodellen.
Habitat fit UA en H op een afzonderlijke warmteproef, met vaste capaciteiten als eerste identificatiestap. Een nieuwe fit mag de stationsdossierwaarden pas vervangen nadat echte data en een onafhankelijke validatie beschikbaar zijn.
In het kort
- Arrayvormen en eenheden horen bij de berekening.
- Bisectie geeft een bracketgarantie; Newton vraagt een goede start en bruikbare afgeleide.
- Euler en RK4 verschillen in foutorde en stabiliteitsgebied.
- Een parameterfit vraagt identificeerbaarheid, residuenanalyse en onafhankelijke validatie.
Wat je nu kent
- vectoriseren
- Een bewerking over een array uitdrukken in arrayoperaties in plaats van een Python-lus.
- residu
- Het verschil tussen waarneming en modelwaarde.
- conditionering
- Hoe gevoelig de exacte oplossing is voor een kleine wijziging van de invoer.
- discretisatiefout
- Afwijking door een continue vergelijking met eindige stappen te benaderen.
- identificeerbaarheid
- De mogelijkheid om parameters afzonderlijk uit de beschikbare proef te bepalen.