Beräkningar i naturvetenskap och teknik

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