W04_Matlab4 wer2

Download Report

Transcript W04_Matlab4 wer2

MOiPP
Wykład 4
Matlab
• Przykłady metod obliczeniowych
• Obliczenia symboliczne
1
Sortowanie bąbelkowe
Porównywanie kolejnych par elementów sąsiadujących i
zamiana miejscami w przypadku niewłaściwej kolejności
1
2
3
N-1 porównań
4
.....
N
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
1 PRZEBIEG
96
12
22
76
64
23
74
11
76
64
23
74
11
96
2 PRZEBIEG
12
22
3
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
zamiana miejscami
if G(m)>G(m+1)
gdy elementy w
pom=G(m);
niewłaściwej
G(m)=G(m+1);
kolejności
G(m+1)=pom;
end
end
disp(G) %pokazuje kolejne wypływające "bąbelki"
end
%ostatecznie po posortowaniu
disp(G)
4
Obliczenia symboliczne w Matlabie
Niezbędny jest tu dodatkowy
(komercyjny) tzw. toolbox o nazwie
Symbolic Tool
5
Obliczenia 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
Symboliczne rozwiązywanie równań – funkcja solve()
Przykład:
syms x a
f=a - x^2;
z =solve (f, x)
z=
a^(1/2)
-a^(1/2)
Symboliczne operacje macierzowe
syms a b c d e f g h
A=
[ a, b]
A=[a b; c d]
[ c, d]
B=[e f ; g h]
il_m=A*B
il_e=A.*B
iloczyn macierzowy
Cauchy'ego
iloczyn elementowy
Hadamarda
(po współrzędnych)
B=
[ e, f]
[ g, h]
il_m =
[ a*e+b*g, a*f+b*h]
ilustracja iloczynów macierzy
kwadratowych
[ c*e+d*g, c*f+d*h]
il_e =
[ a*e, b*f]
[ c*g, d*h]
Wstawienie danych do wyrażeń symbolicznych funkcja subs( )
Przykład:
syms a b c x
% definicja 4 zmiennych symbolicznych
% rozwiązanie równania względem x
y = solve(a*x^2+b*x+c)
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=
-0.3333
-1.0000
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 zmiennejb,
Uwagi:
• zmienna jest opcjonalna, jeśli wyrażenie zawiera jedną
zmienną.
• b opcjonalne, jego pominięcie oznacza granicę dla
zmienna0.
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')
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ść)
Przykład
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
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])
Przykład:
Obliczenie pochodnej funkcji f(x)=x2
syms x
a=diff(x^2)
Rezultat
a=
2*x
Przykład:
Obliczenie pochodnej funkcji f(x, y, z)
według każdej zmiennej (pochodne cząstkowe):
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
ans =
(x*y*z)^x*(log(x*y*z)+1)-2/x^3/y^2
ans =
(x*y*z)^x*x/y-2/x^2/y^3
ans =
(x*y*z)^x*x/z
17
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
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
Przykład:
Obliczenie całki nieoznaczonej funkcji f(a,b)=a+b
syms a x
int(a+x)
int(a+x, a)
%Sprawdzenie
diff(f)
Rezultat:
ans =
a*x+1/2*x^2
ans =
1/2*a^2+a*x
ans =
a+x
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
Rozwiązywanie równań różniczkowych
funkcja 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.
Nazwy 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.
Przykład
Rozwiązać równanie:
dsolve('Dy=1+y^2')
zmienna t domyślna
ans =
tan(t+C1)
dsolve('Dy=1+y^2','x')
ans =
tan(x+C1)
dsolve('Dx = -a*x')
ans =
C1*exp(-a*t)
zmienna x ustalona
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
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)]
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
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)
Układ równań różniczkowych
Funkcja dsolve rozwiązuje także układ równań
różniczkowych zwyczajnych kilku zmiennych, z
warunkami początkowymi lub bez
Przykład
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))
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)
Jeszcze jeden przykład składni w Symbolic Math Toolbox.
y(0) = 1
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)
spr =
exp(-t)
t=
0
wp =
1