Numeerinen ratkaisumatemaattisen mallin avulla
ongelma
teoreettinen, matemaattinen malli
numeerinen, laskennallinen malli
algoritmi
ohjelma
laskenta
virhearviot ja herkkyysanalyysi
tulosten tarkastelu
 Virhelähteitä
matemaattisen mallin virhe, mallissa on esimer-kiksi liian suuria yksinkertaistuksia
numeerisen mallin virheet, kuten diskretointivirheja katkaisuvirhe
datan virheet, systemaattiset ja tilastolliset
algoritmiset ongelmat (herkkyys, epästabiilisuus,tehottomuus)
laskentatarkkuuden ongelmat (pyöristys-,katkaisu-, ja diskretisointivirheet)
Hyvin asetettu ja huonostiasetettu ongelma
Matemaattinen tehtävä on hyvin asetettu(well-posed), jos ratkaisu
on olemassa kaikilla lähtöarvoilla,
on yksikäsitteinen ja
riippuu jatkuvasti tehtävän alkuarvoista.
Huonosti asetetulla tehtävällä (ill-posed) eiole kaikkia näitä ominaisuuksia.
Hyvin asetettu ja huonostiasetettu ongelma
Hyvin asetetun tehtävän ratkaisuksi saadaanhyvällä algoritmilla hyvä likiarvo.
Jos matemaattinen tehtävä on huonostiasetettu, sitä ei voida ratkaista tarkasti jaluotettavasti.
Huonosti asetetuille tehtäville on kuitenkinkehitetty menetelmiä, joilla tehtävillesaadaan edes käypiä ratkaisuja.
Kokonaisluvut
Kokonaisluvut ovat tietokoneessa tarkkoja.
Tietokoneessa kokonaisluvut esitetään kiinteällämäärällä bittejä, joten luvuilla on ylä- ja alaraja.
Bittien määrä on nykyään käytännössä ainajaollinen tavun bittien määrällä 8.
Kokonaisluvun esittämiseen käytetään yleensäjoko 1 tavu (8 bittiä), 2 tavua (16 bittiä), 4 tavua(32 bittiä) tai jopa 8 tavua (64 bittiä).
 Useimmissä koneissa voidaan käyttää kaikkianäitä eripituisia kokonaislukumuuttujia.
Liukuluvut
Reaaliluvut esitetään tietokoneessa liukuluvuilla.
Liukuluku koostuu kahdesta kokonaisluvusta,mantissasta m ja eksponentista e, jotka kummatkinsisältävät etumerkin.
Kaavana liukuluku on f=m2e, joten on olemassasuurin ja pienin liukuluku fmax ja fmin. Liuku-luvut eivät ole tasaisesti jakautuneet välille (fmin,fmax).
Periaatteessa voidaan käyttää muutakin kantalukuakuin kaksi, mutta kakkonen on nykyään yleisin.
Reaaliluvusta liukuluvuksi
Reaaliluku muunnetaan liukuluvuksi jokokatkaisemalla tai pyöristämällä.
Aritmeettisissa operaatioissa lukuja jokopyöristetään tai katkaistaan.
Yleensä ohjelmointikielissä on mahdollista valitaliukuluvuille useita tarkkuuksia, esimerkiksi 32 tai64 bittiä.
IEEE:n standardi: puolitarkkuuden liukuluvunmantissa on 24 bittiä ja eksponentti 8 bittiä.
Suurin liukuluku on noin 1038 ja pieninpositiivinen liukuluku noin 10-38.
Ylivuoto ja alivuoto
Yli- ja alivuodot johtuvat siitä, että kokonais- jaliukuluvuilla on aina joku ylä- ja alaraja.
Ylivuotoja voidaan joskus välttää algoritmisestikirjoittamalla laskukaava toiseen muotoon.
Esimerkki. an /bn  = (a/b)n
Joskus auttaa muuttujien skaalaus, mutta useinjoudutaan käyttämään ehtolauseita ohjelmantoiminnan varmistamiseksi.
 Pyöristysvirheet
Koska liukuluku on vain approksimaatioreaaliluvulle, pyöristysvirheet ovatväistämättömiä.
Pyöristysvirheitä syntyy lukuja syötettäessä janiillä  laskettaessa.
Keinoja välttämiseen: aritmeettisten operaatioidenmäärän minimointi esimerkiksi analyyttisiakaavoja sieventämällä. Samoin kannattaa pyöristäävasta lopputulokset.
Laskutarkkuuden on oltava riittävän suuri.
Pyöristysvirheet
 Pyöristysvirheet voivat kasautua esimerkiksisarjojen summauksissa ja iteraatioissa.
Kahden liukuluvun yhtäsuuruutta ei pidäohjelmassa verrata suoraan, vaan pitää testata, ettäluvut ovat sopivissa rajoissa samat.
Esimerkki. Kahta liukulukua ja b ei saa verratakäyttäen lauseketta  if a = b, koska tämä muoto onherkkä pyöristysvirheille. Paremmin
     if abs(a-b) < epsilon,
    missä epsilon on sopiva pieni liukuluku.
