Anda di halaman 1dari 44

Tutorial Mathematica 7.

Ÿ Vinicius Cavalcante Ruscinc


RA. : 097739

Trabalho de Cálculo II
Prof. Dr. Marcio Antônio de Faria Rosa

Ÿ Mathematica não é um software, é o Software!

Acredito que este software ajudou e vai continuar ajudando a ciência daqui pra frente.

Ÿ Introdução

O Software Mathematica é um programa avançado que, a princípio, parece ser inútil quando se vê uma tela branca. Mas
depois que você aprende sobre os seus recursos fica surpreendido. Este tutorial consiste numa visão geral envolvendo
Cálculo, Algebra Linear e, o foco de pesquisa, a base para entender e fazer fractais. O objetivo é instigar quem se interessa a
mexer mais aprofundamente no Mathematica e mostrar como começar a desenvolver o conhecimento sobre o aplicativo.
Na versão atual, 7.0 (novembro de 2009), é possível encontrar ao abrir o programa uma tela de boas vindas contendo um
guia de exemplos para iniciantes.
Os recursos desse ferramenta magnífica podem ser vistos nos sites da Wolfram:
http://www.wolfram.com/products/mathematica/ - O produto Mathematica
http://library.wolfram.com/ - Uma biblioteca contendo milhares de exemplos, dicas e tutoriais
http://www.wolfram.com/products/mathematica/newin7/?buildid=1148351 - Sobre as novidades do Mathematica 7.0 e suas
aplicações em todas as ciências

Ÿ Básico do Básico

Antes de começar é preciso saber que o Help deste programa é um dos melhores já feitos e deve ser utilizado com afinco.
Graças a ele eu consegui desenvolver esse tutorial.
O Mathematica pode ser usado como desde uma simples calculadora até como um programa que analisa gráficos avançados.
No programa você trabalha nos notebooks (.nb) e que é dividido em células de entrada. É muito fácil de se familiarizar.
Os comandos são inseridos nas tais células de entrada cada uma facilmente identificada na lateral direita do programa.
São validados ou computados quando se aperta a tecla ÷ + ç (enter da esquerda) ou o ó (da direita, no teclado
numérico). Exemplo:
2 + 2 H* Pressionei SHIFT + ENTER *L

É possível entrar com expressões enormes na linha de comando. Você pode inserir comentários, bastando colocá-los na
forma entre: (* texto *)

H5 * 7 - 31  7L  4
H* Exemplo de comentário *L
107
14

Se realizarmos uma conta como acima o resultado sai em forma de fração. O Mathematica realiza cálculo com simbologias,
assim como o nosso raciocínio. Assim, os resultados saem com mais exatidão. Pode-se também transformar esse tipo de
resultado em numérico com a função N (para numeral). Outro comando importante, o qual exemplifico abaixo, é o % que se
refere ao resultado ("out") anterior, e // N passa da forma de fração para forma numérica
2 097739Vinicius.nb

Se realizarmos uma conta como acima o resultado sai em forma de fração. O Mathematica realiza cálculo com simbologias,
assim como o nosso raciocínio. Assim, os resultados saem com mais exatidão. Pode-se também transformar esse tipo de
resultado em numérico com a função N (para numeral). Outro comando importante, o qual exemplifico abaixo, é o % que se
refere ao resultado ("out") anterior, e // N passa da forma de fração para forma numérica

%  N

H*  N significa "passar para forma numérica" *L

7.41667

A habilidade deste software é impressionante: consegue realizar contas com exatidão computacional.

2 ^ 1000

10 715 086 071 862 673 209 484 250 490 600 018 105 614 048 117 055 336 074 437 503 883 703 510 511 249 „
361 224 931 983 788 156 958 581 275 946 729 175 531 468 251 871 452 856 923 140 435 984 577 574 698 574 „
803 934 567 774 824 230 985 421 074 605 062 371 141 877 954 182 153 046 474 983 581 941 267 398 767 559 „
165 543 946 077 062 914 571 196 477 686 542 167 660 429 831 652 624 386 837 205 668 069 376

Aproxime para qualquer precisão de dígitos que queira. Aqui, a função N é usada para aproximar em 100 dígitos o número Π
(Pi, mais a frente veja os atalhos para "desenhar" esses símbolos).
N@Pi, 100D

3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280 „
34825342117068

No Mathematica está embutido diversos pacotes de funções, equações, imagens, mapas e milhares de raciocínios para
aprimorar seu desempenho. A única dificuldade que o programa encontra é utilizar-se da memória do computador para caçar
a melhor opção. Mas isso é irrelevante para cálculos pequenos:
Sin@Pi  3D

3
2

Nota: funções importantes, como seno, cosseno, tangente, e letras gregas escritas por extenso são sempre Maiúsculas e os
argumentos fechados em colchetes.
Ágebra parece simples frente ao Mathematica:

Expand@Hx + 1L ^ 10D

1 + 10 x + 45 x2 + 120 x3 + 210 x4 + 252 x5 + 210 x6 + 120 x7 + 45 x8 + 10 x9 + x10

H* Aqui expande-se um expoente *L

Factor@x ^ 4 - x ^ 3 - 2 x - 4D

H- 2 + xL H1 + xL I2 + x2 M

H* Aqui expande-se um expoente *L

Em Cálculo, podemos derivar e integrar:

D@x ^ 2, xD

2x

Integrate@Sin@xD, 8x, 0, Pi<D

Podemos computar somas


097739Vinicius.nb 3

Podemos computar somas

Sum@2  9 ^ n, 8n, 1, Infinity<D

1
4

Para gráficos, utilizamos comando Plot

Plot@x ^ 2, 8x, - 2, 2<D

-2 -1 1 2

Ÿ Colchetes [], Chaves {}, e parênteses ()

Colchetes, Chaves e parênteses tem propósitos diferentes no Mathematica. Colchetes [] são usado para separar argumentos
de uma função como em:
N@Tan@1D, 20D

1.5574077246549022305

Parênteses () são usados para agrupar expressões matemáticas como em:

H2 * 5 - 1L  3

Chaves {} são usados para listagem. Listas são muito importantes em Mathematica como estrutura fundamental. Muitas
funções agem automaticamente nos elementos da lista.

N@8Sqrt@2D, E<, 20D

81.4142135623730950488, 2.7182818284590452354<

Alguns comandos retornam listas. Os comandos Table e Range são dois dos mais importante comandos. O comando Table
tem a sintaxe Table[expr,{x,xMin,xMax}]. A expressão expr nos valores xMin, xMin+1, …, xMin+n, onde n é o maior
valor então xMin+n £ xMax. Por exemplo, aqui estão os dez primeiros números naturais em sua forma quadrada.

Table@x ^ 2, 8x, 1, 10<D

81, 4, 9, 16, 25, 36, 49, 64, 81, 100<

As vezes é melhor usar uma versão mais leve de Table o qual especifica o tamanho do intervalo: Table[expr,
{x,xMin,xMax,step}], no qual step representa o tamanho do intervalo:
4 097739Vinicius.nb

Table@x ^ 2, 8x, 1, 10, .5<D

81., 2.25, 4., 6.25, 9., 12.25, 16., 20.25, 25.,


30.25, 36., 42.25, 49., 56.25, 64., 72.25, 81., 90.25, 100.<

A versão mais específica de Table[expr,{n}] simplismente produz n cópias de expr. Veremos várias instancias onde isso
será útil. Table aceita múltiplas variáveis para criar listas. No exemplo a seguir, x é fixo para cada sub lista de 0 a 2 de
acordo como se move de lista para lista, y vai de 1 a 4 dentro de cada sub lista

