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
© Copyright 2024 Paperzz