Obliczenia w Matlabie Obliczenia symboliczne Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania
Symbolic Math Biblioteka Symbolic Math Toolbox pozwala na wykonywanie obliczeń na zmiennych symbolicznych. Jej możliwości obejmują: obliczenia z możliwością określenia dokładności, całkowanie i różniczkowanie analityczne wzorów matematycznych, upraszczanie i przekształcanie wyrażeń, obliczenia z zakresu algebry liniowej, analityczne rozwiązywanie równań algebraicznych i różniczkowych.
Definiowanie zmiennych symbolicznych x=sym('x'); % syms x f=x^2; f=@(x)x^2 Funkcja anonimowa Wyrażenie symboliczne
Obliczanie wartości wyrażenia syms x f=x^2; x=5; eval(f) Zapis f(5) generuje błąd syms x f=x^2; subs(f,5) subs(f,x,5)
Obliczanie wartości wyrażenia syms x a b c f=a*x^2+b*x+c; subs(f,x,3) subs(f,a,3) subs(f,b,3) subs(f,c,3) subs(f,3) subs(f,[a,b,c],[1,2,3]) 9*a + 3*b + c 3*x^2 + b*x + c a*x^2 + 3*x + c a*x^2 + b*x + 3 9*a + 3*b + c Funkcja subs podstawia wartość pod zmienną najbliższą w alfabecie do zmiennej x, czyli: x, y, w, z, v, u, t, …, b, a x^2 + 2*x + 3
Upraszczanie wyrażeń 1 log(exp(x)) x x syms x f=sin(x)^2+cos(x)^2 g=simple(f) f=log(exp(x)) syms x real % x=sym('x','real') g=simple(f,'IgnoreAnalyticConstraints',true) 1 log(exp(x)) x x
Faktoryzacja wyrażeń factor(20) factor(sym('20')) syms x f=x^3+6*x^2+11*x+6 factor(f) syms a b factor(a^2-b^2) factor(a^2+2*a*b+b^2) [2,2,5] 2^2*5 (x + 3)*(x + 2)*(x + 1) (a - b)*(a + b) (a + b)^2
4*cos(x)*sin(x) + 4*cos(x)^2*sin(x)^2 + 1 Rozwijanie wyrażeń syms x f=factor(x^3+6*x^2+11*x+6) expand(f) f=(sin(2*x)+1)^2 expand(f,'ArithmeticOnly',true) syms x y f=log((x*y)^2) expand(f,'IgnoreAnalyticConstraints',true) (x + 3)*(x + 2)*(x + 1) x^3 + 6*x^2 + 11*x + 6 4*cos(x)*sin(x) + 4*cos(x)^2*sin(x)^2 + 1 2*sin(2*x) + sin(2*x)^2 + 1 log(x^2*y^2) 2*log(x) + 2*log(y)
Wielomiany p=[1,6,11,6] f=poly2sym(p) f_a=poly2sym(p,sym('a')) horner(f) sym2poly(f) x^3 + 6*x^2 + 11*x + 6 a^3 + 6*a^2 + 11*a + 6 x*(x*(x + 6) + 11) + 6 [1,6,11,6]
Różniczkowanie wyrażeń syms x f=x^2 diff(f) diff([1,2,4,7]) diff(1) diff(sym('1')) 2*x [1,2,3] []
Różniczkowanie wyrażeń syms x y f=sin(x)+cos(y) diff(f) diff(f,x) diff(f,y) diff(f,2) diff(f,y,2) diff(diff(f,x),y) cos(x) cos(x) -sin(y) -sin(x) -cos(y)
Gradient i hesjan Gradient – wektor pochodnych cząstkowych funkcji: Hesjan (macierz Hessego) – macierz drugich pochodnych
Gradient i hesjan syms x y f=sin(x)+cos(y) gradient(f) hessian(f) [cos(x); -sin(y)] [-sin(x), 0; 0, -cos(y)]
Całkowanie wyrażeń syms x f=x^2 int(f) int(f,0,1) x^3/3 1/3
Całkowanie wyrażeń x^3/3 + x*y^2 x^3/3 + x*y^2 y^2 + 1/3 x^2*y + y^3/3 syms x y f=x^2+y^2 int(f) int(f,x) int(f,x,0,1) int(f,y) int(f,x,y) int(int(f,x),y) x^3/3 + x*y^2 x^3/3 + x*y^2 y^2 + 1/3 x^2*y + y^3/3 (4*y^3)/3 - x*(x^2/3 + y^2) (x*y*(x^2 + y^2))/3
piecewise([n = -1, log(x)], [n <> -1, x^(n + 1)/(n + 1)]) Całkowanie wyrażeń syms x f=asin(sin(x)) int(f) int(f,'IgnoreAnalyticConstraints',true) syms x n f=x^n int(f,'IgnoreSpecialCases',true) int(asin(sin(x)), x) x^2/2 piecewise([n = -1, log(x)], [n <> -1, x^(n + 1)/(n + 1)]) x^(n + 1)/(n + 1)
Obliczanie granic syms n limit((1+1/n)^n,Inf) syms x limit(x/abs(x),0) limit(x/abs(x),x,0,'left') limit(x/abs(x),x,0,'right') exp(1) NaN -1 1
Obliczenia na macierzach syms a b c d A=[a,b;c,d] det(A) inv(A) eig(A) a*d - b*c [d/(a*d - b*c), -b/(a*d - b*c); -c/(a*d - b*c), a/(a*d - b*c)] [a/2 + d/2 - (a^2 - 2*a*d + d^2 + 4*b*c)^(1/2)/2; a/2 + d/2 + (a^2 - 2*a*d + d^2 + 4*b*c)^(1/2)/2]
Rozwiązywanie równań p=[1,0,-1] fs=poly2sym(p) fh=matlabFunction(fs) roots(p) solve(fs) fzero(fh,0.5) fzero(fh,[-1.5,-0.5]) [-1; 1] [1; -1] 1 -1
[1; -1] Rozwiązywanie równań [1; -1] solve('x^2-1') solve('x^2=1') solve('x^2+1') solve('x*(x^2+1)') solve('x*(x^2+1)','Real',true) syms x positive solve(x^2-1) [i; -i] [0; i; -i] 1 1
syms x y f=x^2-y^2 solve(f) solve(f,y) solve('a*x^2+b*x+c=0') Rozwiązywanie równań [y; -y] syms x y f=x^2-y^2 solve(f) solve(f,y) solve('a*x^2+b*x+c=0') [x; -x] [-(b + (b^2 - 4*a*c)^(1/2))/(2*a); -(b - (b^2 - 4*a*c)^(1/2))/(2*a)]
Rozwiązywanie równań exp(log(y) + 5)/y exp(5) syms x y solve(log(x*y)-log(y)-5) solve(log(x*y)-log(y)-5,'IgnoreAnalyticConstraints',true) exp(5)
Rozwiązywanie układów równań syms x y z f1=4*x-z f2=x-y f3=x^2+y^2-z [x,y,z]=solve(f1,f2,f3) [x,y,z]=solve('z=4*x','x=y','z=x^2+y^2') [0; 2] [0; 2] [0; 8]
solve i różne wersje Matlaba Ver 2011b Ver 2017b solve(2*x-5) OK solve('2*x-5') WARNING solve(2*x=5) ERROR solve('2*x=5') solve(2*x==5) solve('2*x==5') Użycie solve bez apostrofu musi być poprzedzone definicją zmiennej symbolicznej x: syms x
Rozwiązywanie równań i układów równań różniczkowych C2/exp(t) + 1 y=dsolve('Dy+y=1') y=dsolve('Dy+y=1','y(0)=2') y=dsolve('D2y-2*Dy+y=1+t','Dy(0)=0','y(0)=0') [y1,y2]=dsolve('Dy1=y1*log(y2)','Dy2=-y2','y1(0)=exp(-2)','y2(0)=exp(2)') y=dsolve('Dy+2*y=0','y(0.5)=1/exp(1)') 1/exp(t) + 1 t - 3*exp(t) + 2*t*exp(t) + 3 1/(exp(2)*exp((t*(t - 4))/2)) exp(2)/exp(t) 1/exp(2*t)
dsolve i różne wersje Matlaba Ver 2011b Ver 2017b dsolve(diff(y)+y-1) [ empty sym ] OK dsolve('Dy+y-1') WARNING dsolve(diff(y)+y=1) ERROR dsolve('Dy+y=1') dsolve(diff(y)+y==1) dsolve('Dy+y==1') Użycie dsolve bez apostrofu musi być poprzedzone definicją (2017b) funkcji symbolicznej y(t): syms y(t) lub (2011b) zmiennej symbolicznej y: syms y
Równanie różniczkowe II rzędu z warunkami początkowymi – ver 2017b syms y(t); Dy=diff(y); dsolve(diff(y,2)-2*diff(y)+y==1+t, Dy(0)==0, y(0)==0)
Rysowanie wykresów syms x f=x^2 ezplot(f) figure ezplot(f,[-1,1])
Rysowanie wykresów syms x y f=x^2+y^2 ezsurf(f) figure ezcontourf(f)
Prezentacja udostępniona na licencji Creative Commons: Uznanie autorstwa, Na tych samych warunkach 3.0. Pewne prawa zastrzeżone na rzecz autorów. Zezwala się na dowolne wykorzystywanie treści pod warunkiem wskazania autorów jako właścicieli praw do prezentacji oraz zachowania niniejszej informacji licencyjnej tak długo, jak tylko na utwory zależne będzie udzielana taka sama licencja. Tekst licencji dostępny jest na stronie: http://creativecommons.org/licenses/by-sa/3.0/deed.pl