Informatyka Wykład 5 2017/2018z Bogumil.Konopka@pwr.edu.pl
Plan Problemy algebry liniowej (rozwiązywanie układów równań) Uchwyty do funkcji, funkcje anonimowe Analiza funkcji matematycznych: Interpolacja, aproksymacja, ekstrapolacja Całkowanie Różniczkowanie MATLABa w obliczeniach statystycznych (Tutorial do tworzenia GUI)
Układ równań w algebrze Układ równań liniowych: Zapis macierzowy: Równoważne iloczynowi http://pl.wikipedia.org/wiki/uk%c5%82ad_r%c3%b3wna%c5%84_liniowych Slajd W. Dyrka, Informatyka 2011/2012 wykład 6
Rozwiązywanie układów równań x 1 + 3x 2 + 2x 3 = 0 x 1 x 3 = 1 2x 1 3x 2 x 3 = 3 A x = b Rozwiązanie: A 1 3 2 1 0 1 2 3 1 x x 1 x 2 x 3 = b 0 1 3 A 1 A x = A 1 b x = A 1 b x = A\b Przykład: B Mrozek, Z Mrozek, 2010, Roz. 2.2.9
Rozwiązywanie układów równań (2) Układ równań jest oznaczony tzn. liczba liniowo niezależnych równań = liczbie zmiennych x 1 + 3x 2 + 2x 3 = 0 x 1 x 3 = 1 2x 1 3x 2 x 3 = 3 x = A 1 b x = A\b A=[-1 3 2;1 0-1; 2-3 -1] %utworzenie macierzy wspolczynnikow uwarunkowanie=cond(a) %sprawdzenie właściwości numerycznych b=[0 1 3]' % lub b=[0;1;3] x=a\b % metoda szybsza i dokladniejsza x2=inv(a)*b % metoda wolniejsza i mniej dokladna x = 2 0 1 x2 = 2 0 1 1 3 2 1 0 1 2 3 1 x 1 x 2 x 3 = 0 1 3 Przykład: B Mrozek, Z Mrozek, 2010, Roz. 2.2.9
Rozwiązywanie układów równań liniowych (3) Obliczenie współczynników funkcji liniowej przechodzącej przez dwa punkty (x 1 =- 1, y 1 = 1); (x 2 =1, y 2 = 3) y = a 1 x + a 2 a 1 = a 1 1 + a 2 3 = a 1 1 + a 2 y X 1 3 = 1 1 1 1 a 1 a 2 y=[1;3] X=[-1 1;1 1]; a=x\y
Rozwiązywanie układów równań liniowych (2) Obliczenie współczynników funkcji liniowej przechodzącej przez dwa punkty (x 1 =- 1, y 1 = 1); (x 2 =1, y 2 = 3) y = a 1 x + a 2 a 1 = a 1 1 + a 2 3 = a 1 1 + a 2 y X 1 3 = 1 1 1 1 a 1 a 2 y=[1;3] X=[-1 1;1 1]; a=x\y osx=-1.5:0.001:1.5; y1=osx.*a(1)+a(2); plot(x(:,1),y,'mo', 'LineWidth',2 %CIACH...
Rozwiązywanie układów równań układ niedookreślony Liczba równań niezależnych liniowo jest MNIEJSZA niż liczba zmiennych Obliczyć równanie hiperboli przechodzącej przez punkty (x 1 =- 1, y 1 = 1); (x 2 =1, y 2 = 3) y = a 1 x 2 + a 2 x + a 3 1 y=[1;3] xp=[-1;1] X=[xp.^2 xp; ones(2,1)]; a_d=x\y a_pinv=pinv(x)*y y X a 1 3 = 1 1 1 a 1 1 1 1 a 2 a 3
Rozwiązywanie układów równań układ niedookreślony Liczba równań niezależnych liniowo jest MNIEJSZA niż liczba zmiennych Obliczyć równanie hiperboli przechodzącej przez punkty (x 1 =- 1, y 1 = 1); (x 2 =1, y 2 = 3) y = a 1 x 2 + a 2 x + a 3 1 y=[1;3] xp=[-1;1] X=[xp.^2 xp; ones(2,1)]; a_d=x\y a_pinv=pinv(x)*y y X a 1 3 = 1 1 1 a 1 1 1 1 a 2 a 3 a_d = 2.0000 1.0000 0 a_pinv = 1.0000 1.0000 1.0000
Rozwiązywanie układów równań układ nadokreślony Liczba równań niezależnych liniowo jest WIĘKSZA niż liczba zmiennych Obliczyć równanie hiperboli przechodzącej przez N punktów (x_data,y_data) y = a 1 x 2 + a 2 x + a 3 y 1 y M = 2 x 1 x 1 1 2 x M x M 1 a 1 a 2 a 3
Rozwiązywanie układów równań układ nadokreślony Liczba równań niezależnych liniowo jest WIĘKSZA niż liczba zmiennych Obliczyć równanie hiperboli przechodzącej przez N punktów (x_data,y_data) y = a 1 x 2 + a 2 x + a 3 y 1 y M = 2 x 1 x 1 1 2 x M x M 1 a 1 a 2 a 3 X=[x_data.^2 x_data; ones(n,1)]; a_d=x\y_data(:); a_pinv=pinv(x)*y_data(:); osx=-1.5:0.001:1.5; y2=a_d(1)*osx.^2+a_d(2)*osx+a_d(3); y2_pinv=a_pinv(1)*osx.^2+a_pinv(2)*osx+a_pinv(3);
Operator dzielenia lewostronnego \ Operator \ pozwala rozwiązać układ równań w postaci A x = b x = A\b Algorytm rozwiązania wybierany jest automatycznie: Alg. permutowanego podstawiania wstecz (A macierz trójkątna lub przestawiona) Algorytm eliminacji Gaussa (A - macierz kwadratowa, niesymetryczna i nie trójkątna) Rozkład QR i rozwiązanie w sensie minimum błędu średniokwadratowego A x b (A - macierz prostokątna)
Interpolacja aproksymacja - ekstrapolacja
Interpolacja aproksymacja - ekstrapolacja
Interpolacja aproksymacja - ekstrapolacja
Interpolacja aproksymacja - ekstrapolacja
Interpolacja w MATLABIE Interpolacja za pomocą funkcji interp1 %Przykladowe dane x=-10:0.1:10; y=1./(1+exp(-0.8.*x)); y_exp=y+randn(1,201)*0.1; Ind=1:25:201; x_dane=x(ind); y_dane=y_exp(ind) %Interpolacja y_interp1= interp1(x_dane,y_dane,x,'linear'); y_interp1_nn= interp1(x_dane,y_dane,x,'nearest'); y_interp1_cubic= interp1(x_dane,y_dane,x,'cubic'); y_interp1_spline= interp1(x_dane,y_dane,x,'spline');
Interpolacja w MATLABIE Interpolacja za pomocą funkcji interp1 %Przykladowe dane x=-10:0.1:10; y=1./(1+exp(-0.8.*x)); y_exp=y+randn(1,201)*0.1; Ind=1:25:201; x_dane=x(ind); y_dane=y_exp(ind) %Interpolacja y_interp1= interp1(x_dane,y_dane,x,'linear'); y_interp1_nn= interp1(x_dane,y_dane,x,'nearest'); y_interp1_cubic= interp1(x_dane,y_dane,x,'cubic'); y_interp1_spline= interp1(x_dane,y_dane,x,'spline');
Interpolacja sygnałów okresowych Interpolacja za pomocą funkcji interpft %Spróbkowany sygnał y = [0.5 1 1.5 2 1.5 1.5 0 -.5-1 -1.5-2 -1.5-1 -.5 0]; N = length(y); %Interpolacja L = 5; %Czynnik zwiekszenie probkowania M = N*L;%Tyle punktów pomiarowych chcemy uzyskać x = 0:L:L*N-1; xi = 0:M-1; yi = interpft(y,m); plot(x,y,'o',xi,yi,'*') legend('original data','interpolated data') http://www.mathworks.com/help/matlab/ref/interpft.html
Inne funkcje interpolujące interp2, interp3, interpn Interpolacja dwu-, trój- i N- wymiarowa griddata, griddatan Interpolacja trój- N-wymiarowa na siatce Scatteredinterpolant Interpolacja trójwymiarowa na siatce spline, pchip Wylicza to samo co: interp( spline ), interp(, cubic ) ppval Wylicza wartości funkcji sklejanej
Ekstrapolacja Większość funkcji interpolujących może służyć do ekstrapolacji x_extrap=10:20; %x z poza zakresu x_dane %Interpolacja y_interp1_cubic= interp1(x_dane,y_dane,x, 'cubic'); y_interp1_spline= interp1(x_dane,y_dane,x,'spline'); %Ekstrapolacja y_extrap_cubic= interp1(x_dane,y_dane, x_extrap,'cubic'); y_extrap_spline= interp1(x_dane,y_dane, x_extrap,'spline'); Trzeba uważać!
Aproksymacja Funkcja aproksymująca nie musi przechodzić przez punkty dane Funkcja aproksymująca minimalizuje błąd
Aproksymacja wielomianem (polyfit, polyval) Większość funkcji można dopasować wielomianem Konieczne jest dobranie odpowiednio dużego stopnia %APROKSYMACJA [p,s]=polyfit(x,y_exp,7); [y_fit,delta]=polyval(p,x,s); figure plot(x,y_exp,'o',x,y_fit,':r') xlabel('os X') ylabel('os Y') axis([-10.2,10.2,-0.2,1.2]) >> p p = -0.0000-0.0000 0.0000 0.0000-0.0028-0.0005 0.1541 0.4851 y x = 0. 0028x 3 0. 005x 2 +0. 1541x + 0. 4851
Aproksymacja wielomianem (polyfit, polyval) Polyfit zwraca: p - wektor współczynników wielomianu S struktura współczynników koniecznych do estymacji błędu Polyval zwraca: y_fit wartości wielomianu dla x Delta estymator odchylenia standardowego błędu (y p(x)) y±delta zawiera przynajmniej 50% wszystkich próbek [p,s]=polyfit(x,y_exp,7); [y_fit,delta]=polyval(p,x,s);
Ocena skuteczności dopasowania Estymacja błędu - delta hold on plot(x,y_exp,'o',x,y_fit,':r') errorbar(x(1:20:201),y_fit(1:20:201),... delta(1:20:201),'linestyle','none',..., 'Color','Red') Błąd średniokwadratowy RMSE (Root Mean Squared Error) RMSE = 1 N 1 i=1 N y i p(x i ) 2
Aproksymacja funkcją fit opts = fitoptions('method','nonlinear','normalize','off') ftype = fittype('1/(1+exp(-b*x))','options',opts) [g, gof, out ] = fit(x',y_exp',ftype) Fitoptions - definiuje opcje algorytmu wykorzystanego przy dopasowywaniu np.: Algorytm Punkt początkowy algorytmu itp.. Fittype definiuje model użyty w dopasowaniu Może być z biblioteki domyślnych modeli (np. poly1, poly2, poly3 ) Może być model ustalony przez użytkownika (np. '1/(1+exp(-b*x))')
Aproksymacja funkcją fit ocena skuteczności [g, gof, out ] = fit(x',y_exp',ftype) >> g g = General model: g(x) = 1/(1+exp(-b*x)) Coefficients (with 95% confidence bounds): b = 0.7388 (0.6541, 0.8235) >> gof gof = sse: 1.9659 rsquare: 0.9503 dfe: 200 adjrsquare: 0.9503 rmse: 0.0991 WAŻNE! >> out out = numobs: 201 numparam: 1 residuals: [201x1 double] Jacobian: [201x1 double] exitflag: 3 firstorderopt: 1.1601e-04 iterations: 4 funccount: 10 cgiterations: 0 algorithm: 'trust-region-reflective' message: 'Success, but fitting stopped because change in residuals less than tolerance (TolFun).
Aproksymacja funkcją fit - wynik opts = fitoptions('method','nonlinear',... 'Normalize','Off') ftype = fittype('1/(1+exp(-b*x))',... 'options',opts) [g,gof,out] = fit(x',y_exp',ftype) %Wyliczenie punktow g_fit=1./(1+exp(-g.b*x)); [g1,gof1,out1]=fit(x',y_exp','poly3') %Wyliczenie punktow g_fit_poly3=g1.p1*x.^3... +g1.p2*x.^2+g1.p3*x+g1.p4; figure hold on plot(x,y_exp,'bo') plot(x,g_fit,'-r','linewidth',3) plot(x,g_poly3,':r','linewidth',3) legend('points','1/(1+exp(-b*x))','poly3')
Uchwyty do funkcji operator @ Pozwala odnosić się do funkcji, bez korzystania z nazwy uchwyt_wyk=@plot % utworzenie uchwytu do funkcji plot uchwyt_wyk(x,y) % wykres liniowy uchwyt_wyk=@bar % utworzenie uchwytu do funkcji bar uchwyt_wyk(x,y) % wykres slupkowy Ta sama instrukcja, różne efekty
Uchwyty do funkcji prosty przykład Chcemy napisać program, który będzie wizualizował dane Mamy kilka funkcji do wizualizacji W zależności od potrzeb użytkownika do wizualizacji będą wykorzystywane różne funkcje function rysuj_wykres(x,y,uchwyt_do_rysowania) uchwyt_do_rysowania(x,y) Program przyjmuje uchwyt do funkcji rysującej jako argument wejściowy >> uchwyt_wyk=@plot; >> rysuj_wykres(x,y,uchwyt_wyk) >> uchwyt_wyk=@bar; >> rysuj_wykres(x,y,uchwyt_wyk) >> rysuj_wykres(x,y,@plot) >> rysuj_wykres(x,y,@bar)
Uchwyty do funkcji kiedy przydatne? Nasz program chce coś osiągnąć. Jest kilka sposobów na osiągnięcie celu. Posługujemy się uchwytem żeby dać możliwość łatwej modyfikacji sposobu osiągnięcia celu uchwyt umożliwia przekazywanie funkcji jako argumentu wejściowego. Przykład: Program na jakimś etapie korzysta z N liczb losowych. Mamy do dyspozycji kilka funkcji generujących liczby losowe. Program może korzystać z uchwytu do funkcji generującej liczby losowe użytkownik może łatwo zmieniać rozkład generowanych liczb.
Funkcje anonimowe Funkcje, które nie mają nazwy. Korzystamy z nich tylko przez uchwyty. Skladnia: Uchwyt = @ (lista_arg) wyrazenie
Funkcje anonimowe - przykład a=-2 %[m/s2] V0=10 %[m/s] Uchwyt = @ (lista_arg) wyrażenie %Utworzenie funkcji anonimowej z jednym argumentem wejsciowym uchwyt=@(t)v0*t+(a*t.^2)/2 clear a, V0 t=0:10; S=uchwyt(t)%skorzystanie z funkcji anonimowej plot(t,s) plot(t,uchwyt(t))
Całkowanie numeryczne metoda trapezów % predkosci vel = [0.45 1.79 4.02 7.15 11.18... 16.09 21.90 29.05 29.05 29.05 29.05... 29.05 22.42 17.9 17.9 17.9 17.9... 14.34 11.01 8.9 6.54 2.03 0.55 0]; time = 0:24; %czas distance = trapz(time,vel) Znaczny błąd jeżeli: f(x) nie jest liniowa, a X i+1 X i są duże http://www.mathworks.com/help/matlab/ref/trapz.html
Całkowanie numeryczne metody adaptacyjne (integral, quad, quadl, quadgk) Składnia: calka = integral (fun, xmin, xmax) calka = integral (fun, xmin, xmax, Name, Value) fun uchwyt do całkowanej funkcji Funkcja musi jako argument przyjmować wektor liczb i zwracać dla niego wektor wartości xmin dolna granica całkowania ymax górna granica całkowania AbsTol błąd bezwzględny, RelTol błąd względny, ArrayValued, Waypoints Algorytm globalnej kwadratury adaptacyjnej odcinki całkowania są najkrótsze w miejscach o największej zmienności f(x).
Całkowanie numeryczne metody adaptacyjne - przykład function y=rozkladnormalny(x) %Funkcja liczy gestosc prawdopodobienswa dla N(0,1) sigma=1; mu=0; y=1/(sigma*sqrt(2*pi))*exp(-(x-mu).^2/(2*sigma^2)); >> integral(@rozkladnormalny,-0.5,0.5) %skladnia integral(fun, xmin, xmax, Name, Value) ans = 0.3829
Całkowanie numeryczne metody adaptacyjne - przykład function y=rozkladnormalny(x) %Funkcja liczy gestosc prawdopodobienswa dla N(0,1) sigma=1; mu=0; y=1/(sigma*sqrt(2*pi))*exp(-(x-mu).^2/(2*sigma^2)); >> integral(@rozkladnormalny,-0.5,0.5) %skladnia integral(fun, xmin, xmax, Name, Value) ans = 0.3829 r_norm=@(x,mu,sigma) 1/(sigma*sqrt(2*pi))*exp(-(x-mu).^2/(2*sigma^2)) x=-4:0.01:4; plot(x,r_norm(x,0,1)) clear x integral(@(x)r_norm(x,0,1),-3,3) %calka na przedziale [-3, 3] ans = 0.9973
Różniczkowanie numeryczne Pochodna: f x 0 = dy dx = lim f x 0 + Δx f(x 0 ) Δx 0 Δx W obliczeniach numerycznych wyliczany jest iloraz różnicowy: dy dx = f x i+1 f(x i ) x i+1 x i W MATLABIE: dy_dx=diff(y)./diff(x)
Różniczkowanie numeryczne - przykład %Rozniczkowanie numeryczne s=@(a,t) 1/2*a.*t.^2; t=0:0.1:20 droga=s(0.5,t); dsdt=diff(droga)./diff(t); plot(t,droga,'-b',t(1:end-1),dsdt,'-r',... 'LineWidth',2) xlabel('t [s]') legend('droga', 'Predkosc')
Numeryczne obliczanie gradientu Gradient pole wektorowe wskazujące kierunki najszybszych wzrostów wartości danego pola skalarnego w poszczególnych punktach, przy czym moduł (długość) każdej wartości wektorowej jest równy szybkości wzrostu. (http://pl.wikipedia.org/wiki/gradient) X = gradient(f) [FX,FY] = gradient(f) % F tablica dwuwymiarowa [FX,FY,FZ,...] = gradient(f) % F tablica trójwymiarowa [...] = gradient(f,h) % h określa jakie sa odstępy między punktami [...] = gradient(f,h1,h2,... )
Numeryczne obliczanie gradientu przykład v = -2:0.2:2; [x,y] = meshgrid(v); z = x.* exp(-x.^2 - y.^2); %wyznaczenie funkcji [px,py] = gradient(z,.2,.2); figure surface(x,y,z) grid on figure contour(x,y,z) hold on quiver(v,v,px,py) %w punktach (v,v) rysuje wektory hold off
Numeryczne obliczanie gradientu przykład >> A=[1 3 24 5 78; 3 12 5 23 89; 8 1 3 12 6] A = 1 3 24 5 78 3 12 5 23 89 8 1 3 12 6 Rozpisać >> [px,py]=gradient(a) px = 2.0000 11.5000 1.0000 27.0000 73.0000 9.0000 1.0000 5.5000 42.0000 66.0000-7.0000-2.5000 5.5000 1.5000-6.0000 py = 2.0000 9.0000-19.0000 18.0000 11.0000 3.5000-1.0000-10.5000 3.5000-36.0000 5.0000-11.0000-2.0000-11.0000-83.0000 Przykład w oparciu o M Kotulska, Informatyka, Wykład 5, 2013/2014
Zastosowanie MATLABA w obliczeniach statystycznych - podstawy Poznanie danych wizualizacja i statystyki deskryptywne Testy na normalność rozkładu Przedziały ufności dla średniej Testy Studenta
Histogramy N=1000; X=2*randn(N,1)+2; Polecenie: hist(x) % Rysuje histogram z 10 przedzialami Hist(X,k) % Rysuje histogram z k przedziałami [nelem,xcenters]=hist(x) % Podaje licznosci % i srodki przedzialow, nic nie rysuje Liczba przedziałów k może zmieniać odbiór danych:* k= log 2 n+1 (Zasada Strug a ) k = max X min(x) h, h = 2 IQR(x) n 1/3 lub h = 3.5 s n 1/3 *Bethold,Borgelt,Höppner,Klawonn, Guide to Intelogent Data Anlysis, 2010
Statystyki deskryptywne data=[x,randn(n,1)]; srednia=mean(data) mediana=median(data) kwartyle=quantile(data,[0.25,0.5,0.75]) rozstep = range(data) rozstepiqr=iqr(data) odchstd_proba=std(data) odchstd_pop=std(data,1) srednia = 1.9504 0.0429 mediana = 2.0507 0.0286 kwartyle = 0.6313-0.6081 2.0507 0.0286 3.2402 0.7473 minimum = -4.2578-3.0327 maximium = 8.6612 2.7477 rozstep = 12.9190 5.7804 rozstepirq = 2.6089 1.3555 odchstd_proba = 2.0101 0.9890 odchstd_pop = 2.0091 0.9885
Wykres ramkowy - boxplot figure boxplot([x,randn(n,1)]) ylabel('wartosc X') xlabel('klasa') Co jest gdzie?
Standaryzacja rozkładu Z-score Standardyzacja: Zscore i = X i X s [X1_z,muX1,sigmaX1]=zscore(X); DoTransformacji=[muX1,sigmaX1] PrzedTransformacja=[mean(X), std(x)] PoTransformacji=[mean(X1_z), std(x1_z)] DoTransformacji = 1.9504 2.0101 PrzedTransformacja = 1.9504 2.0101 PoTransformacji = 0.0000 1.0000
Testy na normalność rozkładu W statystyce często wykonuje się założenie o normalności rozkładu Test Andersona-Darlinga [h,p,adstat,cv] = adtest(x) h = 0 p = 0.4560 adstat = 0.3583 cv = 0.7513 Test Kolmogorova-Smirnova >> [h,p,ksstat,cv] = kstest(x) h = 1 p = 1.2069e-250 ksstat = 0.5351 cv = 0.0428 >> [h,p]=kstest(x1_z) h = p = 0 0.6947 Test Jarque-Bera >> [h,p,jbstat,critval] = jbtest(x) Warning: P is greater than the largest tabulated value, returning 0.5. > In jbtest at 133 h = 0 p = 0.5000 jbstat = 0.1713 critval = 5.9282
Wykres kwantylowy - qqplot qqplot(x)
Przedział ufności dla μ, gdy σ nie znane Konstrukcja przedziału: μ ± tα 2 SE, Gdzie: SE = s n kwantyl z rozkładu Studenta, z n-1 stopniami swobody tα 2 >> CU=mean(X)+tinv([0.05/2, 1-0.05/2], 999).*std(X)/sqrt(N-1) CU = 1.8256 2.0752 >> [muhat,sigmahat,mu_ci,sigma_ci] = normfit(x) muhat = 1.9504 sigmahat = 2.0101 mu_ci = 1.8257 2.0752 sigma_ci = 1.9257 2.1023
Test t-studenta dla jednej próby h0: μ = 1 ha:μ 1 >> [h,p,ci,stats]=ttest(x,1) h = 1 p = 9.1082e-46 ci = 1.8257 2.0752 stats = tstat: 14.9521 df: 999 sd: 2.0101 h0:μ = 1 ha:μ < 1 %Czy średnia jest mniejsza? >> [h,p,ci,stats]=ttest(x,1,'tail','left') h = 0 p = 1 ci = -Inf 2.0551 stats = tstat: 14.9521 df: 999 sd: 2.0101
Test t-studenta dla dwóch niezależnych prób h0: μ 1 = μ 2 ha: μ 1 μ 2 >> [h,p,ci,stats]=ttest2(x,x2) h = 1 p = 1.6556e-136 ci = 1.7686 2.0464 stats = tstat: 26.9260 df: 1998 sd: 1.5841
Dzisiaj najważniejsze było: MATLAB rozwiązuje układy równań liniowych przy wykorzystaniu reprezentacji macierzowej Interpolacja, aproksymacja i ekstrapolacja to problemy związane z szacowaniem wartości funkcji. Interpolacja i aproksymacja różnią się pod względem podejścia. Ekstrapolacja może korzystać z metod zarówno interpolacji jak i aproksymacji. Uchwyty do funkcji pozwalają: przekazywać funkcje jako parametry do innych funkcji tworzyć funkcje anonimowe MATLAB ma zastosowania w różnych dziedzinach nauki i inżynierii