Skip to content

Instantly share code, notes, and snippets.

@EloneSampaio
Forked from mracos/Octave.md
Created August 31, 2018 21:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save EloneSampaio/65427df2c5caa294b7dc5ecc99faffa4 to your computer and use it in GitHub Desktop.
Save EloneSampaio/65427df2c5caa294b7dc5ecc99faffa4 to your computer and use it in GitHub Desktop.
Matemática simbólica com octave

Matemática simbólica com Octave.

  • Aquecimento
  • [Introdução] (#introdução)
  • [Exemplos] (#exemplos)
    • [Derivadas] (#derivadas)
      • [Gradiente] (#gradiente)
    • [Integrais] (#integrais)
    • [Máximos e Mínimos] (#máximos e mínimos)

Aquecimento

Você vai precisar do octave dãã, do pacote symbolic (e de suas dependências: python,sympy).

Caso já tenha todos os pacotes instalados é só pular essa parte.

Instale todos os pactoes necessários, em distros baseadas no debian/ubuntu ficaria algo como:

sudo apt-get install python python-sympy octave octave-symbolic

Caso use outro SO vá na página de cada pacote e procure as instruções de instalação específicas para o seu sistema. Se o SO for windows tente isso ou isso.

Não esqueça de dar um pkg load all dentro do interpretador do octave para carregar os pacotes baixados.

Introdução

Citando a wikipedia:

Matemática simbólica, diz respeito ao uso de computadores para manipular equações matemáticas e expressões em forma simbólica, em oposição à mera manipulação de aproximações a quantidades numéricas específicas representadas por aqueles símbolos. Um tal sistema pode ser usado para integração ou diferenciação, substituição de uma expressão numa outra, simplificação de uma expressão, etc.

Resumindo, matemática simbólica permite a realização de operações com variáveis abstratas, sem a necessidade definir valores à elas.

Exemplos

Antes de começar com as operações propriamente ditas, primeiramente precisa-se declarar as variáveis simbólicas, que são uma forma de se dizer pro octave que as operações devem ser feitas analiticamente.

Para isso usa-se o comando sym nome_da_variável.

Uma forma de declarar várias variáveis simbólicas sem necessitar repetir o comando sym é utilizar o comando:

syms nome_da_variável_um nome_da_variável_dois

Declarando previamente todos as variáveis utilizadas nos exemplos.

% variáveis simbólicas
syms x, y, z;

% definindo as funções utilizando as variáveis simbólicas
func_um(x) = x^3;
func_dois(x, y) = x^2+y^2+2*log(x^y);
func_tres(x, y, z) = x*y/(y+z);

Derivadas

A sintaxe para derivada é a seguinte diff(f, x, y, ...) onde:

  • f é a função simbólica a ser derivada
  • x, y, ... são as variáveis em relação a qual a função está sendo derivada, é * opcional* para funções de uma variável. Nota: a ordem é sequencial, e.g. no caso de derivadas parciais, as quais as de ordem superior podem ser em relação as duas variáveis, ou a mesma variável duas vezes.

e.g.

( % >> é o retorno esperado)

% função de uma variável

% derivada de primeira ordem
diff(func_um) 
% >> 3x^2

% derivada de segunda ordem
diff(func_um, 2) 
% >> 6x

% função de duas variáveis

% derivada parcial de primeira ordem em relação a primeira variável
% que aparece na função (por conta da omissão do segundo argumento)
diff(func_dois) 
% >> 2x + (2y)/x

% derivada de primeira ordem em relação a y
diff(func_dois, y) 
% >> 2y + 2log(x)

% derivada de segunda ordem ambas em relação a x (mesma coisa que diff(f, x, x))
diff(func_dois, x, 2) 
% >> 2(1 - (y/x^2))

Derivada parcial de segunda ordem em relação a xy (que segundo o Teorema de Schwartz é o mesmo que yx)

diff(func_dois, x, y)
% >> 2/x

% função de três variáveis
% funciona da mesma forma que a de duas variáveis, 
% só que agora com uma derivada parcial em relação a mais um argumento

diff(func_tres, x) % derivada parcial de primeira ordem em relação a x
% >> y/(y + z)

diff(func_tres, z, 2) % derivada parcial de segunda ordem em relação a z
% >> 2xy/(y + z)^3

diff(func_tres, z, y, x) % derivada parcial de terceira ordem em relação a xyz
% >> ((2y/(y + z)) - 1)/(y + z)^2

Gradiente

O vetor gradiente pode ser obtido da seguinte forma gradient(f, x) Onde:

  • f é a funçãode onde vai se calcular o vetor gradiente.
  • x é o uma coordenada cartesiana, ditando a *direção" do vetor. É opcional.

Uma forma de se obter o gradiente de uma função é calcular suas derivadas parciais e concatenar em um vetor onde cada derivada corresponde a uma coordenada.

e.g

% vetor gradiente de uma função de duas variáveis 
gradient(func_dois)
% >> [2x + 2y/x ; 2y + 2log(x)]

% vetor gradiente da mesma função na direção de x
gradient(func_dois, x)
% >> 2x + 2y/x % pois o versor y não existe nessa direção

% vetor gradiente da mesma função calculado "manualmente"
vect_grad = [diff(func_dois, x) ; diff(func_dois, y)]

Integrais

A sintaxe para a integração é a seguinte int(f, x, [a b]) Onde:

  • f É a função em questão.
  • x É a variável de relação da integração, opcional em funções de uma variável.
  • a, b são os limites de integração, caso seja uma integral definida. opcional
% integral indefinida de uma função de uma variável
int(func_um)
% >> (x^4)/4

% integral definida de uma função de uma variável, com os limites sendo 2 até 3
int(func_um, [2 3])
% >> 65/4

Já em integrais de mais de uma variável, graças ao Teorema de Fubini podemos obtê-la com integrais aninhadas. e.g.

% integral indefinida de duas variáveis

% primeiro integra em relação a uma variável
x_primitive = int(func_dois, x)
% >> ((x^3)/3) + x(y^2 - 2y) + 2xlog(x^y)

% e depois em relação a outra
primitive = int(x_primitive, y)
% >> ((yx^3)/3) + ((xy^3)/3) + (xlog(x) - x)y^2

% resumindo:
int(int(func_dois, x), y)
% >> ((yx^3)/3) + ((xy^3)/3) + (xlog(x) - x)y^2

% integral definida de duas variáveis 

% é só adicionar os limites de integração em ambos os passos
int(int(func_dois, x, [2 3]), y, [2 3])
% >> -10*log(2) + 23/3 + 15*log(3) (ou 17.214)

% integral indefinida em três variáveis

% é escalar os passos feitos na de duas variáveis
int(int(int(func_tres, x), y), z)
% >> ((x^2)(y^2)log(y + z))/4 + ((x^2)yz)/4 + ((x^2)(z^2)log(y + z)/4 + ((x^2)(z^2))/8

% integral definida em trẽs variáveis

% mesmos passos que em uma de duas variáveis
int(int(int(func_tres, x, [2 3]), y, [2 3]), z, [2 3])
% >> 5/4

Máximos e Mínimos

Para encontrarmos os pontos de máximos e mínimos locais primeiro definimos os pontos críticos, que são pontos candidatos a serem pontos de máximo ou mínimo.

Por conta do Teorema de Fermat e tendo uma função F podemos definir esses pontos como sendo os pontos que satisfaçam a condição de f' = 0, ou seja, todo e qualquer ponto na qual a derivada da função seja zero, é um ponto crítico.

Por (teoricamente) retornar um conjunto de pontos possíveis, deve-se analisar cada um individualmente. Considerando a generalização dos pontos como n, temos algumas condições:

  • É ponto de máximo casos f''(n) < 0
  • É ponto de mínimo caso f''(n) > 0.

e.g.

% Pontos de máximos e mínimos para função de uma variável

% primeiros criamos uma função no qual fica melhor de se visualizar ambos os conceitos
func_um(x) = sin(x) + cos(x)

% primeiro encontramos os pontos críticos
% achamos a derivada de primeira ordem da função
d_func_um = diff(func_um)
% >> - sin(x) + cos(x)

% achamos os pontos que satisfazem a seguinte equação
% solutions = solve(d_func_um == 0)
% >> [(-3*pi)/4 ; pi/4]

% automatizar isso com fors e ifs
% verificamos condição de ponto de máximo ou de mínimo

% primeiro ponto
solutions(1) > 0
% >> False
solutions(1) < 0
% >> True

% segundo ponto
solutions(2) > 0
% >> True

% logo confirmamos que o primeiro ponto da matriz solução é ponto de mínimo e o segundo ponto é de máximo
% podemos confirmar isso plotando a função
ezplot(func_um)

Já no caso de mais de uma variável até o passo de achar a derivada (que no caso seriam as parcias) e igualar a 0 para achar os pontos críticos é o mesmo princípio, mudando só na hora de definir se é ponto de mínimo ou de máximo no qual é necessário que as derivadas de segunda ordem f''(x, y) existam e sejam diferentes de zero para poder se usar a matriz hessiana, que é nada menos que uma matriz quadrada dos derivadas parciais de segunda ordem nos pontos críticos. e.g

Para uma função f(x,y) definida no R2 -> R, e [a, b] como uma generalização das tuplas de soluções possíveis a matriz hessiana seria a seguinte:

diff(f([a,b]), x, 2) diff(f([a,b]), x, y)
diff(f([a,b]), y, x) diff(f([a,b]), y, 2)

Onde se teriam as seguintes condições:

  • H(f) > 0, é ponto de mínimo.
  • H(f) < 0, é ponto de máximo.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment