01-Uvod u numeričke metode - hr-HR

UVOD U NUMERIČKE METODE
Opći podaci o predavaču i predmetu
Prof.dr.sc. Marijan Đurek
marijan.djurek@fer.hr
Fakultet elektrotehnike i računarstva
Zavod za primijenjeno računarstvo
tel:
tajnica:
(01) 6129 923
(01) 6129 915
URL: http://www.zpr.fer.hr/zpr/
1
Numeričke metode ili analitičko rješenje
„
„
„
Numeričke metode predstavljaju samo jednu od mogućnosti na
koji način se mogu rješavati problemi iz područja više
matematike uz pomoć računala.
Osnovna prednost numeričkih postupaka je u tome da se
rješenje može dobiti čak i u slučajevima kada nije moguće
pronaći analitičko rješenje.
Na primjer integral koji daje duljinu luka funkcije y=sin(x)
π
⌠
2
⌡ √1 + cos (x) dx
0
nema analitičko rješenje ali ga se numeričkim postupcima vrlo
lako rješava i to bez nekakvih dosjetki, genijalnih supstitucija ili
parcijalnih rješenja.
Numeričke metode daju numerička
rješenja
„
„
„
Analitički postupci daju rezultat u terminima matematičkih
funkcija koje se mogu evaluirati za bilo koje specifične slučajeve.
Također ovakvo rješenje omogućava detaljno praćenje toka
funkcije (graf funkcije) što numerički postupci ne osiguravaju iako
se često mogu nacrtati grafovi dijelova promatrane funkcije.
Rješenje koje daje numerički postupak je uvijek aproksimacija,
ali uglavnom po volji točna. Naravno, ovdje postoje brojni
problemi u postizavanju određene razine preciznosti računa s
obzirom na način na koji računalo prikazuje brojeve i kako
obavlja računske operacije nad njima.
Da bi se postigla visoka preciznost rješenja treba načiniti veoma
veliki broj malih računskih operacija koje računalo na svu sreću
obavlja velikim brzinama i to bez pogreški kojima je ljudsko biće
veoma sklono.
2
Kategorije problema koje se rješavaju
numeričkim postupcima
„
„
„
„
„
„
„
„
„
„
traženje korijena nelinearnih jednadžbi
rješavanje velikih sustava linearnih jednadžbi
rješavanje skupa nelinearnih jednadžbi
različite vrste interpolacija i ekstrapolacija
deriviranje bilo kojeg reda čak i kada je funkcija zadana tabelarno
integracija bilo koje funkcije čak i kada je ona zadana tabelarno
rješavanje ordinarnih diferencijalnih jednadžbi gdje su dani
početni uvjeti za varijable
rješavanje rubnih problema, svojstvenih vrijednosti i svojstvenih
vektora
dobivanje numeričkog rješenja za sve tipove parcijalnih
diferencijalnih jednadžbi
aproksimacije tabelarnih podataka funkcijama
Programi za numeričku analizu
„
„
„
Računalo umjesto čovjeka, čije je radno vrijeme veoma skupo,
obavlja točno i brzo mnoštvo odvojenih računskih operacija. Da
bi se to postiglo, računalu se u moraju obliku programskog
rješenja dati detaljna uputstva o načinu kako se pojedini
numerički problem rješava.
Programira se u različitim programskim jezicima (C, C++, C#,
Java)
Numerička analiza predstavlja značajni segment u inženjerstvu i
radi toga postoji na tržištu veliki broj programskih paketa: IMSL
(International Mathematical and Statistical Library),
MATH/LIBRARY, LAPACK (Linear Algebra Package), Math
Library for Java, Compaq Portable Math Library.
http://www.vni.com/products/imsl/
http://www.netlib.org/lapack/
http://www.alphaworks.ibm.com/tech/mathlibrary4java/
3
Programski sustavi za obavljanje
simboličke algebre
„
„
„
Alternativni put rješavanju tehničkih problema je korištenje
programskih jezika visokog nivoa koji su u mogućnosti
obavljati i simboličku algebru oponašajući način kako to
matematičari rade ručno. To su Mathematica, MathCad,
Maple, MATLAB …
Interno na temelju ugrađenih pravila simboličke algebre i
niza tablica s pripremljenim konverzijama ovi sustavi bez
pogreške mogu simbolički riješiti veoma komplicirane
sustave.
Ako je to korisniku povoljnije ovi programi mogu dati i
numeričko rješenje s po volji visokom preciznošću.
Maple 10
http://www.maplesoft.com/
za studente, profesionalce i znanstvenike
4
Mathcad 13
http://www.mathsoft.com/
„
„
„
„
Mathcad je veoma bogat programski paket za rješavanje
matematičkih problema, koji pruža veliki izbor alata i pomoćnih
sredstava za različite matematičke analize te vizualizacijske
tehnike za grafičku prezentaciju rješenja.
Korisnik može ispisivati tekst ili komentare kako bi bolje
dokumentirao svoj rad.
Kombiniranjem teksta, grafike i formula u jednoj radnoj stranici,
Mathcad omogućava jednostavan zapis najkompleksnijih
proračuna.
To je moćan alat za rješavanje bilo kojeg matematičkog
problema.
MATHEMATICA
http://www.wolfram.com/
http://www.systemcom.hr/ zastupnik za RH
„ Mathematica je sofverski sustav koji oblikuje potpuno integriranu
radnu okolinu za računanje i komunikaciju.
„ Prva inačica izdana je 1988. godine i od tada je imala veliki
utjecaj na način uporabe računala u tehničkim, znanstvenim i
mnogim drugim područjima.
„ Mathematicu je razvila kompanija Wolfram Research Inc. (WRI)
uz pomoć svjetskog tima stručnjaka predvođenih Stephenom
Wolframom.
„ Uspjeh Mathematice bio je potpomognut kontinuiranim rastom
kompanije WRI i omogućio je razvoj velikog broja neovisnih
poslova povezanih s tim alatom.
5
MATHEMATICA 5.2
„
„
To je jedan od rijetkih proizvoda koji
je dostupan na većini PC i UNIX
(uključujući i LINUX) platformi.
WRI nudi također paletu samostalnih
proizvoda oslonjenih na moćnu
jezgru Mathematice, fokusiranih za
posebne primjene, kao što su:
‰
webMathematica,
‰ gridMathematica,
‰ Mathematica for the Classroom,
‰
Mathematica Teacher's Edition i
‰ Mathematica CalcCenter.
MATLAB® 7.2
http://www.mathworks.com/
„
„
„
„
„
„
MATLAB služi za rješavanje različitih matematičkih problema, te
čitav niz problema vezanih uz digitalnu obradu signala, upravljanje,
regulaciju i idetifikaciju sustava.
Program omogućuje lako dodavanje novih funkcija izgrađenih
pomoću ugrađenih naredbi.
Podaci u MATLAB-u se tretiraju kao matrice, odnosno reci i stupci.
Obična varijabla se također predstavlja kao matrica s dimenzijom
(1x1).
Program sadrži sve naredbe i operacije iz linearne algebre
(zbrajanje, mnozenje, traženje vlastitih vrijednosti itd.). Svi su podaci
u double float obliku (pomični zarez dvostruke preciznosti) što
osigurava dovoljnu dinamiku i točnost za gotovo sve primjene.
Pored realnih varijabli odnosno matrica, program podržava i
kompleksne brojeve.
6
Derive Version 6
http://www.mathware.com/derive.html
„ Matematički pomoćnik za studente, nastavnike, inženjere i
znanstvenike
„ Moćan programski algebarski sustav koji rješava široki spektar
simboličkih i numeričkih zadataka.
„ Rezultati se mogu prikazati grafički kao 2-D graf ili 3-D plohe u
boji, omogućavajući različite pristupe rješavanju problema.
„ Što može Derive:
‰ aproksimacije funkcija na 1000 znamenaka
‰ numeričko ili algebarsko rješavanje jednadžbi
‰ integriranje i deriviranje izraza simboličkiy
‰ crtanje grafova u 2 i 3 dimenzije
‰ kreiranje interaktivnih matematičkih bilježnica (worksheets)
Primjer: Treba odrediti najveću moguću duljinu ljestava s kojima
možete proći krećući se širim hodnikom (vidi sliku) i ako
namjeravate skrenuti u desno. Zanemariti debljinu ljestava i
mogućnost nakošenja prema gore ili dolje.
L1=
L2
w2=7 m
c
L2=
L1
α=123o
w1
sin(b)
w2
sin(c)
b=π-α-c
b
L = L1 + L2 =
w1
sin(π - α - c)
+
w2
sin(c)
w1=9 m
7
Postupak rješavanja (1)
„
Rješenje treba obaviti u 4 koraka:
Postaviti problem jasno i što je više moguće pojednostavljeno
2.
Razviti matematički model na način da ga je moguće numerički
riješiti
3.
Numerički riješiti problem pod 2.
4.
Interpretirati dobiveno rješenje
S obzirom da je u konkretnom slučaju 1. korak već načinjen,
prelazi se na korak 2.
Očito je kritično mjesto zaokreta kada ljestve dodiruju zidove. Da
bi se dobila najveća duljina ljestava mora se naći minimum
gornjeg izraza za L, to jest treba prvu derivaciju dl/dc izjednačiti
s nulom.
1.
„
„
Postupak rješavanja (2)
dL/dc = -
„
„
„
w1 cos(α+c)
sin2(α + c)
-
w2 cos (c)
=0
sin2(c)
Prije svega, sada treba utvrditi postoji
li uopće nultočka (rješenje) i gdje se
približno nalazi
Koristeći graf funkcije f(c) koji se
može dobiti na pr. programom
Mathematica vidi se gdje treba tražiti
nultočku.
Metoda ima mnogo, no za početak,
neka to bude metoda bisekcije
(raspolavljanja) jer je najjasnija za
razmatranje.
f(c)
8
Postupak rješavanja (3)-primjena bisekcije
f(x2)
Traži se korijen
jednadžbe f(x) = 0
u intervalu (x1, x2) gdje je
f(x1) · f(x2) < 0 .
f(x)
f(x3)
x1
x4 f(x5)
x5
f(x1)
_
x3=x
x
x2
f(x4)
Interval se dijeli na pola
x = (x1 + x2) / 2
Ako je | x2 - x1 | ≤ ε tada je x aproksimacija traženog korijena.
Ako to nije istina tada su moguća dva slučaja:
f(x1) · f( x ) ≤ 0 i tada je novi interval ( x1, x )
ili je
f(x1) · f( x ) > 0 i tada je novi interval ( x , x2 )
Algoritam za rješavanje bisekcijom
„
„
Postupak rješavanja je iterativan što je vrlo čest
slučaj.
Algoritam (postupak) bisekcije glasi:
definiraj f(x) = ....
učitaj ( x1, x2, eps )
ponavljaj
x3 := (x1 + x2) / 2.
ako je (f(x3) * f(x1) < 0 ) tada
x2 = x3
inače
x1 = x3
dok ne bude (|x1-x2|< eps ∨ f(x3)= 0 )
ispiši ("Korijen = " , x3 )
9
Poboljšanje algoritma (1)
„
Kvalitetnije rješenje uzima u obzir i mogućnost da se
tražena točnost ne postigne u razumnom broju
iteracija ili se uopće ne može postići (beskonačna
programska petlja).
{definicija funkcije}
a = 123 * 3.14159 / 180.
f(c)=(9*cos(a+c)/sin2(a+c) + 7*cos(c)/sin2(c)
{ brojac iteracija, maksimalni broj iteracija }
iter = 0
maxiter = 20
{dopušteno odstupanje}
eps = 10-10
{ učitavanje lijeve i desne granice intervala}
učitaj ( x1, x2 )
Poboljšanje algoritma (2)
ispiši glavu tablice
dok je (|x1-x2|> eps ∧ iter ≤ maxiter)
xs := (x1 + x2) / 2.
ako je (f(x1) * f(xs) < 0 ) tada
x2 = xs
inače
x1 = xs
ispiši (iter, x1, x2, xs, f(xs))
ispiši ("Korijen = " , xs )
10
Rješenje u C-u (1)
#include <stdio.h>
#include <math.h>
/* Definicija funkcije */
double f(double c) {
double a = 123 * 3.14159 / 180.;
return (9*cos(a+c)/(sin(a+c)*sin(a+c))
+ 7*cos(c)/(sin(c)*sin(c)));
}
int main(){
/* brojac iteracija, maksimalni broj iteracija */
int iter=0, maxiter=20;
/* eps je dopusteno odstupanje */
double x1, x2, xs, eps=1.e-10;
/* ucitavanje lijeve i desne granice intervala */
scanf("%lf %lf", &x1, &x2);
Rješenje u C-u (2)
printf("Br.it.
x1
x2"
"
xs
f(xs)\n");
while ( fabs(x2-x1) > eps && iter<=maxiter ){
xs = (x1 + x2) /2.;
if ( f(x1) * f(xs) < 0 ){
x2 = xs;
} else {
x1 = xs;
}
printf("%3d
%.12lf %.12lf %.12lf %.12lf\n",
iter, x1, x2, xs,f(xs));
iter++;
}
printf("Korijen = %.14lf \n" , xs );
return 0;
}
11
Rezultat izvršenja programa
Br.it.
x1
x2
0
0.450000000000 0.500000000000
1
0.450000000000 0.475000000000
2
0.462500000000 0.475000000000
3
0.462500000000 0.468750000000
4
0.465625000000 0.468750000000
5
0.467187500000 0.468750000000
6
0.467187500000 0.467968750000
7
0.467578125000 0.467968750000
8
0.467578125000 0.467773437500
9
0.467675781250 0.467773437500
10
0.467675781250 0.467724609375
11
0.467700195312 0.467724609375
12
0.467712402344 0.467724609375
13
0.467718505859 0.467724609375
14
0.467721557617 0.467724609375
15
0.467723083496 0.467724609375
16
0.467723083496 0.467723846436
17
0.467723464966 0.467723846436
18
0.467723655701 0.467723846436
19
0.467723751068 0.467723846436
20
0.467723798752 0.467723846436
Korijen = 0.46772379875183
xs
0.450000000000
0.475000000000
0.462500000000
0.468750000000
0.465625000000
0.467187500000
0.467968750000
0.467578125000
0.467773437500
0.467675781250
0.467724609375
0.467700195312
0.467712402344
0.467718505859
0.467721557617
0.467723083496
0.467723846436
0.467723464966
0.467723655701
0.467723751068
0.467723798752
f(xs)
4.661517312958
-1.893341775489
1.364839357942
-0.267482537236
0.547675088398
0.139869992159
-0.063859785443
0.037991343330
-0.012937613312
0.012526010978
-0.000206013929
0.006159945241
0.002976952347
0.001385465883
0.000589725146
0.000191855401
-0.000007079316
0.000092388030
0.000042654354
0.000017787518
0.000005354101
Bisekcija pisana u programskom jeziku
Mathematica
(* Bisection Method
*)
bisect[a_,b_,TOL_,NN_]:=Module[{},
Print["f[x]=",f[x]," a=",a," b=",b," TOL=",TOL," N=",NN];
i=0;aa=a;bb=b;
If[f[aa]*f[bb]>0,
Return[Print["f[a] and f[b] have same sign"]]
,
Print[{"i","p","f[p]"}];
While[i<NN+1,
p=(aa+bb)/2;
If[f[p]==0 || (bb-aa)/2<TOL,
Print["Root approx: ",N[p]," after ",i+1, " iterations; f[p]= ",N[f[p]]];
Break[]
,
If[f[aa]*f[p]>0,
i=i+1;aa=p;
Print[{i,N[p],N[f[p]]}]
,
i=i+1;bb=p;
Print[{i,N[p],N[f[p]]}];
If[i>NN-1,
Return[Print["Method failed after ",NN, " iterations"]]
,
0
]
]
]
]
]
]
12
Poziv funkcije bisect u Mathematici
bisect[1,4,.01,10]
{i,p,f[p]}
{1,2.5,2.25}
{2,1.75,-0.9375}
{3,2.125,0.515625}
{4,1.9375,-0.246094}
{5,2.03125,0.125977}
{6,1.98438,-0.0622559}
{7,2.00781,0.031311}
{8,1.99609,-0.0156097}
Root approx: 2.00195 after
9
iterations; f[p]=
0.00781631
13