1 MOiPP Matlab Przykłady metod obliczeniowych Obliczenia symboliczneWykład 4 Matlab Przykłady metod obliczeniowych Obliczenia symboliczne
2 Sortowanie bąbelkowe Sortowanie bąbelkowe skróconePorównywanie kolejnych par elementów sąsiadujących i zamiana miejscami w przypadku niewłaściwej kolejności N N-1 porównań Wykonujemy N przebiegów Sortowanie bąbelkowe skrócone Przebiegów wykonujemy N-1 W każdym kolejnym przebiegu liczba analizowanych par jest zmniejszana o 1, a
3 1 PRZEBIEG 96 12 22 76 64 23 74 11 2 PRZEBIEG 12 22 76 64 23 74 11 96
4 M-plik - sortowanie "bąbelkowe"clc clear N=5; G=rand(1,N) %stadardowa funkcja sortująca G1=sort(G) %sortowanie bąbelkowe for k=1:N-1 for m=1:N-k if G(m)>G(m+1) pom=G(m); G(m)=G(m+1); G(m+1)=pom; end disp(G) %pokazuje kolejne wypływające "bąbelki" %ostatecznie po posortowaniu disp(G) zamiana miejscami gdy elementy w niewłaściwej kolejności
5 Obliczenia symboliczne w MatlabieNiezbędny jest tu dodatkowy (komercyjny) tzw. toolbox o nazwie Symbolic Tool
6 syms zmienna1 zmienna2 itdObliczenia symboliczne wymagają zadeklarowania zmiennych symbolicznych – abstrakcyjnych zmiennych, które nie posiadają wartości liczbowej Służy do tego polecenie syms: syms zmienna1 zmienna2 itd
7 Przykład: Symboliczne rozwiązywanie równań – funkcja solve() syms x af=a - x^2; z =solve (f, x) z = a^(1/2) -a^(1/2)
8 Symboliczne operacje macierzowesyms a b c d e f g h A=[a b; c d] B=[e f ; g h] il_m=A*B il_e=A.*B A = [ a, b] [ c, d] B = [ e, f] [ g, h] il_m = [ a*e+b*g, a*f+b*h] [ c*e+d*g, c*f+d*h] il_e = [ a*e, b*f] [ c*g, d*h] iloczyn macierzowy Cauchy'ego iloczyn elementowy Hadamarda (po współrzędnych) ilustracja iloczynów macierzy kwadratowych
9 Wstawienie danych do wyrażeń symbolicznych - funkcja subs( )Przykład: syms a b c x % definicja 4 zmiennych symbolicznych y = solve(a*x^2+b*x+c) % rozwiązanie równania względem x a=3; b=4; c=1; % Przypisanie wartości liczbowych a b c w = subs(y) % Obliczenie wartości liczbowej dla y Rezultat: y = -1/2*(b-(b^2-4*a*c)^(1/2))/a -1/2*(b+(b^2-4*a*c)^(1/2))/a w =
10 limit (F,[zmienna],[b])Obliczenia granic ciągów i funkcji - funkcja limit( ) Do obliczania granic na podstawie wyrażenia symbolicznego służy funkcja limit. Jej składnia może być następująca: limit (F,[zmienna],[b]) wyznaczenie granicy dla wyrażenia symbolicznego F, względem wskazanej zmiennej, granica dla zmiennejb,
11 Uwagi: zmienna jest opcjonalna, jeśli wyrażenie zawiera jedną zmienną.b opcjonalne, jego pominięcie oznacza granicę dla zmienna0. wyznaczenie granicy lewostronnej dla wyrażenia symbolicznego F, w punkcie b, limit(F, zmienna, b, 'left') wyznaczenie granicy prawostronnej dla wyrażenia symbolicznego F, w punkcie b. limit(F, zmienna, b, 'right')
12 Przykład Obliczenie granicy ciągu: syms n w= limit((1-3*n)/(1+n), inf)Rezultat: w = -3 Uwaga: inf jest symbolem ∞ (nieskończoność)
13 Przykład syms x a=limit(tan(x),x, pi/2,'left')Obliczenie granicy lewo i prawostronnej funkcji tg(x) w punkcie pi/2 syms x a=limit(tan(x),x, pi/2,'left') b=limit(tan(x),x, pi/2,'right') a= Inf b= -Inf
14 diff (F,[zmienna],[N]) Obliczanie pochodnych funkcji - funkcja diff( )Argumentami funkcji są: funkcja, względem której pochodna będzie liczona, zmienna, względem której pochodna jest liczona (opcjonalnie) rząd pochodnej (opcjonalnie) diff (F,[zmienna],[N])
15 syms x a=diff(x^2) Przykład: Obliczenie pochodnej funkcji f(x)=x2 a =Rezultat a = 2*x
16 Przykład: Obliczenie pochodnej funkcji f(x, y, z)według każdej zmiennej (pochodne cząstkowe):
17 f=(x*y*z)^x+(1/(x*y))^2 diff(f) diff(f,x) diff(f,y) diff(f,z)syms x y z f=(x*y*z)^x+(1/(x*y))^2 diff(f) diff(f,x) diff(f,y) diff(f,z) ans = (x*y*z)^x*(log(x*y*z)+1)-2/x^3/y^2 (x*y*z)^x*x/y-2/x^2/y^3 (x*y*z)^x*x/z
18 syms x diff(f,x,2) Przykład:Obliczenie pochodnej funkcji f (x, y, z ) syms x diff(f,x,2) ans = (x*y*z)^x*(log(x*y*z)+1)^2+(x*y*z)^x/x+6/x^4/y^2
19 int(F,[zmienna], [a , b]) Całkowanie funkcji - funkcja int( )Jej argumentem jest funkcja symboliczna opcjonalnie także zmienna całkowania oraz granice całkowania (dla całek oznaczonych). int(F,[zmienna], [a , b]) Uwaga: domyślnie zmienną symboliczną jest x
20 Przykład: Obliczenie całki nieoznaczonej funkcji f(a,b)=a+b syms a xint(a+x) int(a+x, a) %Sprawdzenie diff(f) ans = a*x+1/2*x^2 1/2*a^2+a*x a+x Rezultat:
21 Obliczenie całki oznaczonej:syms x int(x^2,1,3) ans = 26/3 Obliczenie całki oznaczonej funkcji sin x w przedziale (0, π) int(sin(x),0,pi) ans = 2
22 Rozwiązywanie równań różniczkowychfunkcja dsolve() . Funkcja oblicza symbolicznie rozwiązania równań różniczkowych zwyczajnych. Równania są określane przez symboliczne wyrażenia zawierające literę D do oznaczenia stopnia. Symbole D2, D3... DN, odnoszą się do drugiej, trzeciej,..., n-tej pochodnej. D2y jest zatem odpowiednikiem symbolicznym Zmienna niezależna domyślna t.
23 Nazwy zmiennych symbolicznych nie powinny zatem zawierać DNazwy zmiennych symbolicznych nie powinny zatem zawierać D. Zmienną niezależną można zmienić i podać jako ostatni argument. Warunki początkowe mogą być określone przez dodatkowe równania. Jeśli nie określono warunków początkowych, rozwiązania zawierają stałe całkowania: C1, C2, itp. Rozwiązanie dsolve jest podobne do solve. Oznacza to, że można wywołać dsolve z liczbą zmiennych wyjściowych równą liczbie zmiennych zależnych od lub umieścić w strukturze, której pola zawierają rozwiązania równań różniczkowych.
24 Przykład dsolve('Dy=1+y^2') dsolve('Dy=1+y^2','x') dsolve('Dx = -a*x')Rozwiązać równanie: dsolve('Dy=1+y^2') zmienna t domyślna ans = tan(t+C1) dsolve('Dy=1+y^2','x') zmienna x ustalona ans = tan(x+C1) dsolve('Dx = -a*x') ans = C1*exp(-a*t)
25 Po wstawieniu warunków początkowych:y = dsolve('Dy=1+y^2','y(0)=1') y = tan(t+1/4*pi) Uwaga: y jest w obszarze roboczym MATLAB, ale t nie jest, a zatem polecenie diff(y,t) zwraca błąd. Aby umieścić t w obszarze roboczym należy: syms t pochodna=diff(y,t) pochodna= 1+tan(t+1/4*pi)^2
26 x = dsolve('(Dx)^2+x^2=1','x(0)=0')Przykład 2 Równania nieliniowe mogą mieć wiele rozwiązań, nawet wtedy, gdy podane są warunki początkowe: x = dsolve('(Dx)^2+x^2=1','x(0)=0') x = [ sin(t)] [ -sin(t)]
27 Równanie różniczkowe drugiego stopnia z dwoma warunkami początkowymi:Przykład 3 Równanie różniczkowe drugiego stopnia z dwoma warunkami początkowymi: y = dsolve('D2y=cos(2*x)-y','y(0)=1','Dy(0)=0', 'x') simplify(y) %uproszczenie y = 4/3*cos(x)-1/3*cos(2*x) ans = 4/3*cos(x)-2/3*cos(x)^2+1/3
28 u = dsolve('D3u=u','u(0)=1','Du(0)=-1','D2u(0) = pi','x')Przykład 4 warunki początkowe u = dsolve('D3u=u','u(0)=1','Du(0)=-1','D2u(0) = pi','x') D3u reprezentuje d3u/dx3 D2u(0) odpowiada u"(0) u = 1/3*pi*exp(x)-1/3*(pi+1)*3^(1/2)*exp(-1/2*x)*sin(1/2*3^(1/2)*x)+ (1-1/3*pi)*exp(-1/2*x)*cos(1/2*3^(1/2)*x)
29 Układ równań różniczkowychFunkcja dsolve rozwiązuje także układ równań różniczkowych zwyczajnych kilku zmiennych, z warunkami początkowymi lub bez
30 Przykład f = S.f g = S.g Dwa równania liniowe, pierwszego rzędu:S = dsolve('Df = 3*f+4*g', 'Dg = -4*f+3*g') S = f: [1x1 sym] g: [1x1 sym] Rozwiązania obliczane są zwracane w strukturze S. Można określić wartości f i g, wpisując: f = S.f g = S.g f = exp(3*t)*(C1*sin(4*t)+C2*cos(4*t)) g = exp(3*t)*(C1*cos(4*t)-C2*sin(4*t))
31 Jeśli chcemy uzyskać f i g bezpośrednio, oraz uwzględnić także warunki początkowe, wpisujemy:[f,g] = dsolve('Df=3*f+4*g, Dg =-4*f+3*g', 'f(0) = 0, g(0) = 1') f = exp(3*t)*sin(4*t) g = exp(3*t)*cos(4*t)
32 Jeszcze jeden przykład składni w Symbolic Math Toolbox.y = dsolve('Dy+4*y = exp(-t)', 'y(0) =1') spr=diff(y,t)+4*y %sprawdzenie rozwiązania spr = simplify(spr) t=0 %sprawdzenie warunku początkowego wp=subs(y) y = (1/3*exp(3*t)+2/3)*exp(-4*t) spr = exp(-4*t)*exp(3*t) exp(-t) t = wp = 1