Stærðfræði og reiknifræði

Páll Melsted

11. janúar

Yfirlit

  • Inngangur
  • Hvað er reiknifræði
  • Praktísk atriði
  • Python
  • Notebooks
  • fleytitölur

Yfirlit

Hvað er reiknifræði?

Einnig kallað

  • computational science
  • scientific computing
  • numerical methods

Stærðfræði + forritun?

  • Þekking á takmörkum tölva, t.d. fleytitölur
  • Reiknirit til að fá nógu góða nákvæmsefni
  • Tölulegar lausnir vs. lokaðar lausnir
  • Tímagreining á reikniritum
  • Snertifletir við önnur svið

Uppistaðan í námskeiðinu

Vikur 1-4 verða fleytitölur (e. floating point), skekkja í útreikningum, tölulegar lausnir á jöfnum, fastapunktsaðferðir.

Vikur 5-13 verða línulega algebra, tölulegar útfærslur á línulegri algebru, ýmsar hagnýtingar og gagnavinnsla.

Dæmi um hagnýtingar

  • Ólínuleg bestunarverkefni
  • Myndvinnsla og myndgreining
  • Hljóðvinnsla og hljóðgreinig
  • Flokkun á skjölum
  • Vélrænn lærdómur (e. machine learning)
  • Tímaraðagreining

Markmið í námskeiðinu

Að öðlast góðan bakgrunn í reiknifræði. Eftir námskeiðið eigið þið að

  • geta leyst lítil línuleg jöfnuhneppi (2x2 og 3x3) handvirkt og nýtt forritasöfn til að setja upp og leysa stærri línuleg verkefni.
  • geta skrifað Python-forrit fyrir töluleg verkefni
  • geta leyst ýmis einföld reiknifræðileg verkefni, bæði með og án forritunar

Praktísk atriði

  • Heimasíða
  • Vikublað 1
  • Piazza
  • Gradescope

Fleytitölur

Nálgun á rauntölunum

Nokkrar leiðir til að kóða rauntölur. Fastur punktur (fixed point), t.d. 6 stafir, notum 2 fyrir aftan punkt. Geymt í minni sem heiltala 0-999999. Getum táknað tölur frá 0.00 til 9999.99

  • Mjög einfalt í notkun
  • Í lagi ef við vinnum alltaf með fast bil af tölum
  • Notað í gömlum tölvuleikjum (Doom, PlayStation)
  • Sumir örgjörvar ráða ekki við meira

Fastur punktur

Ókostir eru að það er auðvelt að tapa nákvæmni, t.d.

\(1.25 \times 1.25 = 1.5625 = 1.56\)

\(0.01 \times 0.01 = 0.0001 = 0.00\), því við töpum síðasta aukastaf.

Stundum þurfum við litlar tölur t.d. \(10^{-18}\) fyrir efnafræði og stórar tölur, \(10^{18}\) fyrir stjörnufræði.

Lausn

Fórnum einum staf í nákvæmni til að kóða fyrir veldisvísi. T.d. fyrsti stafur 0-9 (eða -4 til 5) kóðar fyrir veldinu á 10. Hinir 5 stafirnir skipta bilinu upp í jafnmarga hluta.

\[-4 \to 10^{-4} - 10^{-3}\\ -3 \to 10^{-3} - 10^{-2}\\ \ldots\\ 0 \to 10^{0} - 10^{1}\\ \ldots\\ 5 \to 10^5 - 10^6 \]

Fleytitölur

Táknum núna

\[ 1.25 = 1.25 \times 10^0 \equiv (0,12500)\\ 782.5 = 7.825 \times 10^2 \equiv (2,78250)\\ 0.01 = 1\times 10^{-2} \equiv (-2,10000) \]

Þar sem fyrri hluti er veldisvísirinn og seinni hlutinn er fimm stafa heiltala sem kóðar tölur frá 1.0 til 9.9999.

Fórnum nokkrum stöfum af nákvæmni til að finna rétta skalann til að vinna með. Þ.e. punkturinn er færist til og er fljótandi. Einnig kallað staðalform (e. scientific notation), fjöldi stafa fyrir aftan punkt er kallað fjöldi markverðras stafa.

Dæmi

\[ 1.25 \times 1.25 = 1.5625 = (0,15265)\\ 0.01 \times 0.01 = 0.0001 = (-4,10000)\]

Hér töpum við ekki svarinu því skalinn breytist með niðurstöðunni.

IEEE-754

Er staðall til að kóða fleytitölur á tvíundarformi og skilgreina nákvæmlega reikniaðgerðir á þeim. Þetta var nauðsynlegt því mismundandi niðurstöður gátu fengist með mismunandi örgjörvum. Staðallinn skilgreinir

  • Bitaframsetningu á fleytitölum
  • Nokkrar stærðir, half, single, double precision
  • Nauðsynlegar aðgerðir, t.d. samlagningu og margföldun o.s.frv.
  • Aðrar aðgerðir, \(e^x, \ln(x), \sqrt{x}\)
  • Námundunarreglur
  • Sértilfelli

Allir örgjörvar sem bjóða upp á fleytitölur fylgja þessum staðli. Flestir eru með einfaldar reikniaðgerðir innbyggðar, notum forritasöfn til að fá rest.

Float og double

