Aula nº16

Sequências e listas

Considere-se a solução da seguinte equação

> solve(x^3=x,x);

0, 1, -1

Como se pode ver, o resultado é uma sequência de valores separados por vírgulas. Mais geralmente, considere-se a seguinte equação:

> so:=solve(x^3=x+a,x);

so := 1/6*(108*a+12*sqrt(-12+81*a^2))^(1/3)+2/((108...

so := 1/6*(108*a+12*sqrt(-12+81*a^2))^(1/3)+2/((108...

so := 1/6*(108*a+12*sqrt(-12+81*a^2))^(1/3)+2/((108...

Se se quer saber quais são as raízes quando, por exemplo, a=2, basta fazer

> eval(so,a=2);

1/6*(216+12*sqrt(312))^(1/3)+2/((216+12*sqrt(312))^...

1/6*(216+12*sqrt(312))^(1/3)+2/((216+12*sqrt(312))^...

1/6*(216+12*sqrt(312))^(1/3)+2/((216+12*sqrt(312))^...

Em termos numéricos, isto dá

> evalf(%);

1.521379707, -.7606898534+.8578736270*I, -.76068985...

Um problema com este tipo de respostas reside no facto de que, por vezes, se quer apenas uma solução e não uma sequência delas (tal como na ilustração do teorema de Lagrange). Para obter isso, é conveniente considerar um objecto básico do Maple: as listas. São sequêncas de expressões enquadradas por parêntesis rectos. Por exemplo:

> lista:=[1,2,4,8,16];

lista := [1, 2, 4, 8, 16]

Um elemento de uma lista (o terceiro, por exemplo) pode ser obtido fazendo

> lista[3];

4

e o número total de elementos de uma lista obtém-se com

> nops(lista);

5

Por exemplo, a soma dos elementos da lista anterior pode ser obtida fazendo

> sum(lista[i],i=1..nops(lista));

31

Isto pode ser sistematizado, definindo a função:

> soma:=l->sum(l[k],k=1..nops(l));

soma := proc (l) options operator, arrow; sum(l[k],...

> soma(lista);

31

Registe-se que existe um comando para produzir sequências:

> seq(2^n,n=0..4);

1, 2, 4, 8, 16

A lista acima definida também poderia ter sido obtida fazendo

> lista:=[%];

lista := [1, 2, 4, 8, 16]

Voltando à questão das soluções de equações: é agora fácil de ver que a primeira das três soluções da equação anterior se obtém fazendo

> evalf(eval([so][1],a=2));

1.521379707

Gráficos (continuação)

Vai-se agora voltar à ilustração geométrica do teorema de Lagrange. Considere-se a definição:

> Lagrange:=(f,p)->[fsolve(D(f)(x)=(f(p[2])-f(p[1]))/(p[2]-p[1]),
x,p[1]..p[2])][1];

Lagrange := proc (f, p) options operator, arrow; [f...

Se se definir

> f:=x->x*sin(x*Pi);

f := proc (x) options operator, arrow; x*sin(x*Pi) ...

então

> Lagrange(f,[1/2,5/2]);

produz

1.623271644

A função Lagrange também pode ser definida por

> Lagrange:=(f,p)->fsolve(D(f)(x)=(f(p[2])-f(p[1]))/(p[2]-p[1]),
x,p[1]..p[2],maxsols=1);

Lagrange := proc (f, p) options operator, arrow; fs...