FIC MATLAB 2018-1/Aula-15

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Aula em forma de relatório
%% Toolbox de matemática simbólica
% Nesta aula, veremos o uso do Toolbox de Matemática Simbólica do
% MATLAB(R), o _Symbolic Math Toolbox_.
%

%% Balanceamento
%
% A partir das equações abaixo:
%
% $$ C_3 H_8 + O_2 $$ -> $$ C O_2 + H_2 O $$

%% O pacote simbólico
%
% É um pacote comprado à parte, que usa um paradigma diferente do
% normalmente usado no MATLAB(R). Por padrão, o MATLAB(R) usa cálculos
% numéricos, com valores aproximados. No Toolbox de matemática simbólica,
% os cálculos são exatos.
clear all; close all; clc; format compact

%%
% Como exemplo de limitação da matemática numérica, vemos a comparação
% abaixo. Sendo _eps_
eps
%%
% A comparação abaixo ainda é entendida como verdadeira em matemática
% numérica:
1 + eps/2 == 1

%%
% Um exemplo é o fatorial de 52:
factorial(52)

%%
% Para encontrar todas as casas do fatorial, usamos a função sym():
sym('factorial(52)')

%%
% Uma potência grande de 2, também mostra a diferença:
disp('- Numérico:')
2^100

disp('- Simbólico:')
sym('2^100')

%%
% Além disso, o pacote simbólico pode trabalhar com variáveis:
expr1 = sym('x^2 + sin(x)')
expr2 = sym('a*x + b')

%%
% Repare que as variáveis criadas representam expressões matemáticas, e a
% classe das variáveis é diferente:
whos expr1 expr2

%%
% Podemos também realizar operações matemáticas com as expressões:
expr3 = expr1 / expr2

%%
% Funções de visualização podem ser usadas para melhorar a exibição dos
% resultados:
disp('Função pretty()')
pretty(expr3)

disp('Função latex()')
latex(expr3)

%%
% Além da criação de expressões usando a função _sym()_, a função _syms_
% pode ser utilizada, trazendo as variáveis que serão consideradas
% simbólicas pelo MATLAB(R) dali para frente:
syms x y z a b

%%
% Repare que as variáveis são criadas no workspace com o tipo sym:
whos x y z a b

%%
% Neste caso, as expressões não precisam mais ser definidas como strings:
expr4 = (x*y + a^2 * b) / sin(z)

%%
% Desigualdades são criadas via operadores relacionais:
expr5 = a*x == z^2
expr6 = a^2 * x <= sin(z^2)

%%
% Para calcular as expressões em valores específicos das variáveis, usamos
% a função _subs()_:
subs(expr2,b,17)

%%
% Repare que a variável "b" foi substituída pelo valor 17. Além disso,
% outros valores simbólicos podem ser usados na substituição:
subs(expr2,b,2*a*x)

%%
% Para substituir mais de um valor, usa-se células na função _subs()_:
subs(expr2,{a,b},{7,-1})
e = subs(expr2,{a,b,x},{7,-1,10})

%%
% Repare que, mesmo substituindo todas as variáveis, o retorno da função
% ainda é uma variável simbólica:
whos e

%%
% Para converter o resultado para um número, usamos a função _double()_
double(e)

%% PI
% Para usar o \pi em substituições, podemos fazer de duas formas. Na
% primeira, a substituição é feita com o numérico 3,14..., na segunda, o
% valor exato de pi é usado. O recomendado é sempre usar aspas:
sym(pi+1)
sym('pi+1')

%%
% A função _subs()_ pode ser usada para substituir todas as variáveis que
% possuem definição numérica no workspace, para isso, basta não passar
% nenhum parâmetro adicional:
expr2
b = 17    % Numérico
subs(expr2)

%% Equações algébricas
%
% O toolbox de matemática simbólica pode ser usado para manipulações
% algébricas.
syms x

%% Distributiva
% Seja a expressão:
expr1 = x*(x+1)

%%
% Para fazer a distribuição de x, usa-se a função _expand()_:
expr2 = expand(expr1)

%% Fatoração
% Seja a expressão
expr2

%%
% Vemos que _x_ é um fator comum, por isso pode ser fatorado:
factor(expr2)

%%
% Para retornar à forma retornada pela função _expand()_, usamos a função
% _prod()_:
prod(factor(expr2))

%% Fatoração com múltiplas variáveis
% Para casos onde temos mais de uma variável, a função _collect()_ faz a
% fatoração para a variável escolhida. Seja a expressão abaixo:
expr3 = x*y^2 + (1+x)*y + y^2

