You are on page 1of 20

Notas de programa¸c˜ao em

Mathematica
Notas de apoio `as aulas de laborat´orio de An´alise Num´erica
Nuno Filipe Martins
Departamento de Matem´atica
Faculdade de Ciˆencias e Tecnologia, Universidade Nova de Lisboa
Notas de programa¸c˜ao em Mathematica 1
0. Informa¸c˜oes gen´ericas
Tal como acontece com qualquer outro programa, existem alguns preceitos elemen-
tares a ter em conta quanto ao funcionamento do sistema Mathematica que necessitam
de ser focados antes mesmo de o come¸carmos a usar. Conv´em assim referir e explicar
sucinta e simplificadamente o papel das duas componentes que constituem o sistema
Mathematica: o Notebook e o Kernel. O Notebook assemelha-se a um editor de texto e
tem portanto as caracter´ısticas mais importantes de um editor de texto, nomeadamente
escrever e editar texto e express˜oes, visualizar, gravar e imprimir resultados. Quando
o Mathematica ´e invocado, o Notebook fica automaticamente activo. Quando se pre-
tende avaliar uma express˜ao, ´e tamb´em necess´ario que o Kernel o esteja, pois ´e este
que processa e avalia as express˜oes escritas no Notebook. O Kernel ´e carregado e fica
activo aquando da primeira avalia¸ c˜ao e permanece activo at´e que se desligue o sistema
Mathematica ou o Kernel. O Kernel e o Notebook comunicam atrav´es de um processo
chamado MathLink.
Cada Notebook est´a organizado em c´elulas, delimitadas por um parˆentese recto no
lado direito da janela. As c´elulas de input podem avaliar-se premindo simultaneamente
as teclas shift e return.
As fun¸c˜ oes em Mathematica tˆem sempre a primeira letra capitalizada e o argumento
aparece entre parentesis rectos e n˜ao entre parentesis curvos. Em Mathematica, os
parentesis curvos est˜ao reservados para indicar o agrupamento de termos. Esta nota¸c˜ ao
tem algumas vantagens, pois na nota¸c˜ao usual c(1 + x) pode ser interpretado como
c ∗ (1 + x) ou como c[1 + x] (isto ´e n˜ao ´e claro que c se trata de uma constante ou de
uma fun¸c˜ ao). O quadro seguinte apresenta alguns exemplos de como passar da nota¸c˜ao
usual para a escrita em Mathematica.
Nota¸c˜ ao usual Escrita em Mathematica
sen(x), sin(x) Sin[x]
cos(x) Cos[x]
f(x, y) = x + y f[x_,y_]:=x+y
ln(x) Log[x]
log
a
(x) Log[a,x]
1
2 Notas de programa¸c˜ao em Mathematica
Tal como as fun¸c˜ oes, as express˜oes booleanas (de valor verdadeiro ou falso) s˜ao,
como veremos mais adiante, muito importantes. A tabela seguinte descreve a sintaxe
dos conectivos booleanos nega¸c˜ ao, conjun¸c˜ ao e disjun¸c˜ ao:
Escrita em Mathematica
Nega¸c˜ao !p ou Not[p]
Conjun¸c˜ ao p && q ou And[p,q]
Disjun¸c˜ ao p || q ou Or[p,q]
Quanto aos principais operadores de compara¸c˜ ao, a sua sintaxe ´e descrita na tabela
a seguir:
Escrita em Mathematica
Igual x == y ou Equal[x,y]
Diferente x != y ou Unequal[x,y]
Menor x < y ou Less[x,y]
Maior x > y ou Greater[x,y]
Menor ou igual x <= y ou LessEqual[x,y]
Maior ou igual x >= y ou GreaterEqual[x,y]
Note que o teste de igualdade ´e expresso por ”==”e n˜ao por ”=”. Este ´ ultimo operador
´e utilizado para atribui¸c˜ao de valor a uma vari´avel. Existe ainda um outro teste de
igualdade ”===”que iremos falar mais `a frente.
O Mathematica disp˜oe de um sistema de ajuda interactivo. Para obter informa¸c˜ ao
sobre uma determinada fun¸c˜ ao pode escever o comando ? antes da fun¸c˜ ao ou ent˜ao
aceder directamente ao sistema de ajuda primindo simultaneamente as teclas shift e
F1, onde para al´em de encontrar informa¸c˜ ao sobre uma determinada fun¸c˜ao pode ainda
encontrar v´arios exemplos de utiliza¸c˜ao da fun¸c˜ao.
2
Notas de programa¸c˜ao em Mathematica 3
1. Algumas fun¸c˜oes e comandos do sistema Mathematica
1.1 C´alculo num´erico
O Mathematica disp˜oe de uma enorme quantidade de constantes, opera¸c˜ oes e fun¸c˜ oes
matem´aticas pr´e definidas e permite ainda uma enorme precis˜ao nos c´alculos.
[In]:= ?N
N[expr] gives the numerical value of expr. N[expr, n] attempts to
give a result with n-digit precision.
[In]:= N[Pi]
[Out]= 3.14159
[In]:= N[Pi,100]
[Out]= 3.141592653589793238462643383279502884197169399375105820974944592
307816406286208998628034825342117068
[In]:= ?Precision
Precision[x] gives the number of digits of precision in the number
x.
[In]:= Precision[2]
[Out]= Infinity
[In]:= Precision[2.0]
[Out]= 16
1.2 Equa¸c˜oes, Somas e Limites
A resolu¸c˜ ao de equa¸c˜ oes pode ser obtida utilizando a fun¸c˜ ao Solve:
[In]:= f[x_]:=(x^2-1)*Exp[x] (* Define f *)
[In]:= ?Solve
Solve[eqns, vars] attempts to solve an equation or set of equations
for the variables vars. Solve[eqns, vars, elims] attempts to solve
the equations for vars, eliminating the variables elims.
[In]:= Solve[(x^2-1)*Exp[x]==0,x]
[Out]= {{x -> -1},{x -> 1}}
3
4 Notas de programa¸c˜ao em Mathematica
[In]:= Solve[Cos[x]==0,x]
Solve:: ifun : Inverse functions are being used by Solve, so some
solutions may not be found.
[Out]= {{x -> -Pi/2}, {x -> Pi/2}}
Tamb´em se podem calcular limites de fun¸c˜ oes, somas finitas e s´eries :
[In]:= Sum[i,{i,1,50}] (* Soma dos 50 primeiros naturais *)
[Out]= 1275
[In]:= Sum[i,{i,1,Infinity}]
Sum:: div : Sum does not converge.
[In]:= ?Limit
Limit[expr, x->x0] finds the limiting value of expr when x
approaches x0.
[In]:= Limit[Exp[x],{x->-Infinity}]
[Out]= {0}
[In]:= Limit[Exp[x],{x-> Infinity}]
[Out]= Infinity
1.3 Manipula¸c˜ao de polin´omios
Consideremos a fun¸c˜ ao polinomial p(x) = x
3
+ 8x
2
+ 20x + 16.
[In]:= p[x_]:=x^3+8 x^2+20 x+16 (* Define p(x) *)
[In]:= p[2]
[Out]= 96
[In]:= p[a]
[Out]= 16 + 20 a + 8 a^2 + a^3
[In]:= ?Factor
Factor[poly] factors a polynomial over the integers.
Factor[poly, Modulus->p] factors a polynomial modulo a prime p.
Factor[poly, Extension->{a1, a2, ... }] factors a polynomial
allowing coefficients that are rational combinations of the
4
Notas de programa¸c˜ao em Mathematica 5
algebraic numbers ai.
[In]:= Factor[p[x]] (* Factoriza p(x) *)
[Out]= (2 + x)^2(4 + x)
[In]:= Integrate[p[x],x] (* Calcula uma primitiva de p *)
[Out]= 16 x + 10 x^2 + 8 x^3/3 + x^4/4
[In]:= D[%,x] (* Deriva a primitiva de p *)
[Out]= 16 + 20 x + 8 x^2 + x^3
[In]:= ?D
D[f, x] gives the partial derivative of f with respect to x.
D[f,{x, n}] gives the nth partial derivative of f with respect
to x. D[f, x1, x2, ... ] gives a mixed derivative.
[In]:= Simplify[p[x]] (* Simplifica p(x) *)
[Out]= (2 + x)^2(4 + x)
[In]:= Solve[p[x]==0, x] (* Determina os zeros de p(x) *)
[Out]= {{x->-4},{x->-2},{x->-2}}
1.4 Gera¸c˜ao de gr´aficos
(* Desenha o gr´afico de cos(x)*sin(x) em [-2Pi,2Pi] *)
[in]:= Plot[ Cos[x] Sin[x], {x, -2Pi, 2Pi}]
[out]=
-6 -4 -2 2 4 6
-0.4
-0.2
0.2
0.4
(* Gr´aficos tridimensionais *)
[in]:= Plot3D[Cos[x]Sin[y],{x,-Pi,Pi},{y,-2 Pi,2 Pi}]
5
6 Notas de programa¸c˜ao em Mathematica
[out]=
-2
0
2
-5
0
5
-1
-0.5
0
0.5
1
-2
0
2
[in]:= ParametricPlot3D[
{Cos[t] (2 + Cos[u]), Sin[t] (2 + Cos[u]), Sin[u]},
{t, 0, 2Pi}, {u, 0, 2Pi},PlotPoints->40]
[out]=
-2
0
2
-2
0
2
-1
-0.5
0
0.5
1
-2
0
2
2. Listas, Vectores e Matrizes
As listas s˜ao uma das constru¸c˜ oes mais utilizadas nas linguagens de programa¸c˜ao. A
sua utiliza¸c˜ ao torna poss´ıvel agrupar e manipular colec¸c˜oes de objectos, representando-
os como sequˆencias de elementos. Grande parte da informa¸c˜ao com que lidaremos na
cadeira de An´alise Num´erica ter´a que ser representada no Mathematica recorrendo a
listas. A utiliza¸c˜ ao e manipula¸c˜ ao de listas no Mathematica ´e simples e eficiente, pois
sobre elas est´a dispon´ıvel um vasto leque de opera¸c˜ oes pr´e-definidas. O Mathematica
6
Notas de programa¸c˜ao em Mathematica 7
permite ainda uma grande flexibilidade na cria¸c˜ ao de listas, podendo-se ter listas de
quase tudo !
O exemplo mais simples e que utilizaremos com mais frequˆencia ser´a porventura o das
listas constituidas apenas por n´ umeros :
Estes poder˜ao ser, por exemplo, valores de dada fun¸c˜ ao em determinados pontos, ou
simplesmente as coordenadas de um ponto. Por exemplo, costuma-se escrever p = (3, 5)
para indicar que as coordenadas do ponto p s˜ao 3 e 5. Em Mathematica escrevemos
[in]:= p={3,5}
[out]= {3,5}
Se pretendessemos obter apenas a segunda coordenada (ou seja, o segundo elemento da
lista) escreveriamos
[in]:= p[[2]]
e obteriamos como resposta
[out]= 5
Existe uma fun¸c˜ao que permite construir uma lista cujos elementos podem-se obter a
partir de uma dada f´ormula. A fun¸c˜ ao chama-se Table[ ]. Vejamos como podemos
utilizar esta fun¸c˜ ao para gerar, por exemplo, um vector cujos elementos s˜ao os cinco
primeiros n´ umeros primos:
[in]:= Table[Prime[i],{i,1,5}]
[out]= {2,3,5,7,11}
O Mathematica usa a mesma ideia de lista para lidar com matrizes. A ideia consiste
em olhar, por exemplo, para uma matriz do tipo 2 × 2 como uma lista de duas linhas,
onde cada linha ´e uma lista de duas entradas num´ericas.
7
8 Notas de programa¸c˜ao em Mathematica
[in]:= A={{a,b},
{c,d}}
[out]= {{a,b},{c,d}}
Para escrever A com o aspecto usual de uma matriz usariamos
[in]:= MatrixForm[A] (* ou A //MatrixForm *)
[out]=
_
a b
c d
_
A multiplica¸c˜ ao de matrizes requer um ponto em vez do habitual *, pois o Mathematica
assume que o produto (com * ou com um espa¸co) seja comutativo.
[in]:= MatrixForm[B={{1,11},{x,-3}}]
[out]=
_
1 11
x −3
_
[in]:= MatrixForm[B . A]
[out]=
_
a + 11c b + 11d
−3c + ax −3d + bx
_
Para al´em das muitas opera¸c˜ oes sobre listas, est˜ao tamb´em dispon´ıveis v´arias opera¸c˜oes
espec´ıficas sobre vectores e matrizes. Em seguida, ilustram-se algumas delas:
[in]:= Det[B] (* Calcula o determinante da matriz B *)
[out]= -3-11x
[in]:= IdentityMatrix[2]
[out]= {{1,0},{0,1}}
[in]:= NullSpace[{{1,1,1}{2,2,2}}]
[out]= {{-1,0,1}{-1,1,0}}
8
Notas de programa¸c˜ao em Mathematica 9
Note-se que
_
_
−1 0 1
¸
T
,
_
−1 1 0
¸
T
_
´e uma base do subespa¸co vectorial
E = {X ∈ M
3×1
| AX = 0} ⊆ M
3×1
.
´
E tamb´em poss´ıvel obter uma caracteriza¸c˜ ao para E :
Solve[{{1,1,1}{2,2,2}}.{x,y,z}=={0,0},{x,y,z}]
Que origina a seguinte mensagem
Solve::Svars:
Equations may not give solutions for all "solve" variables.
{{x->-y-z}}
Ou seja o sistema anterior ´e poss´ıvel e indeterminado e
E =
_
_
x y z
¸
T
∈ M
3×1
| x = −y −z
_
.
Verifiquemos que, por exemplo, (1, −2, 1) ´e uma solu¸c˜ ao do sistema anterior :
[in]:= {{1,1,1},{2,2,2}}.{1,-2,1}
[out]= {0,0}
ou, de outra forma
[in]:= {{1,1,1},{2,2,2}}.{1,-2,1}=={0,0}
[out]= true
Regressemos ao operador Table[ ] . Vimos anteriormente um exemplo de como obter
um vector cujos elementos obedeciam a uma determinada regra (naquele caso, eram os
5 primeiros n´ umeros primos). De forma an´aloga, podemos pensar no mesmo tipo de
constru¸c˜ oes para matrizes bidimensionais, tridimensionais, . . ., n dimensionais.
Por exemplo :
Suponhamos que se pretendia escrever as entradas de uma qualquer matriz A do tipo
3 ×3, sim´etrica, isto ´e tal que A = A
T
. Ora, se fˆor A = [a
ij
]
1≤i,j≤3
ent˜ao
[in]:= A=Table[a[i,j]=a[j,i],{i,3},{j,3}]
[out]= {{a[1,1],a[2,1],a[3,1]},{a[2,1],a[2,2],a[3,2]},{a[3,1],a[3,2],
a[3,3]}}
9
10 Notas de programa¸c˜ao em Mathematica
Matricialmente
MatrixForm[A]
_
_
a[1, 1] a[2, 1] a[3, 1]
a[2, 1] a[2, 2] a[3, 2]
a[3, 1] a[3, 2] a[3, 3]
_
_
Exerc´ıcio 1. Considere as seguintes matrizes :
A=Table[If[i<j,1,0],{i,1,3},{j,1,3}]
B=Table[If[i<j,1,0],{j,1,3},{i,1,3}]
C=Table[Switch[Abs[i-j],1,c[i,j],0,0,_,1],{i,1,4},{j,1,4}]]
Sem avaliar no Mathematica, determine as matrizes A, B e C.
Confirme agora os resultados obtidos utilizando o Mathematica.
3. Defini¸c˜ao de fun¸c˜oes
Tal como acontecia no caso anterior das listas, o Mathematica tamb´em possui um
enorme n´ umero de fun¸c˜ oes pr´e definidas. No entanto teremos necessidade de, ao longo
do curso, definir as nossas pr´oprias fun¸c˜ oes que poder˜ao n˜ao estar dispon´ıveis no leque
de fun¸c˜ oes iniciais do Mathematica. Embora existam v´arias formas de definir fun¸c˜ oes
no Mathematica, ser´a aqui abordada aquela que mais se assemelha `a escrita usual em
matem´atica.
Suponha-se que se pretende definir a fun¸c˜ao real de vari´ avel real f : R −→ R definida
por f(x) = cos(x). No Mathematica poderiamos definir f do seguinte modo:
f[x_]:=Cos[x]
Mais ´a frente veremos a diferen¸ca entre definir uma fun¸c˜ao com ”=”e com ”:=”. Por
agora, concentremo-nos nos argumentos das fun¸c˜ oes. A defini¸c˜ao anterior especifica
que quando o Mathematica encontra uma express˜ao que coincide com f[x_] dever´ a
substitui-la por Cos[x]. O underscore ” ” serve precisamente para indicar a vari´avel
10
Notas de programa¸c˜ao em Mathematica 11
independente. Se se tivesse definido f[x]:=Cos[x] ent˜ ao apenas f[x] seria substituido
por Cos[x], o mesmo n˜ao acontecendo por exemplo a f[y]. Para clarificar melhor esta
situa¸c˜ ao vejamos esta diferen¸ca em termos de escrita matem´atica:
Defini¸c˜ao no Mathematica Escrita em matem´atica
f[x_]:=Cos[x] f(x) = cos(x), ∀x ∈ R
f[x]:=Cos[x] f(x) = cos(x)
Note que para definir a fun¸c˜ ao f no Mathematica n˜ao foi necess´ario indicar os con-
juntos de partida e de chegada. Por isto, diz-se que o Mathematica ´e uma linguagem
sem declara¸c˜ao de tipos.
Ilustremos agora com um exemplo a diferen¸ca entre ”=”(atribui¸c˜ao imediata) e
”:=”(atribui¸c˜ ao diferida) na defini¸c˜ao de fun¸c˜oes :
Considere-se a fun¸c˜ ao m[x_]:=Max[x].
[In]:= m[x_]:=Max[x]
[In]:= ?m
Global ’m
m[x_]:=Max[x]
Defina-se agora uma nova fun¸c˜ ao mi[x_]=Max[x]
[In]:= mi[x_]=Max[x] ;
[In]:= ?mi
Global ’mi
mi[x_]=x
Neste ´ ultimo caso, a express˜ao atribuida Max[x] ´e avaliada (obtendo-se x) e este resul-
tado ´e que ´e associado a mi[x_].
Estes s˜ao alguns dos preceitos ”b´asicos”a ter em conta quando pretendermos definir
uma fun¸c˜ ao. De seguida vamos ver alguns exemplos ilustrativos da potencialidade des-
te tipo de ferramentas que, de uma forma simples permite-nos definir, por exemplo
fun¸c˜ oes n˜ao triviais noutras linguagens de programa¸c˜ ao.
11
12 Notas de programa¸c˜ao em Mathematica
Exemplo 1. Consideremos a fun¸c˜ao de Heaviside h definida por:
h(x) :=
_
_
_
1 se x > 0
1
2
se x = 0
0 se x < 0
No Mathematica poderiamos definir a fun¸c˜ ao de Heaviside por
h[x_]=If[x<0,0,If [x>0,1,1/2]]
Exemplo 2. Vejamos como definir uma fun¸c˜ao deriv[fun¸c˜ao, vari´avel ] com algumas
das propriedades do operador de deriva¸c˜ao :
Escrita em matem´atica Defini¸c˜ao no Mathematica
(f + g)

(x) = f

(x) + g

(x) deriv[f_+g_,x_]:=deriv[f,x]+deriv[g,x]
(fg)

(x) = f(x)g

(x) + g(x)f

(x) deriv[f_ g_,x_]:=f deriv[g,x]+g deriv[f,x]
f

(x) = 1 se f(x) = x deriv[x_,x_]:=1
(x
n
)

= nx
n−1
deriv[x_^n_,x_]:=n x^(n-1)
f

(x) = ae
ax+b
se f(x) = e
ax+b
deriv[Exp[a_ x_+b_],x_]:=aExp[a x+b]
f

(x) = 0 se f(x) = c deriv[c_,x_]:=0 /; FreeQ[c,x]
Exerc´ıcio 2. Transcreva as defini¸c˜ oes anteriores para um ficheiro ”notebook”do Mathe-
matica.
Altere o ficheiro anterior de modo que :
• seja poss´ıvel calcular a derivada da fun¸c˜ ao logaritmo.
• seja poss´ıvel calcular a derivada da fun¸c˜ ao composta.
Repare que neste exemplo as sucessivas atribui¸c˜oes deriv[ ] n˜ao revogam as ante-
riores. Este tipo de situa¸c˜ ao pode ser uma fonte de erros e de confus˜oes, se n˜ao houver
cuidado, como podemos ver no seguinte caso:
[In]:= i[_]:=Log[x]
[In]:= i[2]
[Out]= Log[x]
[In]:= i[x_]:=Log[x]
[In]:= i[2]
[Out]= Log[x]
12
Notas de programa¸c˜ao em Mathematica 13
[In]:= ?i
Global ’i
i[_]:= Log[x]
i[x_]:= Log[x]
Nesta situa¸c˜ao, o melhor a fazer ´e apagar todas a regras associadas a i e introduzir
apenas a que nos interessa:
[In]:= Clear[i]
[In]:= i[x_]:=Log[x]
[In]:= ?i
Global ’i
i[x_]:= Log[x]
Exerc´ıcio 3. (Problema de Collatz) Considere a aplica¸c˜ao f : N −→N definida por
f(n) =
_
n
2
se n ´e par
3n + 1 se n ´e ´ımpar
Existe uma conjectura que diz que aplicando iterativamente f, a qualquer que seja o
valor inicial de n, existe um k
n
∈ N tal que f
kn
(n) = 1
1
.
Utilize o Mathematica para testar a conjectura, mais concretamente, defina a fun¸c˜ao f,
arbitre um valor para n e teste v´arios valores k
n
at´e que f
kn
(n) = 1.
Sugest˜ao: Utilize as fun¸c˜oes EvenQ[ ] e Nest[ ].
1
Nota: f
k
n
= f ◦ . . . ◦ f
. ¸¸ .
k
n
vezes
.
13
14 Notas de programa¸c˜ao em Mathematica
Exerc´ıcios
1. Considere o espa¸co vectorial real R
3
e f : R
3
−→R
3
a aplica¸c˜ ao definida por
f(x, y, z) = (x + y, y + z, z).
Utilize o Mathematica para:
a) Mostrar que
i) f ´e uma aplica¸c˜ ao linear.
ii) B = ((1, 1, 1), (0, 1, 2), (1, 1, 0)) ´e uma base de R
3
.
b) Determinar A = M(f; B, B).
c) Calcular os valores pr´oprios da matriz A
2
da al´ınea b).
Sugest˜ao: Relembre que os valores pr´oprios de A s˜ao precisamente os zeros
reais do polin´omio caracter´ıstico p(λ) = |A − λI
3
|.
d) Determinar, para cada valor pr´oprio λ, de A, uma base do subespa¸co pr´oprio
associado
E
λ
=
_
X ∈ R
3
| AX = λX
_
.
2. Considere a fun¸c˜ ao f : N −→R definida por
f(n) =
n−1

k=0
(−1)
k
2k + 1
.
Sabendo que
π
4
=

k=0
(−1)
k
2k + 1
, utilize o Mathematica para calcular um valor apro-
ximado de π considerando n termos do desenvolvimento em s´erie (n definido pelo
utilizador).
2
Recorde que, dada uma matriz A ∈ M
n×n
(R), diz-se que λ ∈ R ´e um valor pr´oprio de A se existir
um vector X ∈ M
n×1
(R) n˜ao nulo tal que AX = λX.
14
Notas de programa¸c˜ao em Mathematica 15
Utilize o Mathematica para :
3. Calcular e imprimir o termo de ordem n da sucess˜ao de Fibonacci, definida por
_
_
_
x
0
= 1
x
1
= 1
x
k+1
= x
k
+ x
k−1
, k ∈ N
(n definido pelo utilizador).
4. Dada uma matriz A = [a
ij
] ∈ M
n×m
(C) (introduzida pelo utilizador) calcular
A

:= max
i=1,...,n
m

j=1
|a
ij
| .
5. Calcule a soma dos n primeiros termos da sucess˜ao definida por
_
_
_
x
0
= 3.5
x
n+1
= x
n

x
2
n
− 16
2x
n
, n ∈ N
0
.
4. Composi¸c˜ oes iterativas
Nesta sec¸c˜ ao iremos ver algumas das constru¸c˜ oes que permitem executar repetida-
mente uma certa ac¸c˜ ao enquanto uma condi¸c˜ao ´e verdadeira. As constru¸c˜ oes que aqui
abordaremos s˜ao decerto j´a conhecidas no contexto de programa¸c˜ ao em outras lingua-
gens. S˜ao elas, os ciclos While, Do e For.
Comecemos pela composi¸c˜ao iterativa While.
Esta composi¸c˜ ao tem como forma While[condi¸c˜ao,ac¸c˜ao].
Exemplo 3.
[In]:= x=2 ;
While[x<8,x=x+2]
Print[x] (* Imprime o maior par menor ou igual a 8 *)
[Out]= 8
[In]:= y=2;
15
16 Notas de programa¸c˜ao em Mathematica
While[x<=10 && y<=15,Print[y];x=x+1;y=3 y] (* Imprime todos os va-
2 lores de y enquanto
6 x<=10 e y<=15 (repare
que o valor inicial
de x ´e 8)
*)
Composi¸c˜ ao iterativa Do.
[In]:= ?Do
Do[expr, {imax}] evaluates expr imax times. Do[expr, {i, imax}]
evaluates expr with the variable i successively taking on the va-
lues 1 through imax (in steps of 1). Do[expr, {i, imin, imax}]
starts with i = imin. Do[expr,{i,imin, imax, di}] uses steps di.
Do[expr, {i,imin, imax}, {j, jmin,jmax},... ] evaluates expr
looping over different values of j, etc. for each i.
Exemplo 4.
[In]:= sum=0 ;
Do[sum=sum+i,{i,1,500}] (* soma os 500 primeiros naturais *)
Print[sum]
[Out]= 125250
Composi¸c˜ ao iterativa For.
[In]:= ?For
For[start, test, incr, body] executes start, then repeatedly eva-
luates body and incr until test fails to give True.
Exemplo 5.
[In]:= For[i=1,i<4,i++,Print[i]] (* Imprime os tr^es primeiros naturais *)
1
2
3
16
Notas de programa¸c˜ao em Mathematica 17
Exemplo 6. Vejamos um exemplo um pouco mais complicado
[In]:= Clear[x];
For[i=1;t=x,i<4,i++,t=t+i;Print[t]]
1+x
3+x
6+x
Estas ferramentas j´a nos permitem come¸car a programar em Mathematica alguns algo-
ritmos mais elaborados. Em particular, estamos em condi¸c˜oes de come¸car a programar
os algoritmos com que nos depararemos ao longo da disciplina de An´alise Num´erica.
Mas antes de entrarmos na An´alise Num´erica, vejamos mais uns exemplos elucidativos
do modo como podemos utilizar as ferramentas que j´a possuimos:
Exemplo 7. Uma matriz A do tipo n × m diz-se de diagonal principal dominante em
sentido estrito se,
|a
ii
| >
m

j=1
j=i
|a
ij
| , ∀i = 1, . . . , n.
Vamos construir uma fun¸c˜ ao diagonal[matriz ] que permite testar se uma dada matriz
´e ou n˜ao de diagonal dominante em sentido estrito.
[In]:= Clear[cont];
cont=0;
diagonal[A_]:=( For[i=1,i<=Dimensions[A][[1]],i++,
If[A[[i,i]]<=
Sum[Abs[A[[i,j]]],{j,1,Dimensions[A][[2]]}]-
Abs[A[[i,i]]], cont=1 ]];
If[cont==1,"Nao ´e de diagonal estritamente dominan-
te", "
´
E de diagonal estritamente dominante" ] )
Utilizemos a fun¸c˜ ao anterior para averiguar se a matriz
A =
_
1 2
2 3
_
´e de diagonal principal dominante em sentido estrito
17
18 Notas de programa¸c˜ao em Mathematica
[In]:= A={{1,2},{2,3}} ;
diagonal[A]
[Out]= Nao ´e de diagonal estritamente dominante
Exemplo 8. (Algoritmo de Euclides) Sejam a, b ∈ Z n˜ao nulos. Sabe-se que nestas
condi¸c˜ oes existe o mdc(a, b) e o algoritmo de Euclides permite calcul´a-lo. Vejamos
como:
A ideia consiste em aplicar sucessivamente o teorema da divis˜ao, do seguinte modo:
a = bq + r
0
b = r
0
q
0
+ r
1
r
0
= r
1
q
1
+ r
2
.
.
.
r
n−2
= r
n−1
q
n−1
+ r
n
r
n−1
= r
n
q
n
+ 0
Ent˜ ao mdc(a, b)= r
n
. Vamos construir uma fun¸c˜ ao mdc[a,b] que devolve o m´aximo
divisor comum entre dois inteiros n˜ao nulos a e b:
[In]:= Clear[mdc,a,b,m,n,r,]
mdc[a_Integer /; a!=0,b_Integer/; b!=0]:= ( m=a;n=b;r=Mod[m,n];
While[r !=0,
m=n;
n=r;
r=Mod[m,n]];
n )
Assim,
[In]:= mdc[5,15]
[Out]= 5
Tamb´em se poderia confirmar o resultado anterior utilizando a fun¸c˜ ao pr´e definida
GCD[ ].
Exerc´ıcio 4. Uma matriz A = [a
ij
] ∈ M
n×m
(K) diz-se diagonal se a
ij
= 0, ∀i = j.
Elabore um algoritmo que permita decidir se uma dada matriz ´e ou n˜ao diagonal.
18
Notas de programa¸c˜ao em Mathematica 19
Referˆencias
Jos´e Carmo, Am´ılcar Sernadas, Cristina Sernadas, F. Miguel Dion´ısio, Carlos Ca-
leiro, Introdu¸c˜ao `a programa¸c˜ao em Mathematica, IST Press, 1999.
Stephen Wolfram, The Mathematica Book 3rd ed., Wolfram Media, Cambridge Uni-
versity Press, 1996.
19