Základy programování v Matlabu - část 6

Ing. Petr Pokorný, Ph.D.

Symbolické výpočty

Kromě numerických výpočtů Matlab umožňuje řadu analytických operací - tzv. symbolických výpočtů. Jedná se např. o derivace, integrace, řešení soustav rovnic, apod. Symbolické výpočty jsou umožněny, jestliže je nainstalován Symbolic Math Toolbox.
Pro práci se symbolickými proměnnými je třeba je nejprve deklarovat (definovat).
Matlab umožňuje definici symbolických proměnných, vektorů, matic nebo funkcí (viz doc syms).
% doc syms

Základní operace, derivace, integrace

% Deklarace symbolickych promennych
syms a b c
% Zakladni algebraicke operace
M = a*b;
N = a/c;
% Derivace
diff( cos(b) )
ans = 
diff( sin(a*b)*exp(c), b ) % parcialni derivace podle b
ans = 
% Integrace
int( cos(b) )
ans = 
int( sin(a)^2, a , 0 , 1 ) % urcity integral podle a od 0 do 1
ans = 

Řešení soustav rovnic

clear variables
syms x y real % deklarace realnych symbolickych promennych
rovnice = [ 2*x + 3*y^2 == 1; -x + 2*y == 2 ]; % zapis symbolickych rovnic do matice
reseni = solve( rovnice, [x y] ); % reseni soustavy pomoci funkce solve, ta ulozi reseni do struktury
reseni.x % vypis prvku struktury
ans = 
reseni.y
ans = 

Symbolické rovnice

clear variables
syms z(x,y) % deklarace symbolicke rovnice dvou promennych
z(x,y) = x + 3*x^2*y + y^2; % definice rovnice
% priklad dvojne integrace
Ix = int( z, x ) % priklad integrace podle x
Ix(x, y) = 
Ixy_varianta_1 = int( Ix, y ) % priklad integrace podle y
Ixy_varianta_1(x, y) = 
Ixy_varianta_2 = int( int( z, x ), y ) % integrace v jednom radku
Ixy_varianta_2(x, y) = 
Ixy_num = Ixy_varianta_2( 1, 2 ) - Ixy_varianta_2( 0, 0 ) % vycisleni pro x in [0 1] a y in [0 2]
Ixy_num = 
Ixy_num_varianta_2 = int( int( z, x, 0, 1 ), y, 0, 2 ) % primy vypocet urciteho integralu
Ixy_num_varianta_2 = 

Úpravy symbolických výrazů

Výsledné symbolické výrazy lze upravovat, zjednodušovat, řadou funkcí, např.:
clear variables
syms x real
syms p [1 5] real
% tvorba funkce
argument = x.^(1:5)*p';
f = sin( argument )^2;
% tayloruv rozvoj
f_taylor = taylor( f, x, 'order', 8 )
f_taylor = 
% zjednoduseni vyrazu
simplify( f_taylor )
ans = 
% uprava podle koeficientu
collect( f_taylor, x )
ans = 
% nalezeni koeficientu rozvoje, ulozeni do matice C, vypis zjednodusenych
% koeficientu
C = coeffs( f_taylor, x );
for iL = 1:length(C)
simplify( C(iL ) )
end
ans = 
ans = 
ans = 
ans = 
ans = 
ans = 

Substituce, vyčíslení

V symbolických proměnných lze provádět substituce (funkce subs). Pomocí funkce eval dále můžeme provést vyhodnocení vypočteného symbolického výrazu, jako bychom příkaz zapsali do příkazové řádky.
p_num = [ 0.1 0.02 0.03 0.04 0.005 ]; % vytvoreni vektoru koeficientu p,
% kterym nahradime hodnoty koeficietnu p1, ..., p5
% z predchozi ukazky
C_num = subs( C, p, p_num ) % vycisleni koeficientu C
C_num = 

Vyvoření in-line funkce pomocí matlabFunction

Z odvozených symbolických výrazů můžeme vytvořit in-line funkci pomocí matlabFunction, a tu dále použít např. pro numerické vyčíslení.
clear variables
syms x
fun = x*sin(x);
fun_m = matlabFunction( fun )
fun_m = function_handle with value:
@(x)x.*sin(x)
t = linspace( 0, 1, 100 );
y = fun_m( t );
plot(t,y)

Příklady

Příklad 1

Nechť X a Y jsou reálné symbolické proměnné (sym, syms, real, …). Zapište následující vztahy, výsledky zjednodušte (simplify) a zobrazte (pretty):
  1. ,
  2. ,
  3. ,
  4. .

Příklad 2

Symbolicky zjednodušte výraz V pro reálná X a Y (simplify, collect, ):
.
Dosaďte do symbolického výrazu V za X = 1 a Y = 2 a určete výslednou hodnotu (subs).

Příklad 3

Vyjádřete x a y z rovnice kružnice pomocí symbolických výpočtů a funkce solve:
.

Příklad 4

Vypočtěte následující integrál pomocí symbolických výpočtů (int), funkce solve a dosazení subs:
.
Vypočtěte také integrál v jednom řádku.

Příklad 5

Určete analytický tvar derivace funkce f(x) pomocí symbolických výpočtů (diff) a hodnotu derivace v bodě x = 2 (subs, eval, …):
.