%%
% A fatoração em termos de _x_ e de _y_ é:
disp('"x" como fator comum:')
collect(expr3,x)

disp('"y" como fator comum:')
collect(expr3,y)

%% Simplificação 
% Simplificar uma expressão nem sempre é claro. Mas o toolbox tem uma
% versão própria, que pode ajudar em algumas aplicações. Para isso, usa-se
% a função _simplify()_
simplify(expr3)

%%
% Outros exemplos interessantes são:
expr4 = cos(x)^2 + sin(x)^2
simplify(expr4)

expr5 = (x^2 + x)/(2*x)
simplify(expr5)

%% Equações do segundo grau
% O toolbox também calcula raízes de equações do segundo grau:
syms a b c
eq2grau = a*x^2 + b*x + c

%%
% Para resolver, usa-se a função _solve()_, que aplica Bhaskara e nos
% retorna um vetor com os valores exatos das raízes:
solve(eq2grau)

%% Limite
% Podemos usar operações de cálculo também de forma simbólica. Por exemplo,
% para calcular o limite abaixo:
%
% $$ lim_{x towards 0} \frac{\sin(x)}{x} $$
%
% Podemos fazer numericamente, mas recebemos um NaN:
sin(0)/0

%%
% Sabemos por L'Hopital que o limite resulta em 1. Ao aplicar um número que
% se aproxima de zero, temos:
format long
sin(0.000001)/0.000001
format

%%
% Vemos que o número se aproxima de 1, mas isto não é uma prova que ele é
% 1. Se ao invés disso usarmos a matemática simbólica, temos uma resolução
% exata:
syms x
limit(sin(x)/x)

%% 
% Outro exemplo é o limite de:
%
% $$ \lim_{x towards \inf} (1 + \frac{1}{x})^x = e$$
limit((1+1/x)^x,x,inf)

%% Derivadas
% Podemos também resolver derivadas. Para isto, usamos a função _diff()_:
syms a b x
diff(a*x^2 + sin(b*x),x)

%%
% Para derivadas de ordem superior, basta incluir mais um parâmetro:
disp('- Segunda ordem:')
diff(a*x^2 + sin(b*x),x,2)
disp('- Terceira ordem:')
diff(a*x^2 + sin(b*x),x,3)
disp('- Quarta ordem:')
diff(a*x^2 + sin(b*x),x,4)
disp('- Quinta ordem:')
diff(a*x^2 + sin(b*x),x,5)

%% Integrais
% Integrais podem ser calculadas com a função _int()_
int(x^3,x)
int(x^-1,x)

%%
% Veja o caso abaixo:
func1 = x^a

%%
% A sua integral é
int(x^a,x)

%%
% Repare que o MATLAB(R) retorna múltiplos resultados, dependendo do valor
% de _a_:
pretty(int(x^a,x))

%%
% No caso em que $$a = -1$$, o denominador da fração daria zero, impedindo
% sua solução. Por isso, há duas condições. Quando sabemos a região onde
% _a_ é definido, podemos informar isto através da função _assume()_
assume(a > 0)

%%
% Agora a integral é:
int(x^a,x)

%%
% Para ver todas as condições passadas:
assumptions(a)

%% Mais condições
% Sabemos que _cos(2 \pi x) = 1_, para x E inteiros, mas o MATLAB(R) não
% retorna esta condição naturalmente:
simplify(cos(2*pi*x))

%%
% Incluindo a condição de que x E inteiros, temos:
assume(x,'integer')
simplify(cos(2*pi*x))

%% Integrais definidas
% Para passar intervalos onde a integral será definida:
int(x^a,x,0,3)

%%
% Podemos combinar condições de variaveis com operadores lógicos:
assume((a > 0) & (a < 2))
assumptions(a)

%% Séries de Taylor
% Para a série abaixo:
%
% $$ e^x = 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + ... $$
taylor(exp(x),x,'Order',5)

%% Soma simbólica - Série geométrica
% Para a série abaixo:
%
% $$ \sum_{x = 0}^{\inf}{1/2}^x = 1 + 1/2 + 1/4 + ... = 2 $$
symsum((1/2)^x,x,0,inf)

%%
% $$ \sum_{x = 0}^{\inf}{r}^x = 1 + r + r^2 + ... $$
syms r
symsum(r^x,x,0,inf)

%%
% Para trazer uma condição para r, usamos a função assume
assume(abs(r) < 1)
symsum(r^x,x,0,inf)

%% Frações parciais
% Frações parciais são muito usadas em engenharias
expr = x^2 / (x^3 - 3 * x + 2)

pretty(expr)

partfrac(expr,x)

pretty(partfrac(expr,x))