• Aucun résultat trouvé

Fibr´ e vectoriel hermitien, degr´ e d’Arakelov et pente arithm´ etique

Dans le document TH`ESE DE DOCTORAT (Page 44-50)

1.7 Fibr´ es vectoriels hermitiens sur les vari´ et´ es arithm´ etiques

1.7.1 Fibr´ e vectoriel hermitien, degr´ e d’Arakelov et pente arithm´ etique

6.3

M´etodo de Runge-Kutta

Na aproximac¸˜ao3.24, usada no m´etodo de Euler, calcula-se o valor da func¸˜ao no instante tn+1 a

partir da derivada no instante tn. Para melhorar o m´etodo ser´a preciso usar uma melhor aproxima-

c¸˜ao ao valor m´edio da derivada, no intervalo [tn,tn+ h].

No m´etodo de Runge-Kutta de quarta ordem, o valor da derivada, d, obt´em-se a partir da m´edia

das derivadas em 4 pontos diferentes, com pesos diferentes (figura6.6).

t x t0 t0 + h/ 2 t0 + h x0 x0 + hd1 /2 x0 + hd2 /2 x0 + hd3 1 2 3 4 d1 d2 d3 d4

Figura 6.6: Os quatro valores da derivada usados no m´etodo de Runge-Kutta de quarta ordem.

Neste caso para o sistema ˙x= x + t2; a verde, mostra-se a soluc¸˜ao exacta desse sistema.

Comec¸a-se por calcular a derivada no ponto inicial, tal como no m´etodo de Euler:

d1= f (t0, x0) (6.19)

a seguir, realiza-se um deslocamento na direcc¸˜ao dessa derivada, avanc¸ando uma distˆancia h/2 no

tempo, at´e um ponto 1 (ver figura6.6). Nesse ponto 1, calcula-se um segundo valor da derivada:

d2= f (t0+ h/2, x0+ (h/2)d1) (6.20)

Esse novo valor da derivada ´e usado novamente, para realizar outro deslocamento a partir do ponto inicial, avanc¸ando h/2 no sentido do tempo, at´e um outro ponto 2, onde ´e calculado um terceiro valor da derivada:

d3= f (t0+ h/2, x0+ (h/2)d2) (6.21)

seguindo o a direcc¸˜ao da derivada d3, realiza-se um terceiro deslocamento, a partir do ponto inicial,

desta vez avanc¸ando uma distˆancia h no eixo do tempo, para chegar at´e um ponto 3, onde se calcula um quarto valor da derivada:

d4= f (t0+ h, x0+ hd3) (6.22)

Pode mostrar-se que o valor da derivada que conduz a um erro m´ınimo ´e a combinac¸˜ao linear:

d= 1

no exemplo da figura6.6, esse valor m´edio da derivada desloca o ponto inicial at´e o ponto 4, que est´a bastante perto da soluc¸˜ao exacta da equac¸˜ao.

Em cada ponto (tn, xn), calcula-se o valor m´edio da derivada usando o mesmo processo, e com

esse valor m´edio, d, obt´em-se o ponto seguinte na forma habitual:

tn+1= tn+ h xn+1= xn+ hd (6.24)

Usando a linguagem de programac¸˜ao do Maxima, podemos implementar este m´etodo para resolver o sistema ˙x= f (t, x), no intervalo [t0,tf], a partir da condic¸˜ao inicial x(t0) = x0:

rk(f, x, x_0, [t, x_0, x_f, h])

as vari´aveis x e t ser˜ao dadas como argumentos para o programa, para que o programa seja mais flex´ıvel; a vari´avel de estado e a vari´avel independente poder˜ao ser outras diferentes de x e t. O resultado do programa dever´a ser uma lista com todos os valores discretos de t, x no intervalo [t0,tf].

O programa que se mostra a seguir produz o resultado esperado. A parte principal do programa ´e o ciclo for, onde ´e implementado o m´etodo de Runge-Kutta de quarta ordem, para calcular o valor m´edio da derivada em cada intervalo.

rk(edo, estado, inicial, dominio) := block

([f:edo, var:[estado], xv:inicial, t0:dominio[2], h:dominio[4], t, n, d1, d2, d3, d4, dados, numer:true],

n: entier((dominio[3] - dominio[2])/h), t: t0,

dados: [[t,xv]], for i thru n do (

d1: ev(f, dominio[1] = t, var[1] = xv),

d2: ev(f, dominio[1] = t + h/2, var[1] = xv + h*d1/2), d3: ev(f, dominio[1] = t + h/2, var[1] = xv + h*d2/2), d4: ev(f, dominio[1] = t + h, var[1] = xv + h*d3), xv: xv + h*(d1 + 2*d2 + 2*d3 + d4)/6,

t: t0 + i*h,

dados: cons([t, xv], dados)), reverse(dados))$

Observe a sintaxe para incluir mais do que um comando na definic¸˜ao do programa rk; os comandos escrevem-se entre parˆentesis, separados por v´ırgulas, mas sem v´ırgula ap´os o ´ultimo comando. N˜ao podem ser usados outros caracteres como “;” ou “$” para terminar um comando dado entre parˆentesis.

O programa usa o comando block que permite definir vari´aveis locais. O primeiro elemento dentro do bloco block tem que ser uma lista das vari´aveis locais, `as quais pode ser dado um valor inicial. Por exemplo, foi definida uma vari´avel local f que ter´a uma c´opia da primeira express˜ao que for dada ao programa.

