Mathematica

20

Click here to load reader

Transcript of Mathematica

Page 1: Mathematica

Notas de programacao emMathematica

Notas de apoio as aulas de laboratorio de Analise Numerica

Nuno Filipe Martins

Departamento de Matematica

Faculdade de Ciencias e Tecnologia, Universidade Nova de Lisboa

Page 2: Mathematica

Notas de programacao em Mathematica 1

0. Informacoes genericas

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 comecarmos a usar. Convem 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 expressoes, visualizar, gravar e imprimir resultados. Quando

o Mathematica e invocado, o Notebook fica automaticamente activo. Quando se pre-

tende avaliar uma expressao, e tambem necessario que o Kernel o esteja, pois e este

que processa e avalia as expressoes escritas no Notebook. O Kernel e carregado e fica

activo aquando da primeira avaliacao e permanece activo ate que se desligue o sistema

Mathematica ou o Kernel. O Kernel e o Notebook comunicam atraves de um processo

chamado MathLink.

Cada Notebook esta organizado em celulas, delimitadas por um parentese recto no

lado direito da janela. As celulas de input podem avaliar-se premindo simultaneamente

as teclas shift e return .

As funcoes em Mathematica tem sempre a primeira letra capitalizada e o argumento

aparece entre parentesis rectos e nao entre parentesis curvos. Em Mathematica, os

parentesis curvos estao reservados para indicar o agrupamento de termos. Esta notacao

tem algumas vantagens, pois na notacao usual c(1 + x) pode ser interpretado como

c ∗ (1 + x) ou como c[1 + x] (isto e nao e claro que c se trata de uma constante ou de

uma funcao). O quadro seguinte apresenta alguns exemplos de como passar da notacao

usual para a escrita em Mathematica.

Notacao 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]

loga(x) Log[a,x]

1

Page 3: Mathematica

2 Notas de programacao em Mathematica

Tal como as funcoes, as expressoes booleanas (de valor verdadeiro ou falso) sao,

como veremos mais adiante, muito importantes. A tabela seguinte descreve a sintaxe

dos conectivos booleanos negacao, conjuncao e disjuncao:

Escrita em Mathematica

Negacao !p ou Not[p]

Conjuncao p && q ou And[p,q]

Disjuncao p || q ou Or[p,q]

Quanto aos principais operadores de comparacao, 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 nao por ”=”. Este ultimo operador

e utilizado para atribuicao de valor a uma variavel. Existe ainda um outro teste de

igualdade ”===”que iremos falar mais a frente.

O Mathematica dispoe de um sistema de ajuda interactivo. Para obter informacao

sobre uma determinada funcao pode escever o comando ? antes da funcao ou entao

aceder directamente ao sistema de ajuda primindo simultaneamente as teclas shift e

F1 , onde para alem de encontrar informacao sobre uma determinada funcao pode ainda

encontrar varios exemplos de utilizacao da funcao.

2

Page 4: Mathematica

Notas de programacao em Mathematica 3

1. Algumas funcoes e comandos do sistema Mathematica

1.1 Calculo numerico

O Mathematica dispoe de uma enorme quantidade de constantes, operacoes e funcoes

matematicas pre definidas e permite ainda uma enorme precisao nos calculos.

[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 Equacoes, Somas e Limites

A resolucao de equacoes pode ser obtida utilizando a funcao 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

Page 5: Mathematica

4 Notas de programacao 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}}

Tambem se podem calcular limites de funcoes, somas finitas e series :