Single precision float notar 32 bita (4 bæti) en double notar 64-bita (8 bæti).

  • 1 biti notaður fyrir formerki (+/-)
  • 8 bitar fyrir veldisvísi (e. exponent) (11 bitar f. double)
  • 23 bitar fyrir tölukjarna (e. mantissa/significand) (52 bitar f. double)

Veldisvísirinn er tala frá 0-255, drögum frá 127 (e. bias) til að fá veldið á 2. Möguleg gildi eru \(-126,-125,\ldots,126,127\).

-127 og 128 (allir bitar 0 eða allir 1) hafa sérstaka merkingu.

Tölukjarninn er 23-bita heiltala. Tvíundatölur á staðalformi byrja ekki á 0, bara á 1. Því þarf ekki að geyma fyrsta 1 í minni. Ef tölurnar eru \((s,e,m)\) þá er gildið \[ (s,e,m) \equiv (-1)^s\cdot (1.m)\cdot 2^{e-127} \]

T.d. væri 1.25 geymt sem

0 01111111 01000000000000000000000

Einfaldar reikniaðgerðir

samlagningu

Til að leggja saman \(x+y\) þarf að

  1. Tryggja að þær hafi sama veldisvísi, minni heiltölunni er hliðrað niður
  2. Leggja saman heiltölukjarnana
  3. Mögulega hliðra heiltölukjarna og færa til veldisvísi.

Dæmi með 8-bita formi, 1 bita í formerki, 4 í veldisvísi og 3 í heiltölukjarna.

\(1.110\times 2^2 + 1.000\times 2^0\)

Töpum aukastöfum ef tölurnar eru misstórar.

Margföldun

Sama form, margföldum \(1.010\times 2^0 * 1.010\times 2^0\)

  1. Leggjum saman veldisvísa
  2. margföldum heiltölukjarna
  3. Mögulega hliðra heiltölukjarna og færa til veldisvísi.

Töpum ekki aukastöfum fyrir misstórar tölur.

Furðulegar reikniaðgerðir

Samlagning og margföldun með rauntölur er

  • tengin aðgerð \((x + y) + z = x + (y + z)\)
  • víxlin aðgerð \(x + y = y + x\)
  • dreifin \(x \cdot (y + z) = x\cdot y + x\cdot z\)

Fleytitölusamlagning er bara víxlin.

Meiri furðulegheit

Það eru til tölur þ.a. \(1+x = 1\) og \(y + 1 = y\)

Það verður verkefni á heimadæmunum að finna þær.

Summur af fleytitölum

Ef við reiknum summuna \(\sum_{i=0}^n x_i\) fyrir fleytitölur þá skiptir röð aðgerða máli upp á lokaniðurstöðu.

Við getum tapað mikilli nákvæmni með því að byrja fyrst, vs. byrja aftast.

Furðulegar fleytitölur

Veldisvísirinn fyrir 32-bita tölur gat ekki verið -127 og 128 (þ.e. eftir að búið var að draga frá 127). Þessi gildi eru notuð til að tákna sérstakar fleytitölur

  • \((s,e,m) = (0,0,0)\) táknar töluna \(0\)
  • \((s,e,m) = (1,0,0)\) táknar "töluna" \(-0\), þ.e. 0 en samt neikvæð
  • \((s,e,m) = (s,255,0)\) tákna \(+\infty\) eða \(-\infty\) eftir formerki
  • \((s,e,m) = (s,255,\neq 0)\) táknar "NaN = not a number" sem er ruslakista
  • \((s,e,m) = (s,0,m)\) þar sem \(m\neq 0\) tákna tölur sem eru ekki á staðalformi

Tölur sem eru ekki á staðalformi tákna \[(-1)^s (0.m) \times 2^{-127}\]

Overflow

Þegar niðurstaða verður of stór til að geymast sem fleytitala verður hún að "Inf" eða "-Inf". Þetta kallast overflow.

Nýjar reiknireglur gilda um "Inf", t.d.

  • Inf + Inf = Inf
  • Inf + x = Inf, x venjuleg
  • -Inf + x = -Inf, x venjuleg
  • Inf - Inf = NaN
  • 1.0/0.0 = Inf
  • 1.0/-0.0 = -Inf

NaN er n.k. ruslakista ef við notum NaN í útreikningi verður niðurstaðan NaN.

Underflow

Þegar niðurstaða er of lítil er hún námunduð niður í 0 (eða -0). Þetta kallast underflow.

Tölur sem eru ekki á staðalformi, þ.e. minni en \(2^{-127}\) tapa nákvæmni því fjöldi aukastafa er minni, en hægja samt á underflow í venjulegum útreikningum (e. gradual underflow).

T.d. eru til tölur þ.a. \(x\neq 0, x^2 = 0\). Stundum þarf að umrita reikninga til að tapa ekki nákvæmni.

Python og notebooks

Python er forritunarmál sem er mun einfaldara í notkun en t.d. Java og C++. Við munum læra nóg í python til að framkvæma útreikninga en hugsa minna um hugbúnaðarferla.

Fyrir tölulega útreikninga, línulega algebru og gröf munum við nota numpy og matplotlib.

Python verkefni verða sett fyrir sem Jupyter notebooks (hét einu sinni iPython notebook) sem blandar saman texta og útreikningum.

Fyrir næstu viku

  • Dæmi á vikublaði. Skil á mánudag.

  • Setja upp Python og Jupyter (notebook), leiðbeiningar á Piazza.

  • Renna yfir ítarefni fyrir fleytitölur