Kumoutumisvirhe
Kahden reaaliluvun vähentäminen toisistaan voijohtaa virheelliseen tulokseen, jos luvut ovat hyvinsuuria erotukseensa nähden.
Silloin lukujen erotus voi olla samaasuuruusluokkaa kuin epätarkemman luvuntarkkuus ja riittävän tarkkaa vastausta ei saada.
Tällaista virhettä kutsutaan kumoutumisvirheeksi(catastrophic cancellation).
Esimerkki
Merkitään reaalilukuja esittäviä liukulukuax ja y ja niiden virheitä Dx ja Dy.
Jos x=0.5554 ja y=0.5553 ja niiden virheetDx = Dy = 0.00005, niin erotus x-y=0.0001,joka on melkein yhtä suuri kuin sen virhe,0.00007!  (Dahlquist and Björk 1974)
Matlabilla:
» x = 0.5554; y= 0.5553;
» x-y
» ans =  1.0000e-004
» dx = 0.00005; dy = dx;
» % virheen kasautumislaki
» sqrt(dx^2+dy^2)
   ans =   7.0711e-005
Esimerkki
Laskettaessa yhteen hyvin suuri ja pieni luku voikäydä niin, että pienempi luku on samaasuuruusluokkaa kuin suuremman luvun tarkkuus,jolloin pienemmällä luvulla ei ole mitäänvaikutusta lopputulokseen.
Ratkaisuna tähänkin ongelmaan on useinalgoritmin vaihto eli laskukaavan saattaminenjohonkin muuhun matemaattisesti ekvivalenttiin,mutta numeerisesti erilaiseen muotoon.
Esimerkkejä
vuorottelevan sarjan summa, esimerkiksiexp(-x) = 1/exp(x)
numeerinen derivaatta (f(x+h)-f(x))/h
Ongelman skaalaaminen
Peruslaskutoimituksia pitäisi suorittaamieluiten luvuilla, jotka ovat keskenäänsamaa suuruus-luokkaa ja järkevänsuuruisia verrattuina lukualueeseen jaliukulukujen tarkkuuteen.
Ongelma joudutaan usein skaalaamaan,jotta pysyttäisiin liukulukualueen rajoissa.
Skaalaus
Muuttujat eivät saisi olla laadullisia suureita.
 Laaduttomiin suureisiin päästään jakamallatällaiset muuttujat sopivilla probleemaan liittyvillä'mittatikuilla', jotka muuntavat muuttujien arvotjärkevän suuruisiksi.
Käyttäjäystävällinen ohjelma tekee tietenkinskaalaukset sisäisesti. Syöttödata annetaan sillefysikaalisissa yksiköissä ja se palauttaa myöstulokset näissä yksiköissä.  Muunnoksettapahtuvat siis juuri ennen tulostusta ja syötönjälkeen.
Diskretisointi ja katkaisu
Ongelma joudutaan numeerisissa tehtävissädiskretoimaan, josta aiheutuu myös virhettä.
Diskretointi tarkoittaa (jatkuvan) funktionarviointia diskreetillä funktiolla, jossa onäärellinen määrä pisteitä.
Esimerkki: katkaisu
Tarkastellaan yksinkertaisuuden vuoksi jatkuvaayhden muuttujan funktiota f(x).
Tietokoneessa funktiota ei voi approksimoidakoko reaaliakselilla, vaan ainoastaan äärellisellävälillä (a,b), missä a ja ovat  riittävän suuria.
Funktio siis katkaistaan. Laskujen tulokset ovattietysti virheellisiä, jos funktio on nollastapoikkeava välin (a,b) ulkopuolella.
Lorenzin funktion integrointi
>> f = inline(1./(1+x.^2), ’x);
>> quad(f,-10,10)
ans =    2.9423
>> quad(f,-100,100)
ans =    3.1216
>> quad(f,-1000,1000)
ans =     3.1396
>> quad(f,-100000,100000)
ans =    3.1416
vrt. vanha versio antaa 65.1343!!!
Esimerkki: Diskretisointi
Diskretoinnissa väli (a,b) jaetaan osa-väleihin { a=x1 < x2 < …< xN = b}, jafunktion f diskreetiksi approksimaatioksitällä välillä otetaan sen arvojen jono
   {f(a) = f(x1), f(x2),, f(xN) = f(b)}.
Pistetiheyden valinnalla voi olla huomattavavaikutus tuloksen tarkkuuteen.
Lorenzin funktio, integrointipuolisuunnikassäännöllä
x = -10:0.1:10;
trapz(x,f(x))
ans = 2.9423
x = -1000:0.1:1000;
trapz(x,f(x))
ans =  3.1396
x = -1000:1:1000;
trapz(x,f(x))
ans =  3.1513
Numeerinen derivointi
» x = 0:0.1:4*pi;  h=0.1;  subplot(1,2,1),plot(x+h/2,(cos(x+h)-cos(x))/h,x,-sin(x),'.')
» x = 0:0.5:4*pi;  h=0.5;  subplot(1,2,2),plot(x+h/2,(cos(x+h)-cos(x))/h,x,-sin(x),'.')
Tärkeää
Matemaattisesti ekvivalentit algoritmit(antaisivat samat tulokset, joslaskentatarkkuus olisi ääretön ja laskentaankäytettävät resurssit olisivat äärettömät)eivät juuri koskaan anna samoja tuloksiaeivätkä ole juuri koskaan yhtä tehokkaita.
 Numeerisen tarkkuuden arviointi
lähtötietojen virheet
mittaustarkkuudenparantaminen
diskretisointivirheet
pistetiheyden valinta
katkaisuvirheet
laskentavälin laajennus,analyyttinen jatko
pyöristysvirheet
algoritmin ja laskenta-tarkkuuden valinta