[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 Manipulacao de polinomios

Consideremos a funcao polinomial p(x) = x3 + 8x2 + 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

Page 6: Mathematica

Notas de programacao 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 Geracao de graficos

(* Desenha o grafico 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

(* Graficos tridimensionais *)

[in]:= Plot3D[Cos[x]Sin[y],{x,-Pi,Pi},{y,-2 Pi,2 Pi}]

5

Page 7: Mathematica

6 Notas de programacao 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 sao uma das construcoes mais utilizadas nas linguagens de programacao. A

sua utilizacao torna possıvel agrupar e manipular coleccoes de objectos, representando-

os como sequencias de elementos. Grande parte da informacao com que lidaremos na

cadeira de Analise Numerica tera que ser representada no Mathematica recorrendo a

listas. A utilizacao e manipulacao de listas no Mathematica e simples e eficiente, pois

sobre elas esta disponıvel um vasto leque de operacoes pre-definidas. O Mathematica

6

Page 8: Mathematica

Notas de programacao em Mathematica 7

permite ainda uma grande flexibilidade na criacao de listas, podendo-se ter listas de

quase tudo !

O exemplo mais simples e que utilizaremos com mais frequencia sera porventura o das

listas constituidas apenas por numeros :

Estes poderao ser, por exemplo, valores de dada funcao 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 sao 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 funcao que permite construir uma lista cujos elementos podem-se obter a

partir de uma dada formula. A funcao chama-se Table[ ]. Vejamos como podemos

utilizar esta funcao para gerar, por exemplo, um vector cujos elementos sao os cinco

primeiros numeros 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 numericas.

7

Page 9: Mathematica

8 Notas de programacao 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 bc d

)

A multiplicacao de matrizes requer um ponto em vez do habitual *, pois o Mathematica

assume que o produto (com * ou com um espaco) seja comutativo.

[in]:= MatrixForm[B={{1,11},{x,-3}}]

[out]=

(1 11x −3

)

[in]:= MatrixForm[B . A]

[out]=

(a + 11c b + 11d−3c + ax −3d + bx

)

Para alem das muitas operacoes sobre listas, estao tambem disponıveis varias operacoes

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

Page 10: Mathematica

Notas de programacao em Mathematica 9

Note-se que{[ −1 0 1

]T,[ −1 1 0

]T}

e uma base do subespaco vectorial

E = {X ∈ M3×1 | AX = 0} ⊆ M3×1.

E tambem possıvel obter uma caracterizacao 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 ∈ M3×1 | x = −y − z

}.

Verifiquemos que, por exemplo, (1,−2, 1) e uma solucao 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 numeros primos). De forma analoga, podemos pensar no mesmo tipo de

construcoes para matrizes bidimensionais, tridimensionais, . . ., n dimensionais.

Por exemplo :

Suponhamos que se pretendia escrever as entradas de uma qualquer matriz A do tipo

3× 3, simetrica, isto e tal que A = AT. Ora, se for A = [aij]1≤i,j≤3 entao

