Antes da escolha de uma forma de interpolação, para o algoritmo do campo escalar, avaliaremos o desempenho de três subrotinas, que se encontram no MatLab e uma subrotina desenvolvida em Fortran, que interage com o Ma- tLab (ver tabela 6.1)
Tabela 6.1 - Formas de interpolação utilizadas
Subrotina Descrição
spline Interpolação por spline cúbica.
interp1 A opção 'linear' fornece interpolação por retas.
pchip Interpolação utilizando polinômios cúbicos de Hermite. splinefor spline cúbica via Fortran.
O código fonte em Fortran, que utilizamos para interagir com o algo- ritmo do colapso gravitacional, está disponível na referência Press, Flannery, Teukolsky e Vetterling (1986) [39]. Essa subrotina efetua a interpolação por spline cúbica e está escrita em fortran-77.
Para fazer a interação entre esses algoritmos, precisamos saber como pas- sar dados de um código fonte escrito em MatLab, para um escrito em Fortran e vice-versa. O sistema de ajuda do MatLab é suciente para adquirirmos essas informações e também, essas informações encontram-se no livro do Hanselman e Littleeld (2003) [23].
Basicamente, no algoritmo de spline cúbica em Fortran, acrescentamos comandos referente a identicação e transferência de variáveis. Após isso, o algoritmo é salvo e compilado no próprio MatLab, para se tornar um algo- ritmo incorporado ao MatLab. Consequentemente, esse algoritmo funciona de modo semelhante às funções que estão na biblioteca do MatLab.
O arquivo splinefor.f é o arquivo MEX que zemos e encontra-se no anexo III. O comando para torná-lo uma função integrada ao MatLab é dado por
mex − v − g splinef or.f F C = f 95
Considerando essas quatro subrotinas, dado um conjunto de pontos do R2, queremos saber a imagem de um conjunto de pontos dos Reais, denida
pela função que interpola o conjunto de pontos dados. Cada subrotina gas- tará um tempo para fazer a interpolação e esses tempos são obtidos através do comando cputime do MatLab. Montamos tabelas comparativas entre o tempo gasto de cada subrotina, ao interpolar uma quantidade de pontos.
O conjunto de pontos conhecidos são
Ω =(x, y) ∈ [0, 100] × [0, 100] ⊂ R2 / y = x .
Note que esse conjunto possui innitos pontos, no entanto queremos apenas um número nito de pontos dados, para denir a função que interpola esses pontos. Assim, precisamos fazer uma restrição ao conjunto Ω, que nos resulte numa quantidade nita de pontos.
A restrição Ω|α é o conjunto de pontos
Ω|α = {(x, y) ∈ Ω / x = k.h, k = 100/αe k = 0, 1, . . . , α} , (6.3) onde α + 1 é a quantidade de pontos do conjunto.
Essa restrição é o conjunto de pontos que dene a interpolação. Agora desejamos saber quanto tempo de CPU, as subrotinas gastam para encon- trar a imagem de um conjunto de pontos dos Reais, através dos pontos que denem a interpolação.
Os pontos para os quais queremos saber a imagem, pertencem ao intervalo [0, 5 , 99, 5] ⊂ R e são denidos por
onde h = 90/β, k = 0, 1, 2, . . . , β e β + 1 dene a quantidade de pontos do conjunto.
Apresentamos tabelas para β = 10, β = 100, β = 1000, β = 10000 e β = 100000. Em cada Tabela, α assumirá os seguintes valores: α = 10, α = 100, α = 1000, α = 10000, α = 100000 e α = 1000000. O tempo gasto de cada subrotina, para encontrar a imagem dos pontos, denido pelo conjunto Γ, é computado em segundos (s), pelo comando cputime do MatLab.
Tabela 6.2 - Tempo gasto para as subrotinas interpolarem 10 pontos (β = 10)
α Tempo gasto pela subrotina (s)
fortran spline linear Hermite
10 0 0,01 0 0 100 0 0,01 0 0,005 1000 0 0,01 0 0,01 10000 0,01 0,1 0,005 0,05 100000 0,15 1,13 0,03 0,52 1000000 - 11,81 0,29 5,08 10000000 - - 2,88 -
Tabela 6.3 - Tempo gasto para as subrotinas interpolarem 100 pontos (β=100)
α Tempo gasto pela subrotina (s)
fortran spline linear Hermite
10 0 0,01 0 0,005 100 0 0,01 0 0,005 1000 0,015 0,01 0 0,01 10000 0,14 0,1 0,005 0,05 100000 1,46 1,13 0,03 0,52 1000000 - 11,79 0,29 5,1 10000000 - - 2,89 -
Analisando as cinco tabelas comparativas, tabela 6.2, tabela 6.3, tabela 6.4, tabela 6.5 e tabela 6.6, é indiscutível que a subrotina da interpolação li- near gasta menos tempo para efetuar as suas operações. No entanto, devemos ter uma preocupação com sua precisão e com a suavidade da função interpo- lante, se pretendemos substituir a spline cúbica pela interpolação linear, no algoritmo do campo escalar.
Seja x ∈ [xk, xk+1] ⊂ [0, 100], o ponto em que desejamos encontrar sua
erro da interpolação linear é proporcional ao quadrado da distância entre os extremos do intervalo [xk, xk+1]. Assim, o erro no ponto x é proporcional à
errox ∝ (xk+1− xk)2 =
100 α
2 .
A principal desvantagem da interpolação linear é que a função interpo- lante não é diferenciável, nos pontos que conhecemos, ao passo que a interpo- lação por spline cúbica nos fornece uma função interpolante suave, contínua na primeira e segunda derivadas. Dependendo do problema, esse fato pode inserir erros que afetam a qualidade da resposta do problema, ou a solução do problema.
Tabela 6.4 - Tempo gasto para as subrotinas interpolarem 1000 pontos (β=1000)
α Tempo gasto pela subrotina (s)
fortran spline linear Hermite
10 0 0,01 0 0,005 100 0,015 0,01 0 0,005 1000 0,14 0,015 0 0,01 10000 1,4 0,11 0,03 0,05 100000 14,85 1,18 0,03 0,54 1000000 - - 0,31 5,21 10000000 - - 3,01 -
Tabela 6.5 - Tempo gasto para as subrotinas interpolarem 10000 pontos (β=10000)
α Tempo gasto pela subrotina (s)
fortran spline linear Hermite
10 0,015 0,02 0,015 0,02 100 0,14 0,02 0,015 0,02 1000 1,36 0,03 0,015 0,025 10000 13,96 0,13 0,02 0,07 100000 149,37 1,21 0,05 0,54 1000000 - 12,19 0,32 5,27 10000000 - - 2,98 -
Antes de substituir a interpolação linear no algoritmo do campo escalar, devemos ter em mente que esses erros de precisão, causados pela interpolação, e as descontinuidades, se propagarão ao longo da evolução temporal, pois as
equações de Einstein, para o problema que consideramos, são basicamente equações de ondas.
Tabela 6.6 - Tempo gasto para as subrotinas interpolarem 100000 pontos (β=100000)
α Tempo gasto pela subrotina (s)
fortran spline linear Hermite
10 0,16 0,18 0,14 0,19 100 1,36 0,19 0,14 0,19 1000 13,58 0,20 0,14 0,19 10000 146,98 0,30 0,14 0,24 100000 1, 6 × 103 1,39 0,17 0,775 1000000 - 11,81 0,29 5,54 10000000 - - 3,19 -
Uma interpolação que se destaca é a interpolação cúbica de Hermite. As tabelas comparativas mostram que essa interpolação gasta menos tempo para efetuar as operações, quando se compara com a interpolação spline cúbica.
Note que, nas cinco tabelas, só foi vantajoso utilizar a interpolação do for- tran interagido com o MatLab, quando tínhamos poucos pontos à interpolar. Logo, se desejamos explorar as vantagens do algoritmo do campo escalar, com a spline cúbica do Numerical Recipes [39] em fortran, devemos dividir o problema em vários problemas em intervalos menores, com condições de contorno que garantam a recuperação do problema original.
Executando o algoritmo com a interpolação spline cúbica e também, exe- cutando o algoritmo com a interpolação cúbica de Hermite, na opção Proler do MatLab, obtemos informações que reforçam a vantagem da interpolação de Hermite, em relação ao tempo gasto de CPU. Algumas dessas informações encontram-se no anexo II.
Optamos por utilizar a interpolação cúbica de Hermite para as simulações que faremos na seção 6.5, devido às suas características apresentadas nessa seção e pelo bom desempenho da subrotina pchip.