16 kwiecień 2009 SciLab w obliczeniach numerycznych - część 4 Slajd 1 Całkowanie numeryczne
16 kwiecień 2009 SciLab w obliczeniach numerycznych - część 4 Slajd 2 Plan zajęć 1. Całkowanie przybliżone funkcji jednej zmiennej z użyciem wbudowanych funkcji Scilaba integrate(), inttrap(), intsplin() 2. Całkowanie funkcji 2 zmiennych wykorzystanie wbudowanej funkcji int2d() użycie metody Monte Carlo
16 kwiecień 2009 SciLab w obliczeniach numerycznych - część 4 Slajd 3 Ćwiczenie 1 Utwórz skrypt (zapisując go jako ~/calki.sce) zawierający instrukcje wykonujące następujące czynności: zdefiniowanie funkcji użytkownika f ( x) = 1 x narysowanie wykresu funkcji na przedziale [-1,1] przy użyciu funkcji Scilaba integrate() obliczenie wartość całki 2 1 0 f ( x) dx ( = π ) 4
16 kwiecień 2009 SciLab w obliczeniach numerycznych - część 4 Slajd 4 Ćwiczenie 1 Utwórz skrypt (zapisując go jako ~/calki.sce) zawierający instrukcje wykonujące następujące czynności: zdefiniowanie funkcji użytkownika f ( x) = 1 x narysowanie wykresu funkcji na przedziale [-1,1] przy użyciu funkcji Scilaba integrate() obliczenie wartość całki 2 1 0 f ( x) dx ( = π ) 4 1.0 0.9 // zdefiniowanie funkcji f(x), narysowanie wykresu deff('[y]=f(x)','y=sqrt(1-x^2)') xp = -1:0.05:1 plot2d (xp, f(xp), [2]) // obliczenie całki w = integrate('f(x)','x',0,1) w = 0.7853982 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0.0-1.0-0.8-0.6-0.4-0.2 0.0 0.2 0.4 0.6 0.8 1.0
16 kwiecień 2009 SciLab w obliczeniach numerycznych - część 4 Slajd 5 Ćwiczenie 1 - cd obliczenie wartości całki przy użyciu funkcji inttrap(), intsplin(): otrzymując wyniki przybliżonych wartości całki dla każdej z funkcji dokonując podziału przedziału całkowania na 2 k części (k=1,2,...,10). Wyniki zapisz w dwóch wektorach wt[1:10], ws[1:10] otrzymane wyniki przedstaw na wykresie w zależności od zmiennej k=1,2,...,10.
16 kwiecień 2009 SciLab w obliczeniach numerycznych - część 4 Slajd 6 Ćwiczenie 1 - cd obliczenie wartości całki przy użyciu funkcji inttrap(), intsplin(): otrzymując wyniki przybliżonych wartości całki dla każdej z funkcji dokonując podziału przedziału całkowania na 2 k części (k=1,2,...,10). Wyniki zapisz w dwóch wektorach wt[1:10], ws[1:10] otrzymane wyniki przedstaw na wykresie w zależności od zmiennej k=1,2,...,10. // obliczenie całki przy użyciu funkcji inttrap(), intsplin() for k=1:10 x=linspace(0,1,2^k+1) wt(k)=inttrap(x,f(x)) ws(k)=intsplin(x,f(x)) end // narysowanie wykresu k=1:10, plot2d(k, [wt(k) ws(k)]) 0.80 0.75 0.70 0.65 0.60 0.55 0.50 1 2 3 4 5 6 7 8 9 10
16 kwiecień 2009 SciLab w obliczeniach numerycznych - część 4 Slajd 7 Ćwiczenie 1 - cd otrzymane wyniki zapisz do sformatowanego pliku tekstowego ~/w-calki.txt zapisując w 3 kolumnach (podając wartości całek z dokładnością do 6 miejsc po przecinku): k, wynik otrzymany za pomocą inttrap(), wynik otrzymany za pomocą intsplin().
16 kwiecień 2009 SciLab w obliczeniach numerycznych - część 4 Slajd 8 Ćwiczenie 1 - cd otrzymane wyniki zapisz do sformatowanego pliku tekstowego ~/w-calki.txt zapisując w 3 kolumnach (podając wartości całek z dokładnością do 6 miejsc po przecinku): k, wynik otrzymany za pomocą inttrap(), wynik otrzymany za pomocą intsplin(). // zapisanie wyników do pliku tekstowego u1 = file('open','~/w-calki.txt','new') for k=1:10 write(u1,[k, wt(k), ws(k)],'(f3.0,2x,f9.6,2x,f9.6)') end file('close',u1);
16 kwiecień 2009 SciLab w obliczeniach numerycznych - część 4 Slajd 9 Ćwiczenie 2 W otwartym skrypcie dopisz instrukcje służące do obliczenia, korzystając z funkcji int2d() wartości przybliżone całek dla : gdzie S zds S fds H fdh z(x,y)=1, S=[0,2]x[0,4] (wartość dokładna = 8) f(x,y)=xy 2, S=[0,2]x[0,4] (wartość dokładna = 42,666) f(x,y)=xy 2, H= jest obszarem pomiędzy prostą y=2x a parabolą y=x 2 (wartość dokładna = 32/5) funkcja I = int2d(x,y,f) oblicza całkę po obszarze podzielonym na trójkąty X macierz prostokątna wymiaru 3 x - każda kolumna przedstawia współrzędne X-owe jednego trójkąta Y macierz prostokątna wymiaru 3 x - każda kolumna przedstawia współrzędne Y-owe jednego trójkąta f zdefiniowana funkcja podcałkowa
16 kwiecień 2009 SciLab w obliczeniach numerycznych - część 4 Slajd 10 Dla z(x,y)=1, S=[0,2]x[0,4] - dokonując podziału obszaru całkowania na 2 trójkąty
16 kwiecień 2009 SciLab w obliczeniach numerycznych - część 4 Slajd 11 Dla z(x,y)=1, S=[0,2]x[0,4] - dokonując podziału obszaru całkowania na 2 trójkąty // podział obszaru całkowania [0,2]x[0,4] na 2 trójkąty X=[0,0;2,0;2,2]; Y=[0,0;0,4;4,4]; // zdefiniowanie funkcji podcałkowej deff('zp=z(x,y)','zp=1') // obliczenie całki I=int2d(X,Y,z) disp(i) > 8.
16 kwiecień 2009 SciLab w obliczeniach numerycznych - część 4 Slajd 12 Dla f(x,y)=xy 2, S=[0,2]x[0,4], wykorzystując już utworzony podział
16 kwiecień 2009 SciLab w obliczeniach numerycznych - część 4 Slajd 13 Dla f(x,y)=xy 2, S=[0,2]x[0,4], wykorzystując już utworzony podział // zdefiniowanie funkcji podcałkowej deff('z=f(x,y)','z=x*y^2') I=int2d(X,Y,f) disp(i) > 42.666667 // obliczenie całki
16 kwiecień 2009 SciLab w obliczeniach numerycznych - część 4 Slajd 14 Dla f(x,y)=xy 2, dla obszaru całkowania pomiędzy prostą y=2x a parabolą y=x 2 wpisując obszar w prostokąt [0,2]x[0,4], definiując nową funkcję podcałkową i wykorzystując już utworzony podział
16 kwiecień 2009 SciLab w obliczeniach numerycznych - część 4 Slajd 15 Dla f(x,y)=xy 2, dla obszaru całkowania pomiędzy prostą y=2x a parabolą y=x 2 wpisując obszar w prostokąt [0,2]x[0,4], definiując nową funkcję podcałkową i wykorzystując już utworzony podział // zdefiniowanie funkcji podcałkowej function [z]=fn(x,y) z=0 if (y<=2*x)&(y>=x^2) then z=f(x,y) end endfunction I=int2d(X,Y,fn) // obliczenie całki disp(i) > 4.8634489 (wartość dokładna 32/5 = 6.4)
16 kwiecień 2009 SciLab w obliczeniach numerycznych - część 4 Slajd 16 Dla obszaru całkowania pomiędzy prostą y=2x a parabolą y=x 2 wpisując obszar w prostokąt [0,2]x[0,4], dzieląc prostokąt na trójkąty prostokątne o przyprostokątnych = 1
16 kwiecień 2009 SciLab w obliczeniach numerycznych - część 4 Slajd 17 Dla obszaru całkowania pomiędzy prostą y=2x a parabolą y=x 2 wpisując obszar w prostokąt [0,2]x[0,4], dzieląc prostokąt na trójkąty prostokątne o przyprostokątnych = 1 // podział obszaru [0,2]x[0,4] na trójkąty prostokątne o boku =1 for i=1:2 for j=1:4 k=2*i-1+4*(j-1) X(1,k)=i-1, X(2,k)=i, X(3,k)=i Y(1,k)=j-1, Y(2,k)=j-1, Y(3,k)=j k=2*i + 4*(j-1) X(1,k)=i-1, X(2,k)=i-1, X(3,k)=i Y(1,k)=j-1, Y(2,k)=j, Y(3,k)=j end end I=int2d(X,Y,fn), disp(i) > 6.5729887 (wartość dokładna 32/5 = 6.4)
16 kwiecień 2009 SciLab w obliczeniach numerycznych - część 4 Slajd 18 Oszacować przy użyciu Metody Monte Carlo, korzystając z generatora liczb losowych wartość całki zds dla funkcji : S z(x,y)=xy 2, S jest obszarem pomiędzy prostą y=2x a parabolą y=x 2 (wartość dokładna = 32/5) znajdując 0 =10000 punktów losowych w obszarze S 0 = obszar prostokątny [0,2] x [0,4]
16 kwiecień 2009 SciLab w obliczeniach numerycznych - część 4 Slajd 19 Oszacować przy użyciu Metody Monte Carlo, korzystając z generatora liczb losowych wartość całki zds dla funkcji : S z(x,y)=xy 2, S jest obszarem pomiędzy prostą y=2x a parabolą y=x 2 (wartość dokładna = 32/5) znajdując 0 =10000 punktów losowych w obszarze S 0 = obszar prostokątny [0,2] x [0,4] // wygenerowanie punktów losowych z obszaru [0,2] x [0,4] _0=1000 xy =rand(2,_0) xlos = 2*xy(1,:), ylos=4*xy(2,:)
16 kwiecień 2009 SciLab w obliczeniach numerycznych - część 4 Slajd 20 Obliczając - liczbę punktów losowych leżących w obszarze S i korzystając z formuły przybliżyć wartość całki (suma we wzorze obliczana jest tylko dla punktów leżących w obszarze całkowania S) = = = = i i i i i i i i i S y x z S y x z S y x z S zds 1 0 0 1 0 0 1 ), ( ), ( 1 ), ( 1
16 kwiecień 2009 SciLab w obliczeniach numerycznych - część 4 Slajd 21 Obliczając - liczbę punktów losowych leżących w obszarze S i korzystając z formuły przybliżyć wartość całki (suma we wzorze obliczana jest tylko dla punktów leżących w obszarze całkowania S) 0 zds S z( xi, yi ) S0 z( xi, yi ) = S i= 1 0 i= 1 0 i = 1 =0, sumka = 0, S0 = 8 for i=1:_0 x= xlos(i), y= ylos(i) 1 // sprawdzenie czy losowy punkt należy do obszaru S if (y<=2*x)&(y>=x^2) then sumka = sumka + f(x,y) = +1 end end calka = S0 * sumka/_0 disp(calka), disp(), > 6.2687125 (wartość całki - dokładna 6.4) > 172 1 S z( x i, y i )
16 kwiecień 2009 SciLab w obliczeniach numerycznych - część 4 Slajd 22 Funkcje SciLaba Funkcje przybliżonego całkowania: int2d() obliczenie całki z funkcji 2 zmiennych po obszarze opisanym siatką trójkątów int3d() obliczenie całki z funkcji 3 zmiennych, obszar całkowania opisany siatką czworościanów integrate(), intg() obliczenie całki z funkcji jednej zmiennej metodą kwadratur intsplin() obliczenie całki z funkcji sklejanej (jednej zmiennej) interpolującej zbiór punktów inttrap() obliczenie całki z funkcji (jednej zmiennej) interpolującej zbiór punktów wzór trapezów