[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

Page 11: Mathematica

10 Notas de programacao 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. Definicao de funcoes

Tal como acontecia no caso anterior das listas, o Mathematica tambem possui um

enorme numero de funcoes pre definidas. No entanto teremos necessidade de, ao longo

do curso, definir as nossas proprias funcoes que poderao nao estar disponıveis no leque

de funcoes iniciais do Mathematica. Embora existam varias formas de definir funcoes

no Mathematica, sera aqui abordada aquela que mais se assemelha a escrita usual em

matematica.

Suponha-se que se pretende definir a funcao real de variavel 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 diferenca entre definir uma funcao com ”=”e com ”:=”. Por

agora, concentremo-nos nos argumentos das funcoes. A definicao anterior especifica

que quando o Mathematica encontra uma expressao que coincide com f[x_] devera

substitui-la por Cos[x]. O underscore ” ” serve precisamente para indicar a variavel

10

Page 12: Mathematica

Notas de programacao em Mathematica 11

independente. Se se tivesse definido f[x]:=Cos[x] entao apenas f[x] seria substituido

por Cos[x], o mesmo nao acontecendo por exemplo a f[y]. Para clarificar melhor esta

situacao vejamos esta diferenca em termos de escrita matematica:

Definicao no Mathematica Escrita em matematicaf[x_]:=Cos[x] f(x) = cos(x), ∀x ∈ Rf[x]:=Cos[x] f(x) = cos(x)

Note que para definir a funcao f no Mathematica nao foi necessario indicar os con-

juntos de partida e de chegada. Por isto, diz-se que o Mathematica e uma linguagem

sem declaracao de tipos.

Ilustremos agora com um exemplo a diferenca entre ”=”(atribuicao imediata) e

”:=”(atribuicao diferida) na definicao de funcoes :

Considere-se a funcao m[x_]:=Max[x].

[In]:= m[x_]:=Max[x]

[In]:= ?m

Global ’m

m[x_]:=Max[x]

Defina-se agora uma nova funcao mi[x_]=Max[x]

[In]:= mi[x_]=Max[x] ;

[In]:= ?mi

Global ’mi

mi[x_]=x

Neste ultimo caso, a expressao atribuida Max[x] e avaliada (obtendo-se x) e este resul-

tado e que e associado a mi[x_].

Estes sao alguns dos preceitos ”basicos”a ter em conta quando pretendermos definir

uma funcao. De seguida vamos ver alguns exemplos ilustrativos da potencialidade des-

te tipo de ferramentas que, de uma forma simples permite-nos definir, por exemplo

funcoes nao triviais noutras linguagens de programacao.

11

Page 13: Mathematica

12 Notas de programacao em Mathematica

Exemplo 1. Consideremos a funcao de Heaviside h definida por:

h(x) :=

1 se x > 012

se x = 00 se x < 0

No Mathematica poderiamos definir a funcao de Heaviside por

h[x_]=If[x<0,0,If [x>0,1,1/2]]

Exemplo 2. Vejamos como definir uma funcao deriv[funcao, variavel] com algumas

das propriedades do operador de derivacao :

Escrita em matematica Definicao 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

(xn)′ = nxn−1 deriv[x_^n_,x_]:=n x^(n-1)

f ′(x) = aeax+b se f(x) = eax+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 definicoes anteriores para um ficheiro ”notebook”do Mathe-

matica.

Altere o ficheiro anterior de modo que :

• seja possıvel calcular a derivada da funcao logaritmo.

• seja possıvel calcular a derivada da funcao composta.

Repare que neste exemplo as sucessivas atribuicoes deriv[ ] nao revogam as ante-

riores. Este tipo de situacao pode ser uma fonte de erros e de confusoes, se nao 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

Page 14: Mathematica

Notas de programacao em Mathematica 13

[In]:= ?i

Global ’i

i[_]:= Log[x]

i[x_]:= Log[x]

Nesta situacao, 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 aplicacao f : N −→ N definida por

f(n) =

{ n

2se 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 kn ∈ N tal que fkn(n) = 11.

Utilize o Mathematica para testar a conjectura, mais concretamente, defina a funcao f ,

arbitre um valor para n e teste varios valores kn ate que fkn(n) = 1.

Sugestao: Utilize as funcoes EvenQ[ ] e Nest[ ].

1Nota: fkn = f ◦ . . . ◦ f︸ ︷︷ ︸kn vezes

.

13

Page 15: Mathematica

14 Notas de programacao em Mathematica

Exercıcios

1. Considere o espaco vectorial real R3 e f : R3 −→ R3 a aplicacao definida por

f(x, y, z) = (x + y, y + z, z).

Utilize o Mathematica para:

a) Mostrar que

i) f e uma aplicacao linear.

ii) B = ((1, 1, 1), (0, 1, 2), (1, 1, 0)) e uma base de R3.

b) Determinar A = M(f ;B,B).

c) Calcular os valores proprios da matriz A2 da alınea b).

Sugestao: Relembre que os valores proprios de A sao precisamente os zeros

reais do polinomio caracterıstico p(λ) = |A− λI3|.d) Determinar, para cada valor proprio λ, de A, uma base do subespaco proprio

