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.