6.3 M´etodo de Runge-Kutta 107 O ´ultimo argumento dado ao programa dever´a ser uma lista com quatro elementos que definem o dom´ınio onde ser´a integrada a equac¸˜ao do sistema. O primeiro elemento da lista (dominio[1]) ´e o nome da vari´avel independente (geralmente o tempo, mas pode ser outra). O segundo e terceiro elementos na lista (dominio[2] e (dominio[3]) fixam os valores inicial e final para essa vari´avel independente, e o quarto valor na lista (dominio[4]) ´e o incremento, h, da vari´avel independente, entre dois pontos consecutivos.

`

A vari´avel numer foi dado um valor verdadeiro, para garantir que o resultado de todas as operac¸˜oes entre n´umeros seja um valor num´erico e n˜ao uma express˜ao alg´ebrica.

O resultados de cada iterac¸˜ao s˜ao acrescentados `a lista dados, e no fim do programa a lista ´e invertida e impressa para que seja dada como valor de sa´ıda do programa.

O programa pode ser ainda melhorado: em alguns casos, o valor absoluto da vari´avel dinˆamica aumenta rapidamente e o programa falha. Para evitar esse problema, o resultado obtido em cada iterac¸˜ao ser´a armazenado na lista dos resultados, unicamente se o seu valor absoluto n˜ao ultrapas-

sar 10100, caso contr´ario, n˜ao ser˜ao feitas mais iterac¸˜oes.

O programa completo, incluindo outra generalizac¸˜ao que ser´a discutida na pr´oxima secc¸˜ao, encon- tra-se no pacote adicional dynamics, distribu´ıdo com o Maxima. Para usar esse programa, ser´a preciso carregar o pacote com o comando load("dynamics").

Exemplo 6.4

Usando o m´etodo de Runge-Kutta de quarta ordem, encontre as 5 soluc¸˜oes da equac¸˜ao ˙

x= t − x2

no intervalo [0, 9], com as cinco condic¸˜oes iniciais:

y(0) = 3, 1, 0, −0.7, −0.75 .

Resoluc¸˜ao: o programa rk usa-se, neste caso, assim:

(%i26) load("dynamics")$ (%i27) s1: rk(x-yˆ2,y,3,[x,0,9,0.01])$ (%i28) s2: rk(x-yˆ2,y,1,[x,0,9,0.01])$ (%i29) s3: rk(x-yˆ2,y,0,[x,0,9,0.01])$ (%i30) s4: rk(x-yˆ2,y,-0.7,[x,0,9,0.01])$ (%i31) s5: rk(x-yˆ2,y,-0.75,[x,0,9,0.01])$

as listas s1, . . . , s5 foram usadas para guardar os resultados. Cada uma dessas listas cont´em outras listas, com dois valores para t e x, na forma: [[t0, x0], [t1, x1], . . . , [tn, xn]]. O valor de n ´e

900, j´a que as 9 unidades do comprimento do intervalo de t, foram divididas em subintervalos de comprimento ∆t = 0.01. No entanto, a lista s5 tem muito menos elementos, porque nesse caso a soluc¸˜ao diverge; podemos ver qual foi o ´ultimo valor calculado nesse caso, olhando para o ´ultimo elemento da lista s5

(%i32) last(s5);

(%o32) [2.1, - 1.1626639005128218E+9]

para t = 2.1 o valor absoluto de y j´a era bastante elevado, e para t = 2.11 ter´a ultrapassado 10100,

que ´e o valor m´aximo admitido pelo programa rk.

O tipo de listas produzidas pelos resultados do programark podem ser passadas directamente `a func¸˜ao graph2d, para representar o gr´afico das soluc¸˜oes.

(%i33) load("graph2d")$

(%i34) graph2d([labelposition, "300 300"], [label,"x(0)=3"], s1,

[label,"x(0)=1"], s2, [label,"x(0)=0"], s3, [label,"x(0)=-0.7"], s4, [label,"x(0)=-0.75"], makelist(s5[i], i, 1, length(s5)-30),

[xaxislabel,"t"], [yaxislabel,"x"])$

Na ´ultima lista ignoramos os ´ultimos 30 pontos, para evitar que o dom´ınio y do gr´afico se esten-

desse muito. O gr´afico obtido aparece na figura6.7

Figura 6.7: Soluc¸˜oes do sistema ˙x= t − x2, entre t = 0 e t = 9, com cinco condic¸˜oes iniciais

diferentes.

Dans le document TH`ESE DE DOCTORAT (Page 44-50)