Computadores no Ensino da Matemática
Mestrado em Ensino da Matemática
Ano lectivo 2001 — 2002
Aula nº1
Investigaram-se algumas das operações básicas do Geometer's
Sketchpad. Entre outras coisas, viu-se como ilustrar o
enunciado do teorema de Pitágoras.
Voltar ao princípio.
Aula nº2
Estudou-se a criação de gráficos de funções e o comando
locus. Este comando foi usado na criação do cónica que se
segue:
Voltar ao princípio.
Aula nº3
Esteve-se a ver como criar tools, tendo-se
criado um que constrói o inverso de um ponto relativamente a uma
circunferência. Isto foi usado para estudar a inversão de uma recta
relativamente a uma circunferência, que se pode ver na figura
abaixo:
Também se viu como aproveitar o facto de o Geometer's
Sketchpad não produzir mensagens de erro quando se lhe pede
para fazer construções impossíveis (intersecção de rectas paralelas,
por exemplo). Segue-se um exemplo do uso desta propriedade; o
sketch que se segue determina o caminho
mais curto entre dois pontos A e
B que passa por uma recta dada:
Voltar ao princípio.
Aula nº4
Esteve-se a ver como se usa o comando Iterate
para construções iterativas.
O sketch que se segue ilustra a propriedade de
reflexão das parábolas: um raio luminoso perpendicular à directriz da
parábola produz, ao reflectir-se nesta, um raio que passa pelo foco.
Repare-se que contém um botão de animação.
O Geometer's Sketchpad permite guardar em
formato HTML os sketches
por ele produzidos. No entanto, nem todas as contruções são passíveis
de serem guardadas naquele formato; por exemplo, as funções definidas
com a calculadora ou as abcisas e as ordenadas de pontos não são
convertíveis. Problema: descobrir como se faz o
sketch cuja conversão tem o seguinte
aspecto:
Voltar ao princípio.
Aula nº5
Esteve-se a ver como se usa o comando Trace.
Um exemplo, foi a construção da cardióide, que é um caso particular
da epiciclóide:
Esteve-se a ver como construir páginas em HTML
usando o Netscape Composer.
Texto e imagens
Foi visto como escrever texto e introduzir diversos efeitos (texto
em negrito ou em itálico).
Além disso, viu-se como ir buscar imagens a páginas da Internet e como
as introduzir num texto.
Listas
Foi visto como criar três tipos de listas:
Listas numeradas:
Primeiro artigo
Segundo artigo
Listas não numeradas:
Listas de definições:
- Lista numerada
- Lista onde aparece um número à esquerda de cada artigo, começando
em 1 e aumentando uma unidade de cada vez.
- Lista não numerada
- Lista onde aparece um símbolo (sempre o mesmo, geralmente um disco
preto ou uma circunferência) à esquerda de cada artigo.
Applets
Esteve-se a ver como criar applets de
Java com o
Geometer's Sketchpad e incluí-los numa página em
HTML.
Voltar ao princípio.
Aula nº6
Nesta aula, fez-se uma introdução ao Maple.
Conceitos básicos
Qualquer instrução do Maple
deve terminar com ponto e vírgula (;) ou com dois pontos (:).
> 2+2;
> 2+2:
Em qualquer dos casos,
o Maple executa o comando; a diferença reside no facto de
o Maple só mostrar o resultado obtido se a instrução
terminar como ponto e vírgula.
O símbolo % designa o
resultado da última operação efectuada; %% designa o penúltimo e
%%% designa o antepenúltimo.
Para se atribuir um valor a uma sequência de caracteres
(abc, por exemplo)
escreve-se abc := seguido do valor pretendido. Por exemplo, para
atribuir a a o valor do último cálculo faz-se:
> a:=%;
Acessoriamente, repare-se que
isto mostra que o Maple
fez efectivamente o segundo cálculo, embora não tenha mostrado o
resultado.
> b:=2:c:=3:
> b;
> c;
Agora que a,
b e c estão
definidos, é interessante ver o que se obtém se se faz:
>
a:=b:b:=c:c:=a:
A resposta obtém-se fazendo
>
a;b;c;
Como se pode ver, o
resultado não é uma permutação de
a, b e c.
Os nomes das variáveis não
estão de modo algum limitados a um único caracter:
>
numero:=10;
As funções definem-se do seguinte modo:
>
f:=x->x*sin(x);
Gráficos
>
plot(f(x),x=0..2*Pi);
A derivada de f representa-se
por D(f), pelo que os gráficos de
f e de
f' podem ser obtidos simultaneamente fazendo:
>
plot({f(x),D(f)(x)},x=0..2*Pi);
Se se clicar na imagem com o
botão direito do rato, obtém-se um menu que permite alterar certas
características da imagem. Também é possível descrever certas
características ao escrever o comando:
>
plot({f(x),D(f)(x)},x=0..2*Pi,color=[blue,black]);
Cálculo simbólico
Considere-se agora a função:
>
p:=x->1-x^2;
Quer-se estudar a área limitada por uma porção da parábola; para tal
define-se:
> a:=(k,n)->-1+2*k/n;
Então a área da região poligonal é dada por:
>
sum((p(a(k,n))+p(a(k-1,n)))/n,k=1..n);
Isto pode ser simplificado fazendo:
> simplify(%);
Qual é a área da região entre a parábola e o eixo dos
xx? É dada por
> int(1-x^2,x = -1 .. 1);
É de esperar que este valor seja o limite da soma das áreas das
figuras poligonais. De facto assim é, conforme se pode verificar fazendo
> limit(%%,n=infinity);
Voltar ao princípio.
Aula nº7
Cálculo simbólico (continuação)
O Maple conhece o valor de pi:
> Pi;
Isto pode ser calculado numericamente, bastando para tal fazer
> evalf(%);
ou, caso se queira ver o resultado com (por exemplo) 30 casas decimais
> evalf(%%,30);
Outra maneira de obter este resultado consiste em fazer
> evalf[30](Pi);
Sequências e listas
Uma sequência é apenas uma sequência de símbolos separados por vírgulas.
Por exemplo:
> l=1,2,3;
Agora, se se quiser obter novamente esta sequência, basta fazer:
> l;
Uma lista é uma sequência enquadrada por parêntesis rectos:
> l=[1,2,4,8,16];
Se se quiser obter, por exemplo, o terceiro elemento de uma lista
(ou de uma sequência), basta fazer:
> l[3];
Isto também funciona para sequências. Em contrapartida, o seguinte
comando, que dá o número de elementos de uma lista, não funciona para
sequências:
> nops[l];
Pode-se agora definir uma função que associa a cada lista a soma
dos seus elementos.
> soma:=l->sum(l[k],k=1..nops(l));
> soma(l);
Resolução de equações
Para se resolver equações, faz-se
> solve(x^3=x+a,x);
Se se quer definir a função que a cada a associa
a lista das soluções da equação anterior, emprega-se o comando
unapply:
> so:=unapply([solve(x^3=x+a,x)],a);
Para determinar numericamente as soluções da equação para um valor concreto de
a, basta agora fazer
> evalf(so(2));
Considere-se agora o seguinte problema. Quer-se associar a cada
função polinomial p o gráfico da função
definida por p(x)*x*(x-1) no intervalo
[0,1], juntamente com uma recta horizontal tangente ao gráfico
anterior. Começa-se por definir:
> pol:=f->unapply(f(x)*x*(x-1),x);
Para se ver que isto realmente funciona, basta ver que se se definir:
> f:=x->x-1/2;
então tem-se
> pol(f)(x);
Então, recorrendo ao comando fsolve, que fornece
soluções numéricas de equações, faz-se
> rolle:=p->plot([pol(p)(x),pol(p)([fsolve(D(pol(p))(x)=0,x=0..1)][1])],x=0..1);
Aplicando isto à função f acima definida,
obtém-se:
> rolle(f);
Voltar ao princípio.
Aula nº8
Gráficos de funções
Considere-se a seguinte função:
> f:=x->x*sin(Pi*x);
Quer-se ilustrar o teorema da média de Lagrange usando a função
f. Para tal, quer-se definir uma função que,
partindo de uma função f e duas listas
p e d de dois
números cada, desenhe:
- o gráfico (a vermelho) de f (restrita ao intervalo
cujos extremos são dados pela lista d);
- o segmento de recta (a azul) que une (p1,f(p1))
a (p2,f(p2));
- uma recta (a verde) tangente ao gráfico que seja paralela ao
segmento anterior.
Isto pode ser obtido do seguinte modo:
> graf:=(f,d,p)->plot([f(x),[[p[1],f(p[1])],[p[2],f(p[2])]],
(f(p[2])-f(p[1]))/(p[2]-p[1])*(x-fsolve(D(f)(x)=
(f(p[2])-f(p[1]))/(p[2]-p[1]),x=p[1]..p[2]))+
f(fsolve(D(f)(x)=(f(p[2])-f(p[1]))/(p[2]-p[1]),x=p[1]..p[2]))],
x=d[1]..d[2],color=[red,blue,green],view=[d[1]..d[2],-3..3]);
A última instrução opcional faz com que se veja o gráfico com
y a variar entre –3 e 3. Eis um exemplo de
aplicação desta instrução:
> graf[f,[-1/2,7/2],[1/2,5/2]]
Naturalmente, esta maneira de definir a instrução presta-se muita a
que se cometam erros de difícil detecção. É preferível recorrer à instrução
proc, a qual permite definir variáveis locais.
> grafb := proc(f,d,p)
local decl, m;
decl:=(f(p[2])-f(p[1]))/(p[2]-p[1]):
m:=fsolve(D(f)(x)=decl,x=p[1]..p[2]):
plot([f(x),[[p[1],f(p[1])],[p[2],f(p[2])]],decl*(x-m)+f(m)],
x=d[1]..d[2],color=[red,blue,green],view=[d[1]..d[2],-3..3]);
end proc;
Agora tem-se:
> grafb(f,[-1/2,7/2],[1/2,5/2]);
Voltar ao princípio.
Aula nº9
Sequências
Problema: obter os quadrados dos primeiros vinte inteiros. Isto
pode ser feito do seguinte modo:
> q:=seq(i^2,i=1..20);
Agora quer-se obter os logaritmos dos quadrados dos primeiros vinte
inteiros. Naturalmente, basta repetir o que foi feito atrás, mas também
se pode usar o que já se encontra feito.
> seq(evalf(log(i)),i=q);
Gráficos (continuação)
O seguinte comando «carrega» o package «plots».
> with(plots);
Warning, the name changecoords has been redefined
Nota: Para se consultar, através do menu
Help, uma das instruções definidas neste
package, por exemplo a função complexplot, é
preciso fazer uma busca por «plots,complexplot».
Considere-se agora a sequência
p:=seq([1/2-1/n,5/2-1/n],n=1..20);
Pode-se agora obter uma sequência de gráficos fazendo:
S:=f->seq(graf(f,[-1/2,7/2],i),i=p);
É possível visualizar os gráficos sobrepostos fazendo:
display(S(F));
O que é mais interessante é que se pode agora obter uma animação fazendo
> display(S(f),insequence=true);
Gráficos tridimensionais
Quer-se agora criar um cone. Pode-se fazer
>
plot3d(z,theta=-Pi..Pi,z=-1..1,coords=cylindrical);
ou então
>
plot3d(z,theta=-Pi..Pi,z=-1..1,coords=cylindrical,style=patchnogrid);
Quer-se ilustrar como é
possível obter as cónicas intersectando um plano com um cone.
Considere-se o seguinte cone:
>
cone:=plot3d(z,theta=-Pi..Pi,z=-3/2..3/2,coords=cylindrical,
scaling=constrained,view=[-3/2..3/2,-3/2..3/2,-3/2..3/2]):
Define-se agora a função
>
S:=p->display(plot3d([a,1+b*(p-1),b],a=-3/2..3/2,b=-3/2..3/2,
scaling=constrained,style=patchnogrid,
view=[-3/2..3/2,-3/2..3/2,-3/2..3/2]),cone);
e considera-se a lista
> lista:=[seq(-2+k/3,k=0..12)];
A intersecção do plano com o cone pode ser visualizado fazendo
>
display([seq(S(c),c=lista)],insequence=true);
Voltar ao princípio.
Aula nº10
Gráficos (continuação)
Como fazer com que o Maple faça uma
circunferência? Há várias maneiras. Uma que é natural, dado o que
se acabou de ver, é a seguinte:
>
display(plot(sqrt(1-x^2),x=-1..1,scaling=constrained,xtickmarks=4,
labels=["",""]),plot(-sqrt(1-x^2),x=-1..1));
Matematicamente, é mais natural descrever a circunferências
parametricamente, fazendo
>
plot([cos(t),sin(t),t=0..2*Pi],scaling=constrained,xtickmarks=4,
labels=["",""]);
ou
>
plot([(t^2-1)/(t^2+1),2*t/(t^2+1),t=-infinity..infinity],
scaling=constrained,xtickmarks=4,labels=["",""]);
Também podem ser empregues coordenadas polares
> plot([1,t,t=0..2*Pi],coords=polar,scaling=constrained,xtickmarks=4,
labels=["",""]);
Finalmente, há o recurso às funções definidas implicitamente
>
implicitplot(x^2+y^2=1,x=-1..1,y=-1..1,
scaling=constrained,xtickmarks=4,labels=["",""]);
Uso de números aleatórios
Para criar números aleatórios faz-se
>
rand();
Isto produz um número inteiro
não negativo com não mais do que 12 algarismos. Assim, pode-se
criar uma lista de pares de pontos aleatórios do quadrado que tem
por vértices (1,1), (1,-1), (-1,1) e (-1,-1) fazendo
>
lista:=[seq([2*rand()/10^12-1,2*rand()/10^12-1],k=1..1000)]:
A lista pode ser visualizada
fazendo
>
plot(lista,style=point,symbol=cross,scaling=constrained,color=green);
ou então
>
pointplot(lista,symbol=cross,scaling=constrained,color=green);
Como ver quais destes pontos
ficam na circunferência unitária? Pode-se fazer
>
plot_lista:=plot(lista,style=point,symbol=cross,scaling=constrained,
color=green):
circunf:=plot([cos(t),sin(t),t=0..2*Pi],scaling=constrained,xtickmarks=4,
labels=["",""]):
display({circunf,plot_lista});
Para definir uma função «por bocados» faz-se, por exemplo
>
f:=x->piecewise(x<-1,-1,x>1,1,x);
O seu gráfico é dado por
>
plot(f(x),x=-3..3);
Voltar ao princípio.
Aula nº11
Uso de números aleatórios (continuação)
Vai-se regressar agora aos pontos aleatórios do quadrado que tem
por vértices (1,1), (1,-1), (-1,1) e (-1,-1). Dado um tal ponto, como
saber se está ou não na circunferência unitária? Basta definir a
função
>
d:=p->piecewise(p[1]^2+p[2]^2<1,1,0);
e a função
>
s:=l->sum(d(l[k]),k=1..nops(l));
Aplicando isto à lista anterior, obtém-se
>
s(lista);
Logo, a probabilidade de um
ponto daquela lista pertencer à circunferência unitária é igual
a
> %/1000.;
Repare-se que a probabilidade de um elemento de uma lista
arbitrária pertencer à circunferência unitária é igual a
>
evalf(Pi/4);
Cálculo simbólico (continuação)
Considere-se o seguinte problema: uma cabra está amarrada por uma
corda a um poste localizado na borda de um terreno circular. Qual
deverá ser o comprimento da corda que faz com que a cabra tenha acesso
exactamente a metade do terreno? Em termos geométricos, o problema
pode ser formulado do seguinte modo: dados dois círculos, com o centro
do segundo situado na fronteira do primeiro, qual deverá ser o raio do
segundo de modo que a área da intercecção dos círculos seja igual a
metade da do primeiro? Como só o quociente dos raios conta, vai-se
supor que o primeiro círculo é o círculo unitário do plano e que o
segundo tem o centro em (0,-1). Vão-se começar por determinar os
pontos de intersecção das fronteiras dos círculos. Para isso,
definem-se as funções
> f:=x->-sqrt(1-x^2);
e
> g:=(x,r)->sqrt(r^2-x^2)-1;
Os pontos de intersecção são obtidos resolvendo a equação
> solve(f(x)=g(x,r),x);
É útil definir
> l:=r->[solve(f(x)=g(x,r),x)][1];
Então a área da intersecção das circunferências é dada por
> int(g(x,r)-f(x),x=-l(r)..l(r));
Para se compreender melhor esta expressão, convém
simplificá-la. Para tal vai-se supor que r é
maior do que 0 e menor do que a raiz quadrada de 2, o que se pode
justificar geometricamente.
> assume(0<r,r<sqrt(2));
Então o integral anterior pode ser simplificado fazendo
> simplify(int(g(x,r)-f(x),x=-l(r)..l(r)));
É mesmo possível definir uma função a partir desta expressão
fazendo
> h:=unapply(simplify(int(g(x,r)-f(x),x=-l(r)..l(r))),r);
O problema original pode agora ser resolvido fazendo
> fsolve(h(r)=Pi/2,r);
Teoria dos números
Considere-se agora a seguinte função
>
t:=n->piecewise(igcd(n,2)=2,n/2,3*n+1);
Note-se que igcd é a função que a
dois inteiros associa o seu máximo divisor comum.
Assim, o gráfico de t pode ser
visualizado fazendo
>
plot([seq([n,t(n)],n=1..30)],style=point,symbol=circle);
Para se ver o gráfico da composta de t
consigo própria 6 vezes, pode-se fazer
>
plot([seq([n,(t@@6)(n)],n=1..30)],style=point,symbol=circle);
Voltar ao princípio.
Aula nº12
Teoria dos números (continuação)
Considere-se agora a função
>
ispseudo:=n->piecewise(frac((2^n-2)/n)>0,false,true);
Esta função é um teste que determina se, para um dado número natural
n, 2n-2 é ou
não múltiplo de n. Vejamos o que dá este teste
aplicado aos primeiros vinte números naturais.
> [seq([i,ispseudo(i)],i=1..20)];
Há aqui um padrão óbvio: este teste dá «true»
no caso de 1 ou dos números primos e dá «false»
nos restantes casos. Será que é sempre assim? Deduz-se do pequeno teorema
de Fermat que, efectivamente, se n for primo,
então 2n-2 é múltiplo de
n. Será a implicação recíproca verdadeira?
É conveniente conhecer a função if.
Por exemplo, se se define
> f:=n->if
n>0 then n else -n end if;
então tem-se
> f(3);
f(-4/3);
Para testar se a implicação recíproca é verdadeira, começa-se por
definir a função:
> teste:=n->if ispseudo(n) and
not isprime(n) then 1 else 0 end if;
Esta função dá 1 se n não for primo mas
«passar» no teste anterior e dá 0 caso contrário. Quer-se
então calcular
> add(teste(n),n=2..5000);
Isto mostra que há 16 números compostos n
entre 2 e 5000 tais que 2n-2 é
múltiplo de n. Quer-se agora ver quais são e
quais são as respectivas decomposições em factores primos. Este último aspecto
do problema é de solução simples; basta recorrer à função
ifactor.
> ifactor(341);
Para resolver o problema, faz-se o seguinte: começa-se por uma lista vazia
e depois, para cada número n de 1 a 5000, vê-se se
é ou não verdade que não é primo e que passa o teste. Se for este o caso,
acrescenta-se à lista o número em questão bem como a sua
decomposição em factores primos. Como é que se acrescenta um elemento
a uma lista? Recorre-se à função op, a qual,
aplicada a uma lista (ou a um conjunto) fornece a sequência correspondente.
Por exemplo, se se define
> lista:=[1,3,6,10];
e se se quer acrescentar 15 a esta lista basta fazer
> lista:=[op(lista),15];
Logo, para resolver o problema proposta basta fazer
> lista:=[]:
for n from 1 to 5000 do if (ispseudo(n) and not isprime(n)) then
lista:=[op(lista),[n,ifactor(n)]] end if end do;
lista;
Voltar ao princípio.