Table@x + y, 8x, 0, 2<, 8y, 1, 4<D

881, 2, 3, 4<, 82, 3, 4, 5<, 83, 4, 5, 6<<

O comando Range simplesmente produz uma lista de números dados a certos min, max e passo. Isso não é limitado quanto
parece, desde que as funções atuem em listas
Range@10D ^ 2

81, 4, 9, 16, 25, 36, 49, 64, 81, 100<

Range@1, 10, .5D ^ 2

81., 2.25, 4., 6.25, 9., 12.25, 16., 20.25, 25.,


30.25, 36., 42.25, 49., 56.25, 64., 72.25, 81., 90.25, 100.<

Ÿ Entrando expressões compostas por simbologias

Até agora, tudo tem sido bem claro como criar todo tipo de exemplo. Mathematica permite inserir valores matemáti-
cos e resolver de maneira muito mais próxima com o real. Por exemplo, a seguir são equivalentes.

N@Pi ^ 2  6D

1.64493

F
Π2
NB
6
1.64493

Possuem dois métodos básicos de escrever expressões compostas - usando atalhos do programa ou atalhos do teclado. Pelo
programa leva-se mais tempo mas pode se ver qual selecionar sem erro. O melhor a se fazer é saber alguns atalhos de teclado
para usar o programa apenas quando necessário.

Π2
Agora vamos ver como escrever 6
usando o menu (pallete).

1) Selecione BasicMathInput debaixo do menu Palettes.


ƒ
2) Clique em ƒ
na primeira coluna.
3) Clique no botão ƒƒ perto do botão da coluna.
4) Clique no botão Π próximo do meio da seleção.
5) Aperte a tecla ê .
6) Digite "2".
7) ) Aperte a tecla ê .
8) Digite "6".
9) Aperte duas vezes a seta para direita para sair da expressão

Π2
Aqui é para como escreve 6
usando o teclado.

1) Digite å .
2) Escreva "pi".
3) Digite å .
4) Aperte â e ^ simultaneamente.
097739Vinicius.nb 5
Π2
Agora vamos ver como escrever 6
usando o menu (pallete).

1) Selecione BasicMathInput debaixo do menu Palettes.


ƒ
2) Clique em ƒ
na primeira coluna.
3) Clique no botão ƒƒ perto do botão da coluna.
4) Clique no botão Π próximo do meio da seleção.
5) Aperte a tecla ê .
6) Digite "2".
7) ) Aperte a tecla ê .
8) Digite "6".
9) Aperte duas vezes a seta para direita para sair da expressão

Π2
Aqui é para como escreve 6
usando o teclado.

1) Digite å .
2) Escreva "pi".
3) Digite å .
4) Aperte â e ^ simultaneamente.
5) Digite "2".
6) Aperte a seta para direita.
7) Aperte â e / simultaneamente
8) Digite "6".
9) Aperte duas vezes a seta para direita para sair da expressão

Comandos (  é a tecla ESC )


 int  Ù
 sumt  ڃ‚=ƒ ƒ
 prodt  Û
 ee  ã
 ii  ä
 inf  ¥
 deg  °
 del  Ñ
 elem  Î
 un  Ü
 inter  Ý
 a Α
 b Β
 g Γ
 d ∆
 e Ε
 z Ζ
 et  Η
 th  Θ
 i  Ι
 k Κ
 l Λ
 m Μ
 n Ν
 x Ξ
 p Π
 r Ρ
 s Σ
 t Τ
 ph  Φ
 cph j
 c Χ
 ps  Ψ
 a Α
 b Β
 g Γ
6
 097739Vinicius.nb
d ∆
 e Ε
 z Ζ
 et  Η
 th  Θ
 i  Ι
 k Κ
 l Λ
 m Μ
 n Ν
 x Ξ
 p Π
 r Ρ
 s Σ
 t Τ
 ph  Φ
 cph j
 c Χ
 ps  Ψ
 o Ω
 G G
 D D
 Th  Q
 L L
 T T
 Pi  P
 Ph  F
 Ps  Y
 O W

Ÿ Definindo constantes e funções.

Constantes podem ser definidas de um modo natural.

c = 7

O símbolo c agora será tratado como 7.

c+3

10

Nomes simbólicos podem ser alfanuméricos e talvez se refiram a objetos mais complicados

umaLista = Range@10D + c

88, 9, 10, 11, 12, 13, 14, 15, 16, 17<

Nós talvez continuaremos agindo neste objeto.

HumaListaL2
864, 81, 100, 121, 144, 169, 196, 225, 256, 289<

Apaguemos o conteúdo dos símbolos.

Clear@c, umaListaD
097739Vinicius.nb 7

c+3

3+c

umaLista2

umaLista2

Aqui é como definir a função f(x) = x+2

f@x_D := x + 2

Agora podemos colocar qualquer valor pra x.

f@3D

fAy2 E

2 + y2

As coisas importante pra se lembrar quando se definir uma fução são


1) (quase) sempre use o sinal :=
2) use valores baixos após o nome das variáveis na declaração da função à esquerda do sinal := .
O valor baixo é usado pois é assim que o Mathematica reconhece como paterno. Reconhecimento parteno é a parte central
do Mathematica e as funções são definidas em termno do Patterns. O sinal := é a abreviação de SetDelayed, como o oposto
do = que é a abreviação de Set. A diferença é que usando = direciona instantaneamente enquanto usando := espera até a
expressão estar totalmente resolvida, que é o que geralmente se quer quando se declara uma função. Aqui é um exemplo
onde a diferença é importante. Supõe-se que queremos definir uma função diff que automaticamente diferencie com o
referencial x. O jeito correto de se fazer isso está abaixo.

Clear@fD;
diff@f_D := D@f, xD;
diffAx2 E

2x

Se usamos = em vez de :=, a função não funciona

Clear@diffD;
diff@f_D = D@f, xD;
diffAx2 E

O problema é que a derivada D[f,x] é calculada imediatamente e retorna com o resultado 0.

D@f, xD

Usando := faz dizer ao Mathematica para esperar até que alguma expressão seja substituída por f para obter sua derivada.
As vezes é conveniente usar uma função pura. Uma função pura tem a sintaxe expr &, onde expr é uma expressão do
Mathematica envolvendo o simbolo # e o operador & diz ao Mathematica para tratar expr como uma função com #. Por
exemplo, #^#& é i,a função que gera um número(ou possivelmente outro objeto do Mathematica) pra ele mesmo. Usamos
colchetes ao quadrado para ligar a algum argumento apenas como outra função.
8 097739Vinicius.nb

ð ^ ð &@3D

27

Como vimos à pouco, funções puras são particularmente úteis no contexto da manipulação de lista.

Ÿ O Básico sobre Gráficos