associado

Eλ ={X ∈ R3 | AX = λX

}.

2. Considere a funcao 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 serie (n definido pelo

utilizador).

2Recorde que, dada uma matriz A ∈ Mn×n(R), diz-se que λ ∈ R e um valor proprio de A se existirum vector X ∈ Mn×1(R) nao nulo tal que AX = λX.

14

Page 16: Mathematica

Notas de programacao em Mathematica 15

Utilize o Mathematica para :

3. Calcular e imprimir o termo de ordem n da sucessao de Fibonacci, definida por

x0 = 1x1 = 1xk+1 = xk + xk−1, k ∈ N

(n definido pelo utilizador).

4. Dada uma matriz A = [aij] ∈ Mn×m(C) (introduzida pelo utilizador) calcular

‖A‖∞ := maxi=1,...,n

m∑j=1

|aij| .

5. Calcule a soma dos n primeiros termos da sucessao definida por

x0 = 3.5

xn+1 = xn − x2n − 16

2xn

, n ∈ N0.

4. Composicoes iterativas

Nesta seccao iremos ver algumas das construcoes que permitem executar repetida-

mente uma certa accao enquanto uma condicao e verdadeira. As construcoes que aqui

abordaremos sao decerto ja conhecidas no contexto de programacao em outras lingua-

gens. Sao elas, os ciclos While, Do e For.

Comecemos pela composicao iterativa While.

Esta composicao tem como forma While[condicao,accao].

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

Page 17: Mathematica

16 Notas de programacao 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)

*)

Composicao 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

Composicao 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 tres primeiros naturais *)

1

2

3

16

Page 18: Mathematica

Notas de programacao 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 ja nos permitem comecar a programar em Mathematica alguns algo-

ritmos mais elaborados. Em particular, estamos em condicoes de comecar a programar

os algoritmos com que nos depararemos ao longo da disciplina de Analise Numerica.

Mas antes de entrarmos na Analise Numerica, vejamos mais uns exemplos elucidativos

do modo como podemos utilizar as ferramentas que ja possuimos:

Exemplo 7. Uma matriz A do tipo n×m diz-se de diagonal principal dominante em

sentido estrito se,

|aii| >m∑

j=1j 6=i

|aij| , ∀i = 1, . . . , n.

Vamos construir uma funcao diagonal[matriz] que permite testar se uma dada matriz

e ou nao 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 funcao anterior para averiguar se a matriz

A =

[1 22 3

]

e de diagonal principal dominante em sentido estrito

17

Page 19: Mathematica

18 Notas de programacao 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 nao nulos. Sabe-se que nestas

condicoes existe o mdc(a, b) e o algoritmo de Euclides permite calcula-lo. Vejamos

como:

A ideia consiste em aplicar sucessivamente o teorema da divisao, do seguinte modo:

a = bq + r0

b = r0q0 + r1

r0 = r1q1 + r2...

rn−2 = rn−1qn−1 + rn

rn−1 = rnqn + 0

Entao mdc(a, b)= rn. Vamos construir uma funcao mdc[a,b] que devolve o maximo

divisor comum entre dois inteiros nao 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

Tambem se poderia confirmar o resultado anterior utilizando a funcao pre definida

GCD[ ].

Exercıcio 4. Uma matriz A = [aij] ∈ Mn×m(K) diz-se diagonal se aij = 0,∀i 6= j.

Elabore um algoritmo que permita decidir se uma dada matriz e ou nao diagonal.

18

Page 20: Mathematica

Notas de programacao em Mathematica 19

Referencias

Jose Carmo, Amılcar Sernadas, Cristina Sernadas, F. Miguel Dionısio, Carlos Ca-

leiro, Introducao a programacao em Mathematica, IST Press, 1999.

Stephen Wolfram, The Mathematica Book 3rd ed., Wolfram Media, Cambridge Uni-

versity Press, 1996.

19