Introdução à Física Computacional I (2022.2)

Aula 2: manipulação algébrica; funções definidas pelo usuário; gráficos simples

Transformando expressões algébricas

Existem muitas funções no Mathematica para manipulação de expressões algébricas. Vamos listar aqui algumas delas, através de exemplos.

expr1 = (x-1)^2 *(2*x+7)*(5*x-3);
Expand[expr1] (* Expande todos os produtos e potências positivas *)

expr2=(x-1)^4*(5*x-3)^3*(3*x^2+4*x-5);
Expand[expr2]

Factor[expr2/expr1] (* Fatora completamente o argumento *)

expr3=(5*x^2-4*x+16)/((x^2-x+1)^2*(x-3));
Apart[expr3] (* Decompõe em frações parciais *)

expr4 = (y^2-5*y+4)/(y-1);
Cancel[expr4] (* Cancela fatores comuns *)

Factor[y^2-5*y+4]

Simplificando expressões

A função Simplify busca simplificar expressões algébricas, mas nem sempre atua da forma como desejamos, e é preciso recorrer a outras funções ou a opções adicionais.

expr5 = 1/(x^2-16)-(x+4)/(x^2-3*x-4)

Simplify[expr5]

Together[expr5] (* Combina frações *)

A função Simplify aplica diversas transformações em busca da forma mais simples para uma expressão. Ainda mais transformações são aplicadas pela função FullSimplify, cuja execução, no entanto, pode demorar bem mais.

expr6=(Sqrt[(2+x)/(7+x)]*Sqrt[(3-x^2)/(25-x^2)]*Sqrt[(5+x)*(2-x)])/(Sqrt[4-x^2]*Sqrt[3-x^2])

Simplify[expr6]

FullSimplify[expr6]

Algumas simplificações podem ser alcançadas indicando suposições, que são dadas como segundo argumento da função Simplify (ou de outras funções de manipulação algébrica).

expr7=Sqrt[x^2];
Simplify[expr7]

Simplify[expr7,x>0] (* Supondo que x é positivo *)

Simplify[expr7,x∈Reals] (* Supondo que x é um número real *)

Simplify[Log[x^r]]

Simplify[Log[x^r],x>0]

A função logaritmo é multivalorada se o argumento é complexo, de modo que, para obter a simplificação, temos que garantir que o argumento seja real. Para isso, usamos a construção abaixo:

Simplify[Log[x^r],x>0 && r∈Reals]

Note que combinamos duas suposições (de que x é positivo e de que r pertence ao conjunto dos números reais) usando o operador lógico && (“e”). É uma construção que lembra bastante a notação matemática “escrita à mão”.

Funções intrínsecas que aceitam suposições, como Simplify, podem também ser invocadas como argumento da função intrínseca Assuming, cuja sintaxe é exemplificada abaixo:

Assuming[x>0,Simplify[Sqrt[x^2]]]

Assuming[x>0 && r∈Reals,Simplify[Log[x^r]]]

Transformando expressões trigonométricas

Para manipular expressões contendo funções trigonométricas, o Mathematica dispões de funções intrínsecas específicas. Os exemplos a seguir ilustram algumas delas:

TrigExpand[Cos[2*θ]] (* Expande em uma soma de termos *)

TrigReduce[Sin[θ]*Cos[θ]] (* Aplica identidades envolvendo múltiplos de ângulos *)

TrigFactor[Cos[2*θ]] (* Fatora em um produto de termos *)

Outras funções intrínsecas úteis nesse contexto são as seguintes:

ComplexExpand[Cos[a+I*b]] (* Expande supondo que quaisquer variáveis são reais *)

ExpToTrig[Exp[I*θ]] (* Converte exponenciais em funções trigonométricas *)

Encontrar a função do Mathematica que produz a melhor simplificação para os seus objetivos pode ser bem complicado!

Funções definidas pelo usuário

Além das muitas funções intrínsecas do Mathematica, você também pode definir suas próprias funções, usando a construção mostrada no exemplo a seguir.