Existem vários comandos básicos para funções ou datas. O comando básico é Plot - dizemos até em "plotar" um
gráfico. Por exemplo, na função x2 sobre a aproximação -2 £ x £ 2 (denominado {x,-2,2}:

PlotAx2 , 8x, - 2, 2<E

-2 -1 1 2

Poderemos também plot mais de uma função no mesmo gráfico através da lista de funções. Aqui o plot de sin(x) junto com
uma aproximação polinomial

>, 8x, - 2 Π, 2 Π<,


x3 x5
PlotB:Sin@xD, x - +
6 120
PlotRange ® 8- 2, 2<F

-6 -4 -2 2 4 6

-1

-2

Note que incluímos a opção PlotRange®{-2,2} o qual controla a posição vertical no plot. O comando de Plot tem tantas
opções que as vezes é melhor conferir na Ajuda Online.
Plots tridimensionais de duas variáveis podem ser geradas usando o comando Plot3D.
097739Vinicius.nb 9

Plot3DAExpA- Ix2 + y2 ME, 8x, - 2, 2<, 8y, - 2, 2<E


2

-1

-2
1.0

0.5

0.0
-2

-1

O comando ContourPlot oferece outra maneira de vizualisar a função de duas variaveis. Parece as curvas de níveis.

ContourPlotAExpA- Ix2 + y2 ME, 8x, - 2, 2<, 8y, - 2, 2<E

-1

-2
-2 -1 0 1 2

O uso da opção MeshFunctions facilita a visualização de como são relacionados.


10 097739Vinicius.nb

Plot3DAExpA- Ix2 + y2 ME, 8x, - 2, 2<, 8y, - 2, 2<,


MeshFunctions ® 8ð3 &<, PlotPoints ® 50,
RegionFunction ® Hð3 > 0.02 &LE

2
1
0
-1

-2
1.0

0.5

0.0
-2
-1

ParametricPlot3D@8Cos@tD H3 + Cos@uDL, Sin@tD H3 + Cos@uDL, Sin@uD<, 8t, 0, 2 Pi<, 8u, 0, 2 Pi<D

RevolutionPlot3D@Cos@xD, 8x, 0, Pi<D

1.0
0.5
0.0 2
-0.5
-1.0
0
-2

0
-2

2
097739Vinicius.nb 11

RevolutionPlot3D@Cosh@xD, 8x, 0, Pi<D

10

5 2

0
0
-2

0
-2

Para adicionar superfícies 3 D parametrizadas :

ParametricPlot3D@8Cos@tD H3 + Cos@uDL, Sin@tD H3 + Cos@uDL, Sin@uD<, 8t, 0, 2 Pi<, 8u, 0, 2 Pi<D

1.0 4
0.5
0.0 2
-0.5
-1.0
-4 0

-2

0 -2

2
-4
4
12 097739Vinicius.nb

SphericalPlot3D@1 + 2 Cos@2 ΘD, 8Θ, 0, Pi<, 8Φ, 0, 2 Pi<D


-1.0
1.0 -0.5
0.0
0.5 0.5
1.0
0.0

-0.5

-1.0

-2

O comando ListPlot arruma uma lista de pontos no plano

TableA9x, x2 =, 8x, - 4, 4<E

88- 4, 16<, 8- 3, 9<, 8- 2, 4<, 8- 1, 1<, 80, 0<, 81, 1<, 82, 4<, 83, 9<, 84, 16<<
097739Vinicius.nb 13

ListPlot@%D

15

10

-4 -2 2 4

Quando arrumado muitos pontos, é melhor assimilar a saída do comando Table com uma variável e serve para suprir a saída.

data = TableA9x, x2 =, 8x, - 4, 4, .1<E;


ListPlot@dataD

15

10

-4 -2 2 4

Se quiser os pontos conectados, pode-se usar o commando ListLinePlot.

ListLinePlot@dataD

15

10

-4 -2 2 4

Para relembrar novamente: um ponto-e-vígula não só supri a saída do gráfico, mas como registra, sem ativar, o texto/co-
mando. Isso é conveniente quando não se quer ver a saída, mas quer combinar isso com gráficos subseqüentes gerados. Por
exemplo, para gerar a parábola acima junto com pontos escolhidos para gerá-la, poderíamos plotar eles separadamente,
guardar esses resultados dentro de variáveis e usando o comando Show para mostrar esses pontos juntos:
14 097739Vinicius.nb

plot1 = ListPlot@data,
PlotStyle ® 8PointSize@.015D<D;
plot2 = ListLinePlot@dataD;
Show@plot1, plot2D

15

10

-4 -2 2 4

Podemos usar também GraphicsGrid para desenhar plotagens separadas.

Show@GraphicsGrid@88plot1, plot2<<DD

15 15

10 10

5 5

-4 -2 2 4 -4 -2 2 4

Ÿ Resolvendo equações

Mathematica tem um potencial nas técnicas de resolver equações. O comando básico é o Solve. Veja como ele acha a
rota certa dentro de um polinomial:

SolveAx3 - 2 x - 4 Š 0, xE

88x ® - 1 - ä<, 8x ® - 1 + ä<, 8x ® 2<<

Geralmente não se pode calcular com exatidão expressões como a abaixo. Então o programa se utiliza de alternativas para
demostrar resultados fora do padrão, criando sua propria simbologia:

SolveAx5 - 2 x - 3 Š 0, xE

99x ® RootA- 3 - 2 ð1 + ð15 &, 1E=, 9x ® RootA- 3 - 2 ð1 + ð15 &, 2E=,


9x ® RootA- 3 - 2 ð1 + ð15 &, 3E=, 9x ® RootA- 3 - 2 ð1 + ð15 &, 4E=, 9x ® RootA- 3 - 2 ð1 + ð15 &, 5E==

Para aproximar em números as variáveis que ele cria, basta usar o comando NSolve.
097739Vinicius.nb 15

NSolveAx5 - 2 x - 3 Š 0, xE

88x ® - 0.958532 - 0.498428 ä<, 8x ® - 0.958532 + 0.498428 ä<,


8x ® 0.246729 - 1.32082 ä<, 8x ® 0.246729 + 1.32082 ä<, 8x ® 1.42361<<

O Solve e NSolve funcionam bem com polinômios. Entretanto muitas equações envolvem funções abstratas que estão
além da capacidades desses comandos. A simples equação cosHxL = x. NSolve não resolve e retorna com erro explicativo.

NSolve@Cos@xD Š x, xD

Solve::tdep : The equations appear to involve the


variables to be solved for in an essentially non-algebraic way. ‡
NSolve@Cos@xD Š x, xD

Diz que possui maneira não algébrica de resolver a equação.


Um simples plot mostra que possui solução:
Plot@8Cos@xD, x<, 8x, 0, 1<D

1.0

0.8

0.6

0.4

0.2

0.2 0.4 0.6 0.8 1.0

O comando FindRoot se utiliza do método de Newton para resolver essa - forma iterativa (dá-lhe Google!) - . No gráfico
mostra um valor abaixo e próximo de 0,8. Seria um bom palpite, mas vejamos com o comando:
FindRoot@Cos@xD Š x, 8x, 0.8<D

8x ® 0.739085<

Notar que FindRoot é utilizado para resolver certas equações para a dimensão fractal de um conjunto.

Ÿ Sequências Randômicas

Muitos algoritimos de fractais possuem sequências aleatórias de elementos e por isso é importante ser capaz de gerá-las. O
Mathematica possui alguns comandos para esse propósito; RandomInteger é, quem sabe, o mais fundamental.
RandomInteger[{iMin,iMax},n] gera a lista de n inteiros entre iMin e iMax.

RandomInteger@81, 4<, 10D

84, 2, 4, 2, 4, 3, 4, 1, 2, 4<

Em algumas aplicações esse números nao precisam ser necessariamente números e nem com pesos iguais.
Suponha que três funções, f1, f2, f3, precisam ser definidas aleatóriamentes com pesos 1/2, 1/3 e 1/6.
Para isso existe o comando que o acompanha RandomChoice .

Claro que não são comandos genuinamente aleatórios, mas pseudos-aleatório; Eles são procedimentos pré-determinados que
aparentam aleatoriedade. A saída do numero pseudo-aleatorio depende de uma entrada inicial chamada alimento ou em
inglês seed. SeedRandom aceita número inteiro de entrada
16 097739Vinicius.nb

SeedRandom@1D;
RandomReal@81, 4<, 5D
83.45217, 1.33426, 3.36858, 1.56341, 1.72408<

Se a tabela é gerada novamente depois de outra chamada SeedRandom[1], o comando Random irá gerar a mesma sequência
de números.
SeedRandom@1D;
RandomReal@81, 4<, 5D
83.45217, 1.33426, 3.36858, 1.56341, 1.72408<

Ÿ Gráficos Bases

Plot geram gráficos como saída:

Plot@x + 1, 8x, - 2, 2<, PlotPoints ® 2,


MaxRecursion ® 0D
3

-2 -1 1 2

-1

Se digitar InputForm verá como a representação se aproxima de comandos (com opções e tudo mais)

%  InputForm

Graphics[{{{}, {}, {Hue[0.67, 0.6, 0.6],


Line[{{-1.999996, -0.9999960000000001},
{1.8472175954999577, 2.8472175954999575},
{1.999996, 2.9999960000000003}}]}}},
{AspectRatio -> GoldenRatio^(-1),
Axes -> True, AxesOrigin -> {0, 0},
PlotRange -> {{-2, 2}, {-0.9999960000000001,
2.9999960000000003}},
PlotRangeClipping -> True,
PlotRangePadding -> {Scaled[0.02],
Scaled[0.02]}}]

A saída fica na forma Graphics[primitives_,options_], onde primitives é a lista de fráficos e options é a lista
de opções/parâmetros. O comando Graphics pode desenhar gráficos básicos. Gráficos básico podem ser obtidos desen-
hando na mão através do menu Graphics da barra de ferramentas.

Existem mais de 10 tipo de gráficos, como Line and Polygon. Line é um comando que você põe coordenadas para
desenhar linha, como 88x1 , y1 <, ..., 8xn , yn << que define os pontos dos vértives. Linhas podem desenhar polígonos.
097739Vinicius.nb 17

Graphics@Line@880, 0<, 81, 1<<DD

Para múltiplas linhas basta adicionar pontos de ínicio e fim:

Graphics@Line@8880, 1<, 82, 1<<,


880, 0<, 81, 1<, 82, 0<<<DD

Por exemplo, Thickness afeta a espessura de uma Line. Por exemplo, podemos distinguir as duas linhas abaixo:

Graphics@8
Thickness@.01D, Line@880, 1<, 82, 1<<D,
Thickness@.03D, Line@880, 0<, 81, 1<, 82, 0<<D
<D

Thickness pode afetar só as linhas que queremos, mesmo sobrepostas:


18 097739Vinicius.nb

Thickness pode afetar só as linhas que queremos, mesmo sobrepostas:

Graphics@88Thickness@.02D, Line@880, 1<, 82, 1<<D<,


Line@880, 0<, 81, 1<, 82, 0<<D
<D

O comando Polygon também aceita coordenadas de vértices e preenche o seu interior

Graphics@
Polygon@880, 0<, 81, 0<, 81, 1<, 80, 1<<DD

Para adicionar uma cor cinza utiliza-se GrayLevel[ Porcentagem de cinza ]


097739Vinicius.nb 19

Graphics@8GrayLevel@.7D,
Polygon@880, 0<, 81, 0<, 81, 1<, 80, 1<<D<D

Combinando Line e Polygon obtemos:

vertices = 880, 0<, 81, 0<, 81, 1<, 80, 1<, 80, 0<<;
Graphics@8
8GrayLevel@.7D, Polygon@verticesD<,
Line@verticesD<,
AspectRatio ® AutomaticD

Ÿ Listas e Conjuntos - importante para fractais

Mathematica pode atuar em listas ou conjuntos de diversas formas. Aqui está uma lista de números inteiros escolhi-
dos aleatoriamente.
20 097739Vinicius.nb

SeedRandom@1D;
umaLista = RandomInteger@81, 10<, 810<D
82, 5, 1, 8, 1, 1, 9, 7, 1, 5<

Podemos sorteá-la: (*Sort*)

sortedList = Sort@umaListaD

81, 1, 1, 1, 2, 5, 5, 7, 8, 9<

Inverter a ordem

Reverse@sortedListD

89, 8, 7, 5, 5, 2, 1, 1, 1, 1<

Podemos fazer os números girarem para a esquerda em 3 casas:

RotateLeft@sortedList, 3D

81, 2, 5, 5, 7, 8, 9, 1, 1, 1<

Podemos retirar 3 números do conjunto:

Drop@sortedList, 3D

81, 2, 5, 5, 7, 8, 9<

Acessar um número numa casa específica:

sortedList@@3DD

Podemos dividir em grupos ou partições, no exemplo, em sub-conjuntos de 2:

Partition@sortedList, 2D

881, 1<, 81, 1<, 82, 5<, 85, 7<, 88, 9<<

Planificar para não ficar em desordem:

Flatten@%D

81, 1, 1, 1, 2, 5, 5, 7, 8, 9<

Selecionar números ímpares:

Select@umaLista, OddQD

85, 1, 1, 1, 9, 7, 1, 5<

Podemos verificar se algum item dentr de uma casa é impar ou não (verdadeiro ou falso):

8OddQ@2D, OddQ@3D<

8False, True<

Com o comando (#>5)& podemos selecionar números inteiros maiores que cinco.

Select@umaLista, ð > 5 &D

88, 9, 7<

Agora, o mais interessante é poder trabalhar conjuntos como uma variável e aplicar comandos de álgebra, cálculo, estatística:
097739Vinicius.nb 21

sortedList2
81, 1, 1, 1, 4, 25, 25, 49, 64, 81<

No exemplo acima todos os itens foram elevados ao quadrado.


Veremos como utilizar o comando Map dentro de uma lista e quem sabe utilizar para achar funções de um conjunto:
Clear@fD; H* UTILIZAREI f COMO FUNÇÃO,
PORTANTO LIMPO ELE CASO ELE JA TENHA SIDO USADO *L
f@umaListaD
f@82, 5, 1, 8, 1, 1, 9, 7, 1, 5<D

O Map facilitará para mim se eu quiser escrever várias funções de números no conjunto:

Map@f, umaListaD

8f@2D, f@5D, f@1D, f@8D, f@1D, f@1D, f@9D, f@7D, f@1D, f@5D<

Map é abreviado em /@.

f ž umaLista

8f@2D, f@5D, f@1D, f@8D, f@1D, f@1D, f@9D, f@7D, f@1D, f@5D<

É interessante utilizarmos o Map para fazer conjuntos e visualizar operações com números da listagem:

9ð, ð2 = & ž umaLista

882, 4<, 85, 25<, 81, 1<, 88, 64<, 81, 1<, 81, 1<, 89, 81<, 87, 49<, 81, 1<, 85, 25<<

Plus soma elementos de um conjunto ou listagem e aplica-se da seguinte forma:

Plus žž umaLista

40

Para tirar a média de um conjunto podemos definir uma função que soma o total de um conjunto (Total[x]) e dividir pelo
tamanho (Length[x]), como abaixo:
media@l_D := Total@lD  Length@lD;
media@umaListaD
4

Técnicas que pesquisei e achei para pensar em fractais são os comando Through, Inner, e Outer. Ele são usados em
pacotes como FractalGeometry. Through é parecido com Map, mas aplica a cada função de uma lista um argumento (x)

Through@8f1, f2, f3<@xDD

8f1@xD, f2@xD, f3@xD<

Mais pra frente é possível ver um exemplo de fractal que utiliza métodos avançados

Ÿ Iteração (

Como eu havia me deparado antes com esse método de resolução, resolvi pesquisar melhor e ver como funciona. É utilizado
em fractais e em ciência da computação.
Wiki: "Se uma função f mapeia um conjunto por ela mesma, então o valro inicial x0 deve ser colocado para obtenção do
valor x1. Esse valor deve ser coocado em f para que ele continue achando os valores seguintes. Isso forma a sequência
8x0 , x1 , x2 , ...< onde xn = f Hxn-1 L para qualquer inteiro n > 0. Por outro lado, xn = f n Hx0 L onde f n representa o n-simo
componente de f com ele mesmo." O Mathematica possui os comando Nest e NestList. Nest[f,x0,n] retorna na
verdade fn @x0D.
22 097739Vinicius.nb

Clear@fD;
Nest@f, x0, 5D
f@f@f@f@f@x0DDDDD

NestList[f,x,n] faz na verdade: 8x0 , x1 , x2 , ...<.

NestList@f, x0, 5D

8x0, f@x0D, f@f@x0DD, f@f@f@x0DDD, f@f@f@f@x0DDDD, f@f@f@f@f@x0DDDDD<

A função eu defino abaixo e depois utilizo Nest para se repetir até 3 vezes:

recip@x_D := 1  H1 + xL

Nest@recip, x, 3D

1
1
1+ 1
1+
1+x

Por exemplo, a iteração de Cos começando em 0.8, deve gerar a sequência a qual converge para o ponto fixo de Cos.
No exemplo, utiliza-se Cos ao invés de Cos[x] já que NestList "prescreve" a função.

NestList@Cos, .8, 30D

80.8, 0.696707, 0.76696, 0.720024, 0.75179, 0.730468, 0.744863, 0.735181,


0.741709, 0.737315, 0.740276, 0.738282, 0.739626, 0.738721, 0.73933, 0.73892,
0.739196, 0.73901, 0.739136, 0.739051, 0.739108, 0.73907, 0.739096, 0.739078,
0.73909, 0.739082, 0.739087, 0.739084, 0.739086, 0.739084, 0.739086<

O comando FixedPoint[f,x0] automaticamente "itera" (correto?) f começando em x0 até o resultado parar de se


modificar
FixedPoint@Cos, .8D

0.739085

Ÿ Definindo padrões e regras

Quando se define uma função ela é padrinizada como uma regra para qualquer f (no exemplo abaixo f HxL = x2 ).

f@x_D := x2

f@2D

Podemos definir uma regra da seguinte forma também:

x2 . x ® 2
4

A expressão é x2 , a regra x®2 e /. é o operador substituto que fala ao programa implementar a regra. A seta ® foi digitada
como -> e o programa desenha ela automaticamente.
Um alternativa para x®2 é escrever Rule[x,2].

Agora perceba como os comandos Solve envolvem regras ao resolver formulas algébricas. Podemos utilizar variáveis e
retornar as raízes dentro da equação inicial para saber os resultados.
097739Vinicius.nb 23

y = x3 + 4 x2 - 3 x + 1;
resolve = Solve@D@y, xD Š 0, xD

:8x ® - 3<, :x ® >>


1
3

We can plug the critical points back into y.

y . resolve H* Substitirá as raízes dentro do polinomio *L

:19, >
13
27

Mais exemplos de regras: (Tudo que o que for 1 será elevado ao quadrado e tudo o que for 2 também)

81, 2, a, b, Π< . 91 ® 12 , 2 ® 22 =

81, 4, a, b, Π<

No exemplo abaixo pegará todos os números inteiros n (n_Integer) e elevará ao quadrado

81, 2, a, b, Π< . n_Integer ® n2

81, 4, a, b, Π<

Qualquer função da regra Rule que esteja a direita de ® é calculado imediatamente.


Mas existe o comando RuleDelayed que espera até ser aplicada a regra para calcular função. RuleDelayed pode ser ¦ ou
digitada :>.
A diferença entra ® e ¦ é a mesma que = e :=. Imagine se queremos expandir potências. Tentaríamos através de uma regra
com:

Ha + bL12 Hc + dL3 . x_n_ ® Expand@xn D

a + b Hc + dL3

Isso não ta correto pois Expand@xn D é calculado imediatamente para expandir xn .


Tentando " ¦ " há uma aplicação da regra antes dela ser calculada

Ha + bL12 Hc + dL3 . x_n_ ¦ Expand@xn D

a + b Ic3 + 3 c2 d + 3 c d2 + d3 M

Fazer padrões e regras é muito importante dentro do programa.


24 097739Vinicius.nb

Ÿ Algebra Lineal

Vetores são representados como listas de um tamanho apropriado no Mathematica. Então um vetor bidimensional é simplifi-
cado numa lista de dois componentes.
Cada componente também com dois componentes, dessa forma:
88a, b<, 8c, d<<  MatrixForm H* LEMBRE-SE QUE  SIGNIFICA PASSAR PARA *L

a b
c d

Você passa para matriz utilizando o exemplo acima, MatrixForm. Repare que o segundo componente c,d é da segunda
linha na matriz.

Para escrever matrizes basta apertar K O na Pallete Basic Math, ou indo em Table/Matrix dentro do menu Insert.
ƒ ƒ
ƒ ƒ
A multiplicação de matrizes é representada por . entre duas matrizes ou entre matriz e vetor:

88a, b<, 8c, d<<.8x1 , x2 <

8a x1 + b x2 , c x1 + d x2 <

Invertendo e Transpondo matrizes :

MatrixForm@m = 88a, b<, 8c, d<<D

a b
c d

Transpose@mD  MatrixForm

K O
a c
b d

Inverse@mD  MatrixForm
d b
-
-b c+a d -b c+a d
c a
-
-b c+a d -b c+a d

Para achar determinantes podemos utilizar Det[m]

Det@mD

-b c + a d

Outras operações :
NE  MatrixForm
1 2
MatrixExpAJ
0 3

F  MatrixForm
1 2
MatrixExpB
0 3

ã - ã + ã3
0 ã3

Resolvendo sistema linear :

Para resolvermos, depois que montada a matriz, o sistema J N J N = J N fazemos :


1 2 x 1
3 4 y 2
097739Vinicius.nb 25

, 81, 2<F
1 2
LinearSolveB
3 4

:0, >
1
2

Podemos descobrir os efeitos da multiplicação por certos tipos de matrizes, normalmente em vetores 2D.
Para exemplificar, achei um desenho de um triangulo que copiei e colei do help:

triangulo = GraphicsB::GrayLevel@.7D,

PolygonB:80, 0<, 81, 0<,

:1  2, 3 ’ 2>>F>,

:LineB:80, 0<, 81, 0<,

:1  2, 3 ’ 2>, 80, 0<>F>>,

Axes ® TrueF

0.8

0.6

0.4

0.2

0.2 0.4 0.6 0.8 1.0

A função feita a seguir aceita objetos como Graphics e matrizes e aplica uma transformação definida por uma matriz para
todos os vetores numéricos em 2D nesse Graphics:
(Confuso mas tente entende)
transformar@Graphics@g_, opts___D, M_ ? MatrixQD :=
Graphics@GeometricTransformation@g,
AffineTransform@MDD, optsD;

a 0
Agora a matriz diagonal deve distorcer o triangulo num fator a na horizontal e d na direção vertical.
0 d

Variavel = 882, 0<, 80, 1  2<<;


transformar@triangulo, VariavelD

0.4
0.3
0.2
0.1

0.5 1.0 1.5 2.0

Troca-se o sinal para inverter o vértice:


26 097739Vinicius.nb

Variavel = 882, 0<, 80, - 1  2<<;


transformar@triangulo, VariavelD

0.5 1.0 1.5 2.0


-0.1
-0.2
-0.3
-0.4

Rotation is a bit trickier. Para rotacionar o desenho num ângulo Θ precisamos, como visto em cálculo II, multiplicar pela
matriz
cos Θ -sin Θ
.
sin Θ cos Θ

Ou entao utilizar o comando já pronto RotationMatrix., que ele faz a mesma coisa:

RotationMatrix@ΘD  MatrixForm

Cos@ΘD - Sin@ΘD
Sin@ΘD Cos@ΘD

RotationTransform é análogo ao AffineTransform que utilizamos acima, mas em AlgeLin é melhor utilizar o primeiro

Ó 1 Ó 0 Ó
Exemplo: testarei os vetores Ò = eÔ = . Para rotacionar Θ fazemos, primeiro em Ò :
0 1

88Cos@ΘD, - Sin@ΘD<, 8Sin@ΘD, Cos@ΘD<<.81, 0<

8Cos@ΘD, Sin@ΘD<

Ó Ó
Esse é o vetor Ò rodado num ângulo Θ. Agora rotacionarei Ô multiplicando ele pela matriz rotacional:

88Cos@ΘD, - Sin@ΘD<, 8Sin@ΘD, Cos@ΘD<<.80, 1<

8- Sin@ΘD, Cos@ΘD<

Ó
Se Ô é

0 cos Π  2
sin Π  2
= .
1
Ó
Entao Ô rodado por um ângulo Θ deve ser

cosH Θ + Π  2L -sin Θ
sinHΘ + Π  2L
= ,
cos Θ
Ó
que é exatamente a matriz multiplicada pelo vetor Ô . TrigExpand demonstra a igualdade óbvia acima através da Trigonome-
tria básica
8Cos@Θ + Π  2D, Sin@Θ + Π  2D<  TrigExpand

8- Sin@ΘD, Cos@ΘD<

Ó Ó
Agora farei um variável matricial M que roda vetores. Já que M roda tanto Ò quanto Ô por um ângulo Θ, ele roda também
qualquer vetor através de um ângulo já que podemos separá-lo por vetores unitários:

MJ N = M Jx1 J N + x2 J NN = x1 M K O + x2 M K O.
x1 1 0 1 0
x2 0 1 0 1

Por exemplo, pode-se rodar o triangulo (acima) num ângulo Π  12.


097739Vinicius.nb 27

M = 88Cos@Π  12D, - Sin@Π  12D<,


8Sin@Π  12D, Cos@Π  12D<<;
Show@transformar@triangle, MD,
Axes ® True, AspectRatio ® AutomaticD
H* Adicionado essas opções para ter uma visualização melhor *L

0.8

0.6

0.4

0.2

0.2 0.4 0.6 0.8

Agora podemos ver como distorcer um triângulo multiplicando seus vetores por matrizes definidas por:

comprimir = 882, 0<, 80, 1  2<<;


refletir = 881, 0<, 80, - 1<<;
rotacionar = 88Cos@Π  12D, - Sin@Π  12D<,
8Sin@Π  12D, Cos@Π  12D<<;
M = refletir.rotacionar.comprimir;
transformar@triangulo, MD

0.5 1.0 1.5


-0.1
-0.2
-0.3
-0.4
-0.5
-0.6
-0.7

These operations are not generally commutative.

M = rotacionar.refletir.comprimir;
transformar@triangulo, MD

0.5
0.4
0.3
0.2
0.1

0.5 1.0 1.5


-0.1

O conjunto de comandos eigenvectors e eigenvalues são complicados e avançados para se entender a geometria por trás de
algumas matrizes. O primeiro é utilizado para computar dimensão fractal de conjuntos simétricos. O vetor v é um eigenvec-
tor da matriz M se lá possuir um número Λ tal que Mv = Λv. Nesse caso, Λ é o correspondente eigenvalue. Em cálculo II
podemos exemplificar algo parecido com Multiplicador de Lagrange. Um conjunto de eigenvectors forma o chamado
eigensystem da matriz. O eigenvector dtermina um subespaço dimensional que é invariante sob M e o eigenvalue determina
o fator pelo qual o subespaço será expandido ou comprimido por M.
Eigenvalues, Eigenvectors, e Eigensystem :
28 097739Vinicius.nb

O conjunto de comandos eigenvectors e eigenvalues são complicados e avançados para se entender a geometria por trás de
algumas matrizes. O primeiro é utilizado para computar dimensão fractal de conjuntos simétricos. O vetor v é um eigenvec-
tor da matriz M se lá possuir um número Λ tal que Mv = Λv. Nesse caso, Λ é o correspondente eigenvalue. Em cálculo II
podemos exemplificar algo parecido com Multiplicador de Lagrange. Um conjunto de eigenvectors forma o chamado
eigensystem da matriz. O eigenvector dtermina um subespaço dimensional que é invariante sob M e o eigenvalue determina
o fator pelo qual o subespaço será expandido ou comprimido por M.
Eigenvalues, Eigenvectors, e Eigensystem :

M = 881  2, 1<, 80, 2<<;


Eigenvalues@MD

:2, >
1
2

Eigenvectors@MD

:: , 1>, 81, 0<>


2
3

23
por 1  2 e deve expandir o vetor
1
Então essa matriz deve comprimir o vetor pelo fator 2.
0 1

M.81, 0<

: , 0>
1
2

M.82  3, 1<

: , 2>
4
3

O comando Eigensystem retorna uma linha contendo duas listas; a primeira contém os eigenvalues e a segunda os respec-
tivos eigenvectors
Eigensystem@MD

::2, >, :: , 1>, 81, 0<>>


1 2
2 3

Os comandos Inner e Outer generalizam o produto de matrizes de vetores. O produto escalar w e v é w.v. Vetores são
representados como listas:
w = 81, 2, 3<;
v = 8a, b, c<;
w.v
a+2b+3c

Inner é implementação do Dot (como se fosse produto escalar) no qual f ativa uma regra de multiplicação e g de adição:

Clear@f, gD;
Inner@f, 81, 2, 3<, 8a, b, c<, gD
g@f@1, aD, f@2, bD, f@3, cDD

Repare que se f fosse Times denotaria multiplicação e se g fosse Plus indicaria adição; então retomaríamos o produto
escalar:
097739Vinicius.nb 29

Inner@Times, 81, 2, 3<, 8a, b, c<, PlusD

a+2b+3c

Uma maneira de pensar no comando Inner é na multiplicação de matrizes de uma linha vezes a coluna.

H 1 2 3 L. b  MatrixForm
a

c
Ha+2b+3c L

Perceba que o comprimento não precisa ter o mesmo número de algarismos que o primeiro termo, mas obteremos o produto
como se fosse distributiva.

b .H 1 2 3 4 L  MatrixForm
a

c
a 2a 3a 4a
b 2b 3b 4b
c 2c 3c 4c

Essa operação pode ser generalizada usando o comando Outer

Outer@f, 8a, b, c<, 81, 2, 3, 4<D  MatrixForm

f@a, 1D f@a, 2D f@a, 3D f@a, 4D


f@b, 1D f@b, 2D f@b, 3D f@b, 4D
f@c, 1D f@c, 2D f@c, 3D f@c, 4D

Se usamos Times no lugar de f, recuperaremos o produto requerido:

Outer@Times, 8a, b, c<, 81, 2, 3, 4<D  MatrixForm

a 2a 3a 4a
b 2b 3b 4b
c 2c 3c 4c

O produto vetorial entre dois vetores é o vetor ortogonal a eles dois. Para fazer esse tipo de multiplicação basta usar o
CrossProduct
Para fazê - lo, primeiro é preciso ativar o pacote VectorAnalysis com o seguinte codigo:
<< "VectorAnalysis`"

prodvet = CrossProduct@81, 2, 3<, 81, 1, 1<D

8- 1, 2, - 1<

Ÿ Sobre a Versão 7.0

A versão 7.0, além de trazer novas facilidades nas ferrementas, botões e novas interfaces, também traz novos comandos,
como Cone, Tube, BSplineCurve, DateListLogPlot, ListCurvePathPlot, FindCurvePathStreamPlot, VectorPlot, entre outros.
Explorando os novos comandos e suas opções:

StreamPlot — faça uma torrente à partir de uma função de campo vetorial

Table@StreamPlot@8- 1 - x ^ 2 + y, 1 + x - y ^ 2<, 8x, - 3, 3<, 8y, - 3, 3<,


PlotLabel ® a, AspectRatio ® aD, 8a, 8Automatic, Full, GoldenRatio<<D
30 097739Vinicius.nb

Automatic
3

: 0 ,

-1

-2

-3

-3 -2 -1 0 1 2 3

Full
3

0 ,

-1

-2

-3
-3 -2 -1 0 1 2 3

>
097739Vinicius.nb 31

0 >

-1

-2

-3

-3 -2 -1 0 1 2 3

StreamPlot@88x, y<, 8y, - x<<, 8x, - 3, 3<, 8y, - 3, 3<D

-1

-2

-3

-3 -2 -1 0 1 2 3

VectorPlot — plot vetores à partir de uma função de campo vetorial


32 097739Vinicius.nb

VectorPlot@8y, - x<, 8x, - 3, 3<, 8y, - 3, 3<D

-1

-2

-3

-3 -2 -1 0 1 2 3

Table@VectorPlot@8- 1 - x ^ 2 + y, 1 + x - y ^ 2<, 8x, - 3, 3<, 8y, - 3, 3<,


VectorStyle ® Orange, StreamPoints ® p, PlotLabel ® pD, 8p, 8Automatic, Coarse, Fine<<D

Automatic

: 0 ,

-1

-2

-3

-3 -2 -1 0 1 2 3

,
097739Vinicius.nb 33

Coarse

0 ,

-1

-2

-3

-3 -2 -1 0 1 2 3

Fine

0 >

-1

-2

-3

-3 -2 -1 0 1 2 3

VectorPlot@8- 1 - x ^ 2 + y, 1 + x - y ^ 2<, 8x, - 3, 3<,


8y, - 3, 3<, RegionFunction ® Function@8x, y, vx, vy, n<, n > 6DD
34 097739Vinicius.nb

-1

-2

-3

-3 -2 -1 0 1 2 3

StreamDensityPlot

StreamDensityPlot@
88- 1 - x ^ 2 + y, 1 + x - y ^ 2<, Log@Norm@8- 1 - x ^ 2 + y, 1 + x - y ^ 2<D + 1D<, 8x, - 3, 3<, 8y, - 3, 3<D

-1

-2

-3

-3 -2 -1 0 1 2 3
097739Vinicius.nb 35

StreamDensityPlot@8- 1 - x ^ 2 + y, 1 + x - y ^ 2<, 8x, - 3, 3<,


8y, - 3, 3<, Mesh ® 10, MeshShading ® 8Red, Yellow, Green, None<D

-1

-2

-3

-3 -2 -1 0 1 2 3

ListVectorPlot
Plotar o campo de vetores interpolado de um específico conjunto de vetores.
ListVectorPlot@Table@8y, - x<, 8x, - 3, 3, 0.2<, 8y, - 3, 3, 0.2<DD

30

25

20

15

10

0 5 10 15 20 25 30

VectorPlot3D
36 097739Vinicius.nb

VectorPlot3D@8x, y, z<, 8x, - 1, 1<, 8y, - 1, 1<, 8z, - 1, 1<D


1

-1

-1

-1

LineIntegralConvolutionPlot

lena = ExampleData@8"TestImage", "Lena"<D


097739Vinicius.nb 37

LineIntegralConvolutionPlot@88- y, x<, lena<, 8x, - 3, 3<, 8y, - 3, 3<D

-1

-2

-3

-3 -2 -1 0 1 2 3

SpokenString - Escreve como se fala uma expressão (só que em inglês)

SpokenString@a + b ^ 2D

a plus b squared

SpokenString@Graphics@8Red, Disk@D<DD

" a graphic consisting of ListRGBColor1, 0, 0, DiskList0, 0. "

Comando Manipulate aprimorado. Agora possui mais suporte para arrumar os controles dentro da grade

Column ž Table@Manipulate@Plot@Sin@a x + bD, 8x, 0, 6<D, 88a, 2, "Multiplier"<, 1, 4<,


88b, 0, "Phase Parameter"<, 0, 10<, ControlPlacement ® pD, 8p, 8Right<<D

1.0
Multiplier

Phase Parameter

0.5

1 2 3 4 5 6

-0.5

-1.0

Ÿ Fractais

Tentando aprender algo sobre fractais, descobri alguns exemplos interessantes que tentei estudar, mas é um pouco compli-
cado e avançado para explicar. Vou deixar como material extra para dar noção do que se pode fazer.
38 097739Vinicius.nb

JuliaModified@c_, opts___D := Module@


8invImage, reducedInvImage, pointsSoFar, res<,
res = Resolution . 8opts< . 8Resolution ® 60<;
invImage := H N@81, - 1< Floor@res Sqrt@ð - cDD  resD &
ž 𠐐 Flatten L &;
reducedInvImage@points_D := Module@8newPoints<,
newPoints = Complement@invImage@pointsD, pointsSoFarD;
pointsSoFar = Union@newPoints, pointsSoFarD;
newPointsD;
pointsSoFar = Nest@invImage, 81<, 5D; FixedPoint@reducedInvImage,
pointsSoFarD; ListPlot@8Re@ðD, Im@ðD< & ž pointsSoFar,
AspectRatio ® Automatic, ImageSize ® 250,
Axes ® False, PlotRange ® 88- 1.8, 1.8<, 8- 1.8, 1.8<<,
PlotStyle ® 8Black, AbsolutePointSize@TinyD<
DD;

boundaryPic = ;

H* The image of the Mandelbrot set was generated with the following code. *L
H* The image was inserted into the initialization code to speed up *L
H* the start up of the demonstration. *L
H*
MandelFunction = CompileA88c,_Complex<<,
LengthAFixedPointListAð2 +c&,0,100,
SameTest ® HAbs@ðD>2&LEEE;
mandelData = Table@MandelFunction@x+I*yD,
8y,-1.3,1.3,2.6501<,8x,-2,0.6,2.6501<D;
kernel = 8
81,1,1<,
81,-8,1<,
81,1,1<
<;
convolvedData = Abs@ListConvolve@kernel, mandelDataDD;
boundaryPic = ArrayPlotAconvolvedData,
Frame ® False, DataRange ® 88-2,0.6<,8-1.3,1.3<<,
ColorFunction ® IGrayLevelAH1-ðL100 E&M,
ImageSize ® 250E;
*L
097739Vinicius.nb 39

Manipulate@Deploy@Grid@88boundaryPic,
Dynamic@JuliaModified@pt@@1DD + pt@@2DD I,
PlotRange ® 88- 1.8, 1.8<, 8- 1.8, 1.8<<DD<,
8Text ž Dynamic@If@pt@@2DD ³ 0,
Row@8Style@"c", ItalicD, " = ",
ToString@NumberForm@pt@@1DD, 85, 4<, NumberPadding ® 8" ", "0"<DD , " + ",
ToString@NumberForm@pt@@2DD, 85, 4<, NumberPadding ® 8" ", "0"<DD, "ä"<D,
Row@8Style@"c", ItalicD, " = ",
ToString@NumberForm@pt@@1DD, 85, 4<, NumberPadding ® 8" ", "0"<DD
, " - ",
ToString@NumberForm@- pt@@2DD, 85, 4<, NumberPadding ® 8" ", "0"<DD, "ä"<DDD,
SpanFromLeft<
<DD,
88pt, 80, 0<<, 8- 2, - 1.3<, 80.6, 1.3<, Locator<,
SaveDefinitions ® TrueD

c = -1.7140 + 0.0250ä

"Julia Sets and the Mandelbrot Set"

Ÿ Contributed by: Mark McClure

n = 40; tmax = 25; dt = 0.1; h = 0.25; g = 0.2;


mu = 0.07; zlist = 8Sqrt@3D + I, - Sqrt@3D + I, - 2 I<;
image =
Table@z = x + I y; v = a = a1 = 0; Do@z += v dt + H4 a - a1L dt ^ 2  6; vpredict = v + H3 a - a1L dt  2;
a2 = Plus žž HHzlist - zL  Hh ^ 2 + Abs@zlist - zD ^ 2L ^ 1.5L - g z - mu vpredict;
v += H2 a2 + 5 a - a1L dt  6; a1 = a; a = a2, 8t, 0, tmax, dt<D; r = Abs@z - zlistD;
Hue@Position@r, Min@rDD@@1, 1DD  3D, 8y, - 5.0, 5.0, 10.0  n<, 8x, - 5.0, 5.0, 10.0  n<D;
Show@Graphics@RasterArray@imageDD, AspectRatio ® 1D

RasterArray::obs : RasterArray is obsolete. Translating to Raster. ‡


40 097739Vinicius.nb

ta = tb = 1.91 + 0.05 I; tab = Hta tb + Sqrt@ta ^ 2 tb ^ 2 - 4 Hta ^ 2 + tb ^ 2LDL  2;


z0 = Htab - 2L tb  Htb tab - 2 ta + 2 I tabL;
b = 88tb - 2 I, tb<, 8tb, tb + 2 I<<  2; B = Inverse@bD;
a = 88tab, Htab - 2L  z0<, 8Htab + 2L z0, tab<<.B; A = Inverse@aD;
Reflect@88a_, b_<, 8c_, d_<<, z_D := Hb + a zL  Hd + c zL;
ReflectList@C_, zlist_D := Reflect@C, ðD & ž zlist;
Children@zlist_D := ReflectList@ð, zlistD & ž 8a, b, A, B<;
zlist = 80.23 + 0.03 I, 0.18 + 0.05 I, 0.62 + 0.45 I, 0.86 + 0.73 I, 0.91 + 0.89 I, 0.88 + 0.97 I,
0.75 + 0.98 I, 0.48 + 0.88 I, 0.25 + 0.85 I, 0.04 + 0.79 I, - 0.02 + 0.67 I, - 0.1 + 0.78 I,
- 0.14 + 0.77 I, - 0.24 + 0.84 I, - 0.24 + 0.77 I, - 0.41 + 0.88 I, - 0.39 + 0.77 I,
- 0.5 + 0.82 I, - 0.48 + 0.74 I, - 0.82 + I, - 0.86 + 0.96 I, - 0.68 + 0.79 I, - 0.7 + 0.74 I,
- 0.89 + 0.81 I, - 0.74 + 0.64 I, - 0.77 + 0.6 I, - 0.91 + 0.65 I, - 0.8 + 0.51 I,
- 0.87 + 0.44 I, - 0.71 + 0.32 I, - 0.44 + 0.19 I, - 0.07 + 0.08 I, - 0.38 + 0.03 I<;
zlists1 = zlists2 = 80.5 + 0.125 Join@Reverse@Conjugate@zlistDD, zlistD<;
test@zlist1_, zlist2_D := Abs@zlist2@@1DD - zlist1@@1DDD < 0.05; While@zlists2 =!= 8<,
zlists2 = Complement@Flatten@Children ž zlists2, 1D, zlists1, SameTest ® testD;
zlists1 = Union@zlists2, zlists1, SameTest ® testDD;
Show@Graphics@Line@8Re@ðD, Im@ðD< & ž ðD & ž zlists1D, AspectRatio ® AutomaticD
097739Vinicius.nb 41
42 097739Vinicius.nb

Mandelbrot@zc_D := Length@NestWhileList@ð ^ 2 + zc &, 0, Abs@ðD < 2 &, 1, 1000DD;


n = 275; image = Table@0, 8n<, 8n<D;
Do@If@Mandelbrot@xc + I ycD < 1000, Module@8z = 0, iter = 0<,
While@Abs@zD < 2, z = z ^ 2 + xc + I yc; 8i, j< = Floor@n 8Im@zD + 1.5, Re@zD + 2<  3D;
If@0 < i £ n && 0 < j £ n, image@@i, jDD += xc + I ycD; iter ++DDD,
8xc, - 2.0, 1.0, 0.01<, 8yc, - 1.5, 1.5, 0.01<D;
Hue2@hue_, x_D := Hue@hue, Min@1, 2 H1 - xLD, Min@1, 2 xDD;
Show@Graphics@
RasterArray@Map@Hue2@Arg@ðD  Pi, Min@Abs@ðD  18, 1DD &, image, 82<DD, AspectRatio ® 1DD

RasterArray::obs : RasterArray is obsolete. Translating to Raster. ‡


097739Vinicius.nb 43

order = 12; n = 275; image = Table@0.0, 8n<, 8n<D;


Do@
Do@z = N@Root@Sum@H2 Mod@Floor@Ht - 1L  2 ^ iD, 2D - 1L ð ^ Horder - iL, 8i, 0, order<D, rootDD;
8j, i< = Round@n H8Re@zD, Im@zD<  1.5 + 1L  2D;
If@0 < i £ n && 0 < j £ n, image@@i, jDD ++D, 8root, 1, order<D, 8t, 1, 2 ^ order<D;
ListDensityPlot@image, Mesh ® False, Frame ® False, PlotRange ® 80, 4<D

Julia = Compile@88z, _Complex<<,


Length@FixedPointList@ð ^ 3 + zc &, z, 100, SameTest ® HAbs@ðD > 2 &LDDD;
zc = - 0.5 - 0.05 I;
DensityPlot@Julia@x + I yD, 8x, - 1.15, 1.15<,
8y, - 1.15, 1.15<, PlotPoints ® 275, Mesh ® False, Frame ® False,
ColorFunction ® HRGBColor@Min@2 ð ^ 2, 1D, Max@2 ð - 1, 0D, Min@2 ð, 1DD &LD
44 097739Vinicius.nb

Σ = 3; Ρ = 26.5; Β = 1;
vinny =
8x@tD, y@tD, z@tD< . NDSolve@8x '@tD Š Σ Hy@tD - x@tDL, y '@tD Š Ρ x@tD - x@tD z@tD - y@tD,
z '@tD Š x@tD y@tD - Β z@tD, x@0D Š 0, y@0D Š 1, z@0D Š 1<,
8x@tD, y@tD, z@tD<, 8t, 0, 100<, MaxSteps ® 10 000D@@1DD;
ParametricPlot3D@vinny, 8t, 0, 100<, PlotPoints ® 10 000D

0 10 20 30 40

-20

-10

10

20

-10
-5
0
5
10

Anda mungkin juga menyukai