Numeriska beräkningar i Naturvetenskap och Teknik Del A, Tekniska Aspekter, användning av MATLAB 1. Kort historik, varför beräkningar med maskin? 2. Programmering 3. Demo av baskunskaper… Del B, Numeriska Metoder 1. 2. 3. 4. Numerisk lösning av differentialekvationer Algebraiska metoder, matrisoperationer Anpassningar av modeller till mätdata Monte Carlo simuleringar Numeriska beräkningar i Naturvetenskap och Teknik Varför Numeriska Beräkningar? 1. Arbetsbesparande för långa men triviala algebraiska beräkningar. 2. Reproducerbara resultat, minimering av fel p.g.a ”den mänskliga faktorn”. Dock dyker nya möjligheter till fel upp: programmeringsfel. 3. Lösning av ekvationer, algebraiska men framförallt differentialekvationer som saknar lösning i ”sluten form”, dvs analytisk lösning. 4. Monte Carlo simuleringar av stokastiska processer Punkt 3 och 4 är två fundamentala orsaker till att datorer är oumbärliga verktyg inom modern fysik. Numeriska beräkningar i Naturvetenskap och Teknik William Shickard:1592 – 1635 Uppfann 1623 den första mekaniska räknemaskinen. Möjliggjorde addition och subtraktion av 6 siffriga tal 1645 Blaise Pascal: 1623-1662 1623 Uppfann den s.k ”Pascalinen” ca. 1645. Syftet var att underlätta faderns arbete som skattmästare i Rouen. Maskinen kunde addera och multiplicera. Subtraktion var tidsödande komplicerat. Numeriska beräkningar i Naturvetenskap och Teknik Gottfried Leibnitz: 1646-1716, Konstruerade ca. 1670 den första maskin som kunde utföra alla de fyra grundläggande algebraiska operationerna. Charles Xavier Thomas de Colmar: 1785-1870. Baserad på Leibnitz design konstruerar Thomas den första kommersiellt framgångsrika beräkningsmaskinen, arithometern. Ca 1500 maskiner tillverkas och används huvudsakligen inom den franska förvaltningen 1820 1670 Numeriska beräkningar i Naturvetenskap och Teknik Charles Babbage: 1791-1871 Design av den första programmerbara beräkningsmaskinen med syftet att minska antalet fel i matematiska tabeller. Ada Countess of Lovelace: Assistent till Babbage. Känd som den första programmeraren. Numeriska beräkningar i Naturvetenskap och Teknik Alan Turing:1912-1954 Datorvetenskap pionjär. Formalisering av algoritm begreppet. Introducerade 1936 den teoretiska bakgrunden till datormaskiner med den s.k. Turingmaskinen, bla. definierad genom en uppsättning väldefinierade instruktioner, lagringsutrymme etc. Idag kallas en maskin av denna typ även en finite 1936 state-machine. Konrad Zuse:1910-1995 Konstruerade 1941 den första program kontrollerade datormaskinen. Baserad på telefonreläer. Delvis finansierad av ”Deutsche Versuchsanstalt fur Luftfarth”. Numeriska beräkningar i Naturvetenskap och Teknik John von Neumann:1903-1957 En av de första fakultetsmedlemmarna vid IAS, Princeton (tillsammans med Einstein, Gödel, Weyl). Insatser inom matematik, fysik, ekonomisk teori och datorvetenskap. Skrev 1945 ”The first draft report on the EDVAC”. EDVAC, Electronic Discrete Varible Automatic Computer, var en uppföljare till den mer kända ENIAC, the Electronic Numerical Integrator and Calculator som var den första storskaliga programmerbara digitala datorn (vacuumrör). Till skillnad från ENIAC kunde EDVAC omprogrammeras utan handgripliga omkopplingar då både program och data lagrades i minne. Denna typ av maskin som lagrar program och data i samma minnesenhet är den dominerande datorarkitekturen idag och benämns ofta ”von Neumann arkitektur”. Numeriska beräkningar i Naturvetenskap och Teknik CPU och instruktionsset Varje instruktion som processorn (CPUn) kan utföra motsvarar en kod, dvs ett tal i maskinens minne. Typiska instruktionsset innehåller en s.k. Opcode som är kommandot som skall utföras och en eller flera operander som Opcoden använder som argument. Alla instruktioner är operationer på binära tal i datorn minne. En typisk sekvens för att addera två tal a och b kan ex.vis vara: load a in register 1 load b in register 2 add register 1 to register 2 store register 2 in b Dvs att programmera ett komplext problem på detta vis direkt i maskinkod blir mycket tidsödande och många möjligheter till fel introduceras i kodningen... Numeriska beräkningar i Naturvetenskap och Teknik Lågnivå resp. högnivåprogrammering I lågnivå eller maskinnära programmering använder man ett programmeringsspråk vars syntax ligger nära maskinens instruktionsset. Ett vanligt sätt att programmera maskinnära är att använda s.k. assembler programmering. Med denna metod ges instruktioner som addition, subtraktion, bitshift, register access etc mha av sk. Mnemonics som översätts till de tal som motsvarar en viss instruktion, dvs till maskinkod. Mnemonics av denna typ kan ex. vis vara: DEC B, (decrease content of register B), ADD A,B (add reg A to reg B) etc. Det mesta av modern tillämpad programmering sker dock i högnivåspråk vars syntaxer är sådan att de ligger närmare vårt vanliga språk. Många olika varianter av högnivåspråk har utvecklats över tiden. Några av de mer kända är FORTRAN, COBOL, ADA, LISP, PASCAL, C, SIMULA, C++... Alla dessa har liknande satsstrukturer inbyggda, men deras syntax är något olika. Numeriska beräkningar i Naturvetenskap och Teknik Tolkade resp. kompilerade programspråk Görs varje gång programmet körs Källkod Görs en gång Tolk Producerar exekverbar kod ”rad för rad” Kompilator Maskinkod Producerar exekverbar fil Maskinkod Snabbt Rel. långsamt BASIC, olika scriptspråk (Perl, Ruby) FORTAN, C, C++ MATLAB Java: bytecode compilator + Virtual machine -> maskinkod => Portabilitet (compile once run everywhere) Numeriska beräkningar i Naturvetenskap och Teknik MATLAB som kalkylator: Kommandofönstret i MATLAB >> 2 * 2 ans = 4 >> ans*2 ans =8 det senaste svaret lagras i ans >> pi ans = 3.14159265358793 Numeriska beräkningar i Naturvetenskap och Teknik Variabel Storhet man själv inför med avsikt att tilldela värden I problem i klassisk fysik kan det vara tid, acceleration, position etc... En mycket GOD ide att ge sina variabler namn som anknyter till deras funktion. För fysikaliska problem är det bra att använda notation som är vedertagen för en fysikalisk storhet. Detta är till mycket stor hjälp vid programskrivning, men något man tjänar på även i enklare sammanhang. Numeriska beräkningar i Naturvetenskap och Teknik Se ex.vis på det triviala exemplet: >> A=1 A= 1 >> B=2 B= 2 >> C=A*B C= 2 Numeriska beräkningar i Naturvetenskap och Teknik Och jämför med: >> m=1 m= 1 >> a=2 a= 2 >> F=m*a F= 2 >> Numeriska beräkningar i Naturvetenskap och Teknik Variabler En variabel kan vara av olika typ. I de flesta kompilerade programspråk måste man deklarera vilken typ en variabel har eftersom detta avgör vilken typ av variabel som skall lagras i minnet. Dessa typer kan ex. vis vara: 1. heltal med olika längd, 8, 16, 32, 64 bitar etc 2. flyttal av olika längd, i dagligt tal decimaltal med olika precision 3. vektorer/matriser 4. teckensträngar etc... Normalt inleds ett sådant program med någon form av deklarationssekvens. Numeriska beräkningar i Naturvetenskap och Teknik Variabler I MATLAB, liksom ex.vis i BASIC som också är ett tolkat språk, behövs ingen deklaration av variabelns typ. Istället bestämmer tolken vilken typ av variabel som används från de tilldelningssatser som variabeln används i: >> A=1.234 A= 1.2340 A är ett flyttal Numeriska beräkningar i Naturvetenskap och Teknik Variabler >> b=[1;2;3] b= 1 2 3 b är en vektor >> B= [1 2 3; 4 5 6;7 8 9] B= 1 2 3 4 5 6 7 8 9 B är en matris Matriser kan ha fler dimensioner än två... Numeriska beräkningar i Naturvetenskap och Teknik Variabler Det går också att skriva >> b(1)=1 b =1 >>b(2) =2 b=1 2 >>b(3) =3 b=1 2 3 Bra i program.... Numeriska beräkningar i Naturvetenskap och Teknik Variabler På samma sätt >> A(1,1)=1 A=1 >> A(1,2) = 2 A=1 2 >>A(2,1) = 3 A=1 2 3 0 >>A(2,2) = 4 A=1 2 3 4 Addera index för fler dimensioner. Går att addera matriser till matriser av högre dimension. Numeriska beräkningar i Naturvetenskap och Teknik Speciella vektorer: >>a=1:10 ans= 1 2 3 4 5 6 7 8 9 10 >>a=0:0.1:1 ans= 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 Andra: linspace(a,b) hundra jämt fördelade element mellan a och b linspace(a,b,n) n element mellan a och b Delvektorer: x(i), element i x(i:j) delvektorn av elementen i till j x(i:k:j) delvektorn av elementen i till j med steg k x([i1 .... ip]) delvektorn av de givna elementen Se övningsuppgifter Numeriska beräkningar i Naturvetenskap och Teknik Speciella matriser zeros(n) nxn noll matris zeros(n, o, p...) n x o x p noll matris ones(...) på samma sätt matris med ettor eye(..) enhetsmatris, diagonala ettor rand(..) n x n slumpmatris, 0 till 1 randn(..) normalfördelade element Kompilerat språk så är definieras ofta storleken I deklarationen. Numeriska beräkningar i Naturvetenskap och Teknik Precision Den inre precisionen i en beräkning i MATLAB ges av att tal lagras som s.k. ”doubles”. I en modern 32 bitars maskin så lagras en double: tecken + exponent + mantissa i 64 bitar vilket ger en precision av ung. 16 siffror. Numeriska beräkningar i Naturvetenskap och Teknik Tilldelningssatser Notera att tilldelningssatser inte är ekvationer! >> x = 1 x=1 >>x = x +1 x=2 dvs till det tidigare värdet i minnespositionen given av x (=1) adderas 1 med resultatet 2. >>workspace -> ger lista av alla variabler Numeriska beräkningar i Naturvetenskap och Teknik Två resultat som kan tyda på att en beräkning inte riktigt gått som tänkt Inf (Infinity) >>a=2 a=2 >>a/0 ans = inf NaN (Not a Number) >> 0/0 ans = NaN dvs inbyggd ‘exception handler’ Numeriska beräkningar i Naturvetenskap och Teknik Tilldelningar & operatorer: De vanliga operatorerna fungerar precis som förväntat: addition + subtraktion multiplikation * division / potens ^ Och har samma prioritetsordning som vanligt >>a=2*3-1*2 a=4 >>a=2*(3-1)*2 a=8 Numeriska beräkningar i Naturvetenskap och Teknik Tilldelningar & operatorer: En matris multipliceras med en skalär görs också på vanligt vis: >>A=[1 2 3; 1 2 3; 1 2 3]; >>c = 2; >>B=c*A B= 2 4 6 2 4 6 2 4 6 Men… Numeriska beräkningar i Naturvetenskap och Teknik Tilldelningar & operatorer: Elementvis multiplikation görs med ./ >> A.*B 2 8 18 2 8 18 2 8 18 På samma sätt elementvis division ./ Numeriska beräkningar i Naturvetenskap och Teknik Tilldelningar & operatorer: Vanlig matrismultiplikation, antalet rader i A lika med antalet kolonner i B: >> A*B 12 24 36 12 24 36 12 24 36 Andra funktioner: Transponat: A’ Invers: inv(A) Determinant: det(A) Numeriska beräkningar i Naturvetenskap och Teknik Tilldelningar & operatorer: Finns också funktioner för skalärprodukt och vektorprodukt för vektorer: >>a = [1 2 3]; >>b = [1 2 3]; >>c = dot(a,b) ans = 14 >>cross(a,b) ans = 0 Numeriska beräkningar i Naturvetenskap och Teknik Varför program? 1. Problem som kräver upprepade beräkningar ex.vis olika indata för att ge ett set av utdata 2. Komplicerade problem med komplicerade beräkningar ex. vis differential-integral ekvationer 3. Idag naturligtvis också i många styrsystem av olika slag. ofta definierade som finite state maskiner flygplan, verkstadsmaskiner, produktionsmaskiner Numeriska beräkningar i Naturvetenskap och Teknik Att tänka på innan och medan man programmerar: 1. Definiera det övergripande problemet 2. Titta efter problemets inre struktur, sök delproblem 3. Välj lösningsmetod(er) 4. Analysera indata och utdata. Vad går in i pgm och ut från det. 5. Gör ev. flödesschema 6. Debugga programmet medan det skrivs. Skriv aldrig från A till Ö. 7. Dokumentera kontinuerligt, separat och med pgm-kommentarer Numeriska beräkningar i Naturvetenskap och Teknik Fel i program är huvudsakligen av två typer: 1. Syntax fel Rena skrivfel (stavfel), missförstånd av syntaxen eller bristande kunskap om syntaxen. Dessa fel upptäcks av kompilatorn eller tolken och ett felmeddelande ges. En erfaren programmerare lär sig vilka typiska misstag som hör ihop med ett givet felmeddelande och löser ett sådant problem snabbt. 2. Run time fel Designfel i programmet. Kan leda till att felaktiga resultat men också till ”programkrash”. Ofta förorsakat av för dålig analys av hur ett fullständigt set av indata handas av programalgoritmen. “Farliga fel”. Lösning, skriv korta delar av programmet och testa, debugga ofta! Numeriska beräkningar i Naturvetenskap och Teknik Byggblock i program: 1. Satssekvenser På varandra följande enkla satser, ex. vis tilldelningar, alegebraiska operationer, input/ouput operationer 2. Alternativa flödesvägar Beroende på givet villkor skall olika satssekvenser utföras Ex.vis om sökt nogrannhet i en viss beräkning har uppnåtts så avbryts beräkningen och en ny beräkning beroende av den tidigare tar vid alt. har slutresultatet uppnåtts 3. Repetitioner En uppgift utförs flera gånger tills ett givet villkor uppnåtts. Ex.vis om 10 termer i en serie skall räknas ut kan en given iterationsformel upprepas 10 ggr. Numeriska beräkningar i Naturvetenskap och Teknik Hur sätter man upp ett styrvillkor? Numeriska beräkningar i Naturvetenskap och Teknik Logiska uttryck: Uttryck med svar av typen sant el. falskt, motsvaras av 1 el. 0 a=1;b=2, a==b falskt, &, |, ~ < <= == >= ~= (skilt från) MATLAB specifikt any(arg) något element ~= all(arg) alla element ~= Numeriska beräkningar i Naturvetenskap och Teknik Alternativa flödesvägar If-satser if logiskt uttryck satsgrupper endif if a~=1 disp(a) endif if logiskt uttryck satsgrupper else satsgrupper endif if a==1 disp(a) else disp(b) endif Kan byggas ut Numeriska beräkningar i Naturvetenskap och Teknik Alt. If logiskt uttryck satsgrupp elseif logiskt uttryck satsgrupp elseif logiskt uttryck satsgrupp .... else satsgrupp endif Numeriska beräkningar i Naturvetenskap och Teknik Switchsatser: switch variabel case värde1 satsgrupper case värde2 satsgrupper switch a case {1} disp (a) case {7} b=input(’give b’) ’ .... end case värde3 satsgrupper case {11.7} c=23 otherwise satsgrupper otherwise a=a+23 end Numeriska beräkningar i Naturvetenskap och Teknik For loop: for variabel = a:h:b for a=0:0.1:10 satsgrupper b=b+a end end while logiskt uttryck while a<b While loop: satsgrupp end a=a+0.1 end Loopar kan förstås skrivas inuti andra loopar, då får man s.k. nästlade loopar... Error(teckensträng), pause, break kan användas för styrning ` Numeriska beräkningar i Naturvetenskap och Teknik Error(teckensträng) avbryter m-fil och skriver ut sträng pause väntar tills godtycklig tanget trycks ned break kan användas för styrning går ur den while och for loop programmet exekverade i Numeriska beräkningar i Naturvetenskap och Teknik Funktioner När alla delproblem i programmet har definerats så blir det ofta naturligt att utföra vissa uppgifter med samma kod som kan kallas på flera gånger från ett huvudprogram. Definition: Function [utvar1, utvar2, utvar…] = filnamn(invar1, invar2, invar…) %kommentarer Exempel på anrop: [b1, b2, b3….] = filnamn(a1, a2,a3….) Numeriska beräkningar i Naturvetenskap och Teknik Globala variabler: Variablerna i en funktion är normalt lokala, d.v.s de sätts till 0 när programexekveringen lämnar funktionen. Man kan dock definiera att vissa variabler skall vara åtkomliga utanför rutinen och därmed inte nollställas. Detta görs med en global definition enl: global var1 var2 … Numeriska beräkningar i Naturvetenskap och Teknik Förmedlning av indata till program och utdata från program, s.k. i/o INDATA 1. Användaren ger indata som svar på frågor från programmet (terminal input) 2. Hårdkodning, indata ges i programmet i form av tilldelningssatser 3. Indata läses från fil UTDATA 1. Skrivs på skärmen (terminal output) 2. Skrivs till fil Numeriska beräkningar i Naturvetenskap och Teknik Input/Output >> svar = input(‘ge input värde:’) ge input värde:10 svar= 10 >>svar=input(‘ge input värde:’) ge input värde:’abc’ svar= abc Skriva till skärmen med disp >>disp(svar) abc Numeriska beräkningar i Naturvetenskap och Teknik Läsa skriva till-från filer 1. Spara workspace save myfile sparar alla variabler i myfile.mat load myfile.mat läser in alla variabler från myfile alt. save myfile a b c sparar variablerna a, b, c 2. Formatterad inläsning och utskrift fp= fopen(namn,’r’), öppnar fil för läsning fp= fopen(‘namn’,’w’), öppnar fil för skrivning Numeriska beräkningar i Naturvetenskap och Teknik Läsa skriva till-från filer stänga fil: fclose(fp) läsa från fil: A=fscanf(fp,formatkod, dim) dim = n, läs n element till A som kolonnvektor dim = inf, läs alla tal i filen till A som kolonnvektor dim = [m,n], m x n element till A som m x n matris skriva till fil: A=fprintf(fp,formatkod, A, dim) Formatkoder %e, %E exponentform med litet/stort e %f, decimalform, %u heltal, %s teckensträng, \n ny rad Numeriska beräkningar i Naturvetenskap och Teknik Input/Output Mer sofistikerad utskrift: fprintf(formatkod,x) Formatkoder: %a.bf decimalform, a siffror varav b decimaler, skrivs ut högerställt %a.be exponent, litet e %a.bE exponent, stort E %u heltal >>a = 1.1234; >>fprintf(‘talet är %4.2f’,a) Talet är 1.23 Numeriska beräkningar i Naturvetenskap och Teknik M-filer I MATLAB kan man skriva sina program el. script i s.k. m-filer m.h.a. en inbyggd editor och en debugfunktion. För större program lägger man gärna olika funktioner i egna m-filer Öppna editorn med >>edit