f[x_]:=x+x^2

Há dois pontos a destacar aqui:

o argumento da função, na definição, é escrito seguido por uma “sublinha”, que indica que se trata de um argumento arbitrário, e não de uma variável x cujo valor tenha sido atribuído anteriormente;

a definição da função foi feita com “:=” em vez de uma igualdade simples, o que indica uma atribuição retardada, em que o cálculo é feito apenas quando a função for invocada.

Atribuição retardada

Para ver o efeito da atribuição retardada, considere o exemplo a seguir:

k=10;
g[x_]=x+k*x^2; (* Note a ausência dos dois pontos na atribuição *)
h[x_]:=x+k*x^2; (* Note a presença dos dois pontos na atribuição *)

g[2]-h[2]

k=3;
g[2]-h[2]

Qual é a diferença entre g[x] e h[x]?

E um segundo exemplo, agora sem que definamos uma função:

b=3;
a=b;
c:=b;
a-c

b=4;
a-c

Substituições

Um recurso muito útil do Mathematica é a atribuição temporária oferecida pelo operador de substituição “/.” (sem as aspas). Vamos limpar a variável k,

Clear[k]

e redefinir a função f[x] como

f[x_]:=x+k*x^2

Formalmente, f[x] é função apenas de x, mas, enquanto k não for definido, claramente não é possível obter um valor puramente numérico para f[x]:

N[f[1]]

O operador “/.” (também chamado de ReplaceAll) permite atribuir valores temporários a variáveis:

N[f[1]/.k-> 1/2]

Note a sintaxe que se segue ao operador “/.”: a atribuição temporária é feita não por meio da igualdade, mas pelo sinal “->” (obtido no modo de input pela sequência “->”).

Se agora consultarmos o valor de k, veremos que continua não estando atribuído:

k

Para mais um exemplo, vamos limpar as variáveis a, b e c,

Clear[a,b,c]

e redefinir mais uma vez a função f[x] como

f[x_]:=a*x^2+b*x+c

f[1]

A atribuição de valores temporários para a, b e c é feita pela sintaxe abaixo:

f[1]/.{a-> 1,b-> 2,c-> -1/2}

Note que a atribuição de mais de uma variável é feita entre chaves. Mais à frente, veremos que valores entre chaves definem uma lista, um importante tipo de estrutura de dados em muitas linguagens de programação.

Você pode definir uma “variável” para armazenar as atribuições temporárias, como no exemplo a seguir:

subs={a-> 1,b-> 2,c-> -1/2}

f[1]/.subs

Uma forma alternativa de usar substituições envolve explicitamente a função ReplaceAll:

ReplaceAll[f[1],{a-> 1,b-> 2,c-> -1/2}]

Vou preferir a forma anterior, com “/.”, que não me parece induzir confusão e é mais compacta.

Introdução às capacidades gráficas

A produção de gráficos no Mathematica pode ser feita de forma direta através da função Plot (e suas variantes que exploraremos em aulas futuras):

Plot[Sin[Pi*x],{x,0,10}]

Note a sintaxe: o primeiro argumento de Plot é a função cujo gráfico queremos produzir, e o segundo argumento (entre chaves) indica a variável que servirá de abscissa, seu valor inicial e seu valor final no gráfico.

Um segundo exemplo, utilizando substituições:

Plot[f[x]/.{a-> 1,b-> 2,c-> -1/2},{x,-5,5}]

E se quisermos mais de um gráfico no mesmo conjunto de eixos?

Plot[{Sin[π*x],Cos[π*x]},{x,0,10}]

Note que as funções a traçar devem estar entre chaves.

Em aulas futuras, vamos explorar opções na linguagem Wolfram para dar uma aparência mais profissional aos gráficos e como traçar outros tipos de gráficos.

Para a próxima aula

A primeira lista de exercícios para nota está disponível na aba “Listas de exercício” do E-disciplinas. A entrega deve ser feita até as 23h55 do dia 5 de setembro.