You are on page 1of 74

Departamento de Física

Faculdade de Ciências da Universidade de Lisboa

INTRODUÇÃO À PROGRAMAÇÃO
com exemplos em Fortran

Pedro M A Miranda
1994,2004
Introdução à Programação

Nota Introdutória

Estes apontamentos foram escritos em 1994 em Wordperfect e posteriormente convertidos em


Word. Existirão certamente algumas falhas de conversão não detectadas. O ambiente informático
existente à data sofreu entretanto grandes alterações, pelo que se eliminaram alguns tópicos
referentes à implementação dos programas propostos. No que se refere à linguagem de
programação (Fortran 77 com algumas extensões de Fortran 90) ela permanece utilizável (em
Fortran 90/95), sendo no entanto claro que o código poderia ser reescrito de forma um pouco
mais elegante. Agradecem-se sugestões e comentários. As fontes (em Fortran) encontram-se
disponíveis para download.
Pedro M A Miranda (2004)
pmmiranda@fc.ul.pt
http://www.cgul.ul.pt

2
Introdução à Programação

INDICE
1 NÚMEROS, OPERAÇÕES E ERROS ........................................................................................... 5
1.1 Números inteiros.......................................................................................... 5
1.2 Números de vírgula flutuante ....................................................................... 6
1.3 Erros e estabilidade ..................................................................................... 7
2 PROGRAMAÇÃO ELEMENTAR.................................................................................................... 9
2.1 Problema do movimento no campo gravítico uniforme ................................ 9
2.2 Formulação matemática .............................................................................. 9
2.3 Métodos numéricos:..................................................................................... 9
2.4 Algoritmo...................................................................................................... 9
2.5 Programa Fortran....................................................................................... 13
2.6 Sugestões de trabalho ............................................................................... 15
2.7 Conceitos introduzidos............................................................................... 16
3 AJUSTAMENTO DE DADOS EXPERIMENTAIS POR REGRESSÃO LINEAR .......................... 17
3.1 Problema.................................................................................................... 17
3.2 Formulação matemática ............................................................................ 17
3.3 Métodos numéricos.................................................................................... 18
3.4 Algoritmo.................................................................................................... 18
3.5 Programa Fortran....................................................................................... 19
3.6 Sugestões de trabalho ............................................................................... 22
3.7 Conceitos introduzidos............................................................................... 22
4 DETERMINAÇÃO DE RAÍZES DE EQUAÇÕES NÃO LINEARES. ............................................ 23
4.1 Equilíbrio térmico de um painel solar ......................................................... 23
4.2 Formulação matemática: ........................................................................... 23
4.3 Métodos numéricos:................................................................................... 24
4.4 Algoritmo.................................................................................................... 25
4.5 Programas Fortran..................................................................................... 25
4.6 Sugestões de trabalho ............................................................................... 29
4.7 Conceitos de programação introduzidos.................................................... 29
5 ARITMÉTICA COMPLEXA........................................................................................................... 30
5.1 Circuito RLC............................................................................................... 30
5.2 Aritmética complexa em Fortran ................................................................ 31
5.3 Cálculo da corrente no circuito RLC .......................................................... 32
6 SOLUÇÃO DE EQUAÇÕES DIFERENCIAIS ORDINÁRIAS COM CONDIÇÕES FRONTEIRA
NUM PONTO ........................................................................................................................................ 34
6.1 Identificação do Problema e Formulação Matemática ............................... 34
6.2 Métodos numéricos (Método de Euler) ...................................................... 35
6.3 Algoritmo.................................................................................................... 37
6.4 Programas FORTRAN ............................................................................... 39
6.5 Algumas soluções...................................................................................... 42
6.6 Sumário dos conceitos introduzidos .......................................................... 44
7 INTEGRAÇÃO NUMÉRICA.......................................................................................................... 45
7.1 Identificação do Problema e Formulação Matemática ............................... 45
7.2 Métodos numéricos.................................................................................... 46
7.3 Algoritmo.................................................................................................... 48
7.4 Programas Fortran..................................................................................... 49
7.5 Trabalho proposto...................................................................................... 53
7.6 Sumário de conceitos introduzidos ............................................................ 53

3
Introdução à Programação

8 SOLUÇÃO DE SISTEMAS DE EQUAÇÕES LINEARES ............................................................ 54


8.1 Identificação do problema e formulação matemática................................. 54
8.2 Métodos numéricos.................................................................................... 54
8.3 Algoritmo.................................................................................................... 55
8.4 Programa Fortran....................................................................................... 56
8.5 Sugestões de trabalho ............................................................................... 62
8.6 Conceitos introduzidos............................................................................... 62
9 SOLUÇÃO DE PROBLEMAS DE FÍSICA PELO MÉTODO DA RELAXAÇÃO ........................... 64
9.1 Identificação do Problema e Formulação Matemática ............................... 64
9.2 Métodos numéricos (Relaxação) ............................................................... 65
9.3 Algoritmo.................................................................................................... 67
9.4 Programas FORTRAN ............................................................................... 67
9.5 Algumas soluções...................................................................................... 71
9.6 Trabalho proposto...................................................................................... 72
9.7 Sumário dos conceitos introduzidos .......................................................... 72

4
Introdução à Programação

1 NÚMEROS, OPERAÇÕES E ERROS


1.1 Números inteiros
Todas as instruções executadas por um computador têm de ser traduzidas em sequências de
operações elementares compreendidas pela Unidade de Processamento Central (CPU, i.e.,
pelo(s) Microprocessador(es)). O leque de instruções elementares disponíveis varia muito de
máquina para máquina, dependendo da sua arquitectura e da existência ou não de processadores
especializados opcionais (co-processadores aritméticos, nomeadamente). Para o utilizador
normal aquilo que se passa a esse nível é, num certo sentido (e felizmente) pouco relevante,
dependendo a sua utilização do computador fundamentalmente dos recursos fornecidos pelo
software, isto é, pela linguagem de alto nível ou por outra aplicação utilizada.
No entanto, é claro que os recursos oferecidos pelo software são fundamentalmente
condicionados pelo modo de operação do computador a um nível mais baixo. Os computadores
(digitais) são construídos para obter um elevado grau de eficiência na realização de operações
matemáticas sobre números com um número bem determinado de dígitos (na base 2) e segundo
regras bem definidas. Nesse contexto só podem ser representados exactamente um subconjunto
dos números usuais (inteiros, reais, complexos, etc.) e são de esperar limitações e,
eventualmente, erros, nas operações a efectuar.
A afirmação anterior não implica que não possa utilizar-se computadores para realizar operações
exactas com números reais ou com qualquer precisão pretendida, mas, tão só, que tais operações
serão necessariamente muito menos eficientes. Na verdade existem aplicações que permitem
fazer isso mesmo ou até realizar operações simbólicas sobre expressões matemáticas. As
linguagens de alto nível, no entanto, limitam-se a oferecer um leque limitado de possibilidades à
representação de números e operações.
Internamente, os números são sempre representados em computadores como sequências de
algarismos binários (0 ou 1), que correspondem, cada um deles, aos dois estados possíveis do
elemento físico elementar em que se encontram armazenados. Quer isto dizer que os números
armazenados num computador utilizam como base natural a base binária. Cada algarismo
binário, ou a correspondente célula de armazenamento, designa-se geralmente por bit. Todas as
operações realizadas por um computador são, por isso, em última análise, operações sobre esses
bits e podem ser entendidas como sequências de operações lógicas (0 ou 1 é o mesmo que
verdadeiro ou falso), estudadas com base na Álgebra de Boole.
Por motivos práticos é conveniente agrupar os bits em conjuntos. Assim o conjunto de 8 bits
designa-se por byte. Se se considerar que um byte constitui um número inteiro na base 2 é claro
que um byte poderá representar qualquer número inteiro positivo entre 0 (00000000) e 255
(11111111 = 1×27+1×26+1×25+1×24+1×23+1×22+1×21+1×20). Os computadores actuais actuam
preferencialmente sobre conjuntos de bytes, sendo os respectivos microprocessadores designados
em função do comprimento dos seus registos (16 bits, 32 bits ou 64 bits). As diferentes
linguagens permitem definir variáveis com diversos comprimentos (geralmente de 2, 4 ou 8
bytes).

5
Introdução à Programação

Do que foi dito anteriormente depreende-se que é muito fácil representar números inteiros e
lógicos. Assim, um número lógico só precisa de ocupar um bit (embora ocupe mais na prática,
porque é mais eficiente manejar bytes oy mesmo grupos de bytes) e um número inteiro ocupará
um número dado de bits na representação binária. Neste último caso, se se reservar um bit para o
sinal (positivo ou negativo), uma sequência de n bits x1x2...xn será dado por:
±( x2×2n-2 + x3×2n-3 + ... + xn-1×2 + xn) (1-1)
Assim é claro que a representação de números inteiros e lógicos é exacta. No entanto, nem todos
os números inteiros podem ser representados dada a existência de um número finito de bits. Diz-
se que a representação dos números inteiros tem um alcance finito. No caso de se utilizarem 4
bytes para representar um inteiro (positivo ou negativo) o alcance será então dado por:
- 231 ≤ i ≤ + 231 – 1 (1-2)
em que se reservou um bit para o sinal e se tomou em consideração a existência do 0 (daí a
assimetria do alcance).
Uma outra questão é levantada pela aritmética, isto é pelo resultado das operações efectuadas
sobre estes números. No caso das operações lógicas, é claro que elas não levantam qualquer
problema. No caso das operações inteiras há evidentemente um problema resultante do alcance
finito da representação: quando de uma operação resultar um número fora do alcance é evidente
que o resultado não pode ser obtido, está-se nesse caso numa situação de overflow.
Por outro lado deve notar-se que a aritmética inteira é obrigada a produzir, a partir de qualquer
operação, um resultado inteiro. No caso da divisão entre dois números inteiros, em que o
dividendo não seja um múltiplo do divisor, o resultado é constituído pela parte inteira da razão e
por um resto (inteiro). É preciso indicar explicitamente qual dos dois números inteiros referidos
(a razão ou o resto) se pretende obter.

1.2 Números de vírgula flutuante


Considere-se agora o problema da representação de números reais não inteiros. Esses números
são geralmente representados na forma, dita de vírgula flutuante:
m × 2e-E (1-3)
em que m (mantissa) e e (expoente) são dois números inteiros, positivos ou negativos. Assim,
procede-se à representação de números não inteiros sob a forma de pares de números inteiros.
(Nota: a expressão anterior inclui, para cada precisão, uma constante aditiva E (bias), necessária,
nomeadamente, para centrar o alcance em 0).
Os números de vírgula flutuante são dízimas finitas na base 2 (a que correspondem geralmente
dízimas infinitas periódicas na base 10). São, portanto, um subconjunto dos números racionais.
Os números de vírgula flutuante têm, tal como os inteiros, um alcance, que é função do número
de bits atribuído ao expoente, e uma precisão, ou número de algarismos significativos, que é
função do número de digitos atribuídos à mantissa. Tradicionalmente referem-se como de
precisão simples, números de vírgula flutuante com 4 bytes (32 bits) dos quais 3 (24 bits) são
reservados para a mantissa e 1 (8 bits) se destina ao expoente. Estes números têm, na base

6
Introdução à Programação

decimal, um pouco mais de 7 algarismos significativos (o número não é exacto nesta base) e um
alcance aproximadamente dado por:
- 10+38 <x<-10-38 ou x=0 ou - 10-38 <x<-10+38 (1-4)
Nota-se que neste caso existe um valor máximo absoluto que pode ser representado mas também
um valor mínimo absoluto, exceptuando o caso particular do número 0. Assim, são possíveis
condições de overflow, quando o resultado de uma operação é um número com valor absoluto
excessivamente grande e de underflow, quando esse resultado é um número de valor absoluto
excessivamente pequeno. Neste último caso, os compiladores podem arredondar
automaticamente para 0.
Contrariamente à aritmética inteira, a aritmética de vírgula flutuante só excepcionalmente produz
resultados exactos. Ao erro introduzido pelas limitações de precisão (comprimento finito da
mantissa) chama-se geralmente erro de arredondamento (roundoff).

1.3 Erros e estabilidade


Assim, as operações em vírgula flutuante são normalmente afectadas por um erro de
arredondamento. Esse erro é inevitável e só pode ser reduzido mediante a utilização de
representações com maior precisão, mas nunca eliminado completamente. Numa sequência de
operações de vírgula flutuante é de esperar que se observe um crescimento do erro acumulado e
pode provar-se estatisticamente que esse crescimento é, em média, inevitável.
Para além do erro de arredondamento, inevitável, que resulta em última análise do hardware
utilizado, existe um outro tipo de erro que resulta da utilização de expressões aproximadas (por
exemplo, séries truncadas) para a avaliação de um dado resultado. Este tipo de erro é função do
software utilizado e designa-se por erro de truncatura. O erro de truncatura pode (e deve) ser
controlado pelo programador.
Em certos casos, apesar de as fórmulas utilizadas serem correctas no sentido em que produziriam
o resultado exacto com aritmética exacta, o erro pode crescer descontroladamente
(exponencialmente) tornando os resultados obtidos completamente inúteis. Tal crescimento
resulta de uma interacção entre o erro de arredondamento e o erro de truncatura. Nesse caso diz-
se que se está na presença de instabilidade numérica. A principal preocupação da Análise
Numérica consiste exactamente em prevenir a ocorrência desta situação.
Um exemplo de obtenção de um resultado afectado de um erro elevado é dado pela utilização da
fórmula resolvente usual da equação do segundo grau:

- b ± b2 - 4 a c
y= (1-5)
2a

Se b 2 << 4ac a expressão anterior produzirá um resultado com um erro relativo muito elevado
para uma das raízes, devido ao erro de arredondamento. Se b > 0 o erro será muito elevado para
a raiz de maior valor (sinal positivo no radical). Caso contrário será a outra raiz a aparecer
afectada por um erro elevado. A título de exemplo considere-se a equação:

7
Introdução à Programação

- y 2 + 8855 y - 1 = 0 (1-6)

Com 7 algarismos significativos, as raízes são:


y1 = 8855.000
(1-7)
y 2 = 0.0001129305

No entanto, se se utilizar a fórmula resolvente e aritmética truncada a 7 dígitos (i.e. se se


arredondar cada resultado parcelar a 7 dígitos) obtém-se:
y1 = 8855.000
(1-8)
y 2 = 0.00002823264

Verificando-se, portanto, que a raiz de menor valor absoluto vem afectada de um erro
extremamente grande, muitíssimo superior ao erro de arredondamento esperado.
O crescimento anormal do erro de arredondamento observado neste exemplo resulta da
diminuição do número de algarismos significativos quanto se subtraem dois números de valor
muito próximo, visto que o resultado tem uma ordem de grandeza muito inferior à de cada uma
das parcelas. Na verdade, a raiz afectada de um erro elevado, é a que resulta da escolha do sinal
positivo para o radical presente no numerador da fórmula, ocorrendo a diminuição do número de
algarismos significativos na subtracção: - b + b 2 - 4ac . É claro que se b fosse negativo o
cancelamento aconteceria na outra raiz.
No caso da equação do segundo grau o problema pode ser evitado se se notar que existe uma
fórmula resolvente alternativa, dada por:
2c
y= (1-9)
- b ± b2 - 4ac

Comparando as expressões (1) e (2) nota-se que se ocorrer cancelamento na primeira raiz da
expressão (1) é de esperar cancelamento na segunda raiz da expressão (2). Assim, pode utilizar-
se a expressão mais conveniente para calcular cada uma das raízes, evitando o crescimento do
erro.

8
Introdução à Programação

2 PROGRAMAÇÃO ELEMENTAR
2.1 Problema do movimento no campo gravítico uniforme
Um ponto material de massa m é lançado de baixo para cima com uma velocidade inicial
v0 = 20 m/s , a partir de uma posição s0 = 10 m acima do solo. Escreva um algoritmo, e
correspondente programa FORTRAN, que permita a determinação do tempo necessário para o
corpo atingir a posição s . Considere a aceleração da gravidade g = 9.81 m s -2 .

2.2 Formulação matemática


1 2
Calcular t ∈ ℜ+ : s0 - s + v0 t - gt =0
2
Em geral, a equação do segundo grau apresentada anteriormente tem duas raízes reais ou
complexas. O problema só tem solução se as raízes forem reais, sendo a raiz pretendida a menor
das raízes positivas. Verifique as condições de aparecimento de raízes com parte imaginária e a
sua justificação em termos físicos. Verifique também qual o significado da segunda raiz no caso
em que existe solução.

2.3 Métodos numéricos:


Não são necessários. Vai usar-se a forma resolvente da equação do segundo grau:

- b ± b 2 - 4ac
ax + bx + c = 0 _ x =
2
(2-1)
2a

2.4 Algoritmo

2.4.1 Estrutura Geral:


a) Declarar variáveis e constantes
b) Inicializar constantes
c) Ler s
d) Calcular as raízes da equação
e) Escolher a raiz
f) Escrever o resultado

2.4.2 Desenvolvimento
A estrutura geral apresentada em 4.1 e desenvolvida no parágrafo anterior é um exemplo da
estrutura de muitos algoritmos simples. Os diferentes passos indicados em 4.1 serão identificados
no que se segue mediante a introdução de linhas de Comentário. Estas linhas não fazem parte do
algoritmo e são incluídas para benefício dos seus possíveis utilizadores.

9
Introdução à Programação

a) O primeiro passo (DECLARAÇÕES) consiste em estabelecer os nomes e as características das


diferentes variáveis e constantes que vão ser utilizadas. Dependendo do algoritmo em questão,
poderá ser necessário recorrer a variáveis ou constantes que sejam números de tipo INTEIRO,
REAL, COMPLEXO, LÓGICO, etc. Nalguns casos, poderá ser necessário utilizar VECTORES
ou TABELAS. Por razões de clareza, cada variável deve ser utilizada para um fim bem
específico claramente identificado pelo seu nome. Em "linguagem algorítmica" escrever-se-á:

Comentário: DECLARAÇÕES

Reais: s0,v0,s,g,x1,y1,x2,y2,t

b) O segundo passo (INICIALIZAÇÃO) consiste em atribuir valores às constantes e, se


necessário, valores iniciais às variáveis. Simbolicamente, indicou-se a operação de atribuição de
um dado valor a uma variável pelo símbolo ←. Deve notar-se que a declaração indica
unicamente que determinada variável existe e tem o nome e tipo dados mas não lhe atribui
qualquer valor.

Comentário: INICIALIZAÇÃO

s0 ← 10
v0 ← 20
g ← 9.8

c) A inicialização é muitas vezes completada (como é aqui o caso) pela LEITURA de dados.

Comentário: c) LEITURA DE DADOS


LER s

d) O passo seguinte é o núcleo central do algoritmo e a sua complexidade e estrutura depende


naturalmente do problema. Neste ponto incluir-se-ão, em cada problema, um ou mais BLOCOS
de instruções (neste caso será: d1) Cálculo das raízes e d2) Escolha da raiz física), cada um
realizando um conjunto de operações bem definido. Por motivos de clareza é conveniente fazer
essa separação por blocos sempre que possível, dando ao algoritmo uma forma claramente
estruturada e modular.
Primeiro far-se-á o cálculo dos coeficientes da equação:
a ← - 0.5 g
b ← v0
c ← s0-s

d1) O cálculo das raízes será feito mediante utilização da fórmula resolvente da equação do
segundo grau. Se se utilizar aritmética complexa, a fórmula pode ser directamente inscrita no

10
Introdução à Programação

algoritmo. Neste problema vai-se utilizar, em vez disso, aritmética real, pelo que tem de se ter
em atenção o sinal do radicando antes de calcular cada raiz. Assim, pode fazer-se:

Comentário: cálculo das raízes da equação do segundo grau

SE b2-4ac > 0 ENTÃO


x1 ← (-b+(b2-4ac)1/2)/2a
x2 ← (-b-(b2-4ac)1/2)/2a
y1 ← 0
y2 ← 0
SENÃO
x1 ← (-b)/2a
x2 ← (-b)/2a
y1 ← (-b2+4ac)1/2/2a
y2 ← -y1
FIM DE OPÇÕES

Em muitos casos, a modularidade pode (e deve) ser levada ao ponto de utilizar um algoritmo
específico independente (que terá na prática a forma de um sub-programa) para realizar um ou
mais dos blocos de instruções. Essa opção tem a vantagem de diminuir a complexidade de cada
um dos algoritmos tomado individualmente e de permitir a utilização daquele algoritmo
específico noutros problemas. Nesse caso, utiliza-se a expressão EXECUTAR operação,
indicando o recurso a um algoritmo independente para a operação indicada. Assim poderia
escrever-se em alternativa ao bloco anterior:

EXECUTAR: Calcular xk+i yk tais que a(xk+i yk)2+b(xk+i yk)+c = 0

passando o bloco de cálculo das raízes para um algoritmo autónomo.


d2) O bloco seguinte é constituído por uma ESTRUTURA DE CONTROLE extremamente útil
em programação que se poderá designar por Estrutura de Escolha Condicional Múltipla (IF-
THEN-ELSE), onde é feita a selecção da raiz pretendida. O número de opções a incluir depende
do problema.

Comentário: ESCOLHA DAS RAÍZES

SE (y1≠0 OU y2≠0) ENTÃO


ESCREVA 'Não há Solução'
PARE
SENÃO SE(x1<0) ENTÃO
t ← x2
SENÃO SE(x2<0) ENTÃO
t ← x1
SENÃO

11
Introdução à Programação

t Menor de x1,x2
FIM DE OPÇÕES

A selecção da raiz física poderia ser feita por intermédio de outros testes (equivalentes) aos
valores das variáveis. Em geral há sempre muitas maneiras de resolver o mesmo problema. Por
exemplo podia escrever-se:

Comentário: ESCOLHA DAS RAÍZES

SE (y1≠0 OU y2≠0) ENTÃO


ESCREVA 'Não há Solução'
PARE
SENÃO
r Menor de x1,x2
SE (r < 0) ENTÃO
r Maior de x1,x2
FIM DE OPÇÃO
FIM DE OPÇÕES

Neste caso, recorre-se a menos um teste e utiliza-se uma segunda estrutura de escolha
EMBEBIDA na primeira. No programa fortran utilizar-se-á esta forma. Deve notar-se a
indicação do fim de cada estrutura de controle.
e) Finalmente, o algoritmo transmite ao utilizador, por exemplo escrevendo no écran ou em outro
periférico (disco, impressora, etc) o resultado dos cálculos.

Comentário: ESCRITA DO RESULTADO

ESCREVER 'Solução t=',t

2.4.3 Notas
Se uma das raízes tiver parte imaginária não nula o mesmo se passa com a outra (elas são
complexas conjugadas). Portanto bastaria testar y1 ou y 2 . Toda a aritmética utilizada é real - o
algoritmo pode ser ligeiramente simplificado com a introdução de aritmética complexa.

12
Introdução à Programação

2.5 Programa Fortran

2.5.1 Preliminares
Vamos fazer o cálculo das raízes utilizando um subprograma genérico (Subroutine Raiz2) para o
cálculo de raízes de uma equação do segundo grau qualquer. Utilizar-se-á a segunda estrutura de
controle definida em 4.2.
Em FORTRAN, a instrução de atribuição "←" é indicada pelo símbolo "=". A operação lógica de
igualdade (comparação) é indicada pela expressão ".EQ.". Existem outras operações de
comparação entre números que dão origem a expressões lógicas (i.e., expressões que podem ter
valor Verdade (.TRUE.) ou Falso (.FALSE.)):

Operação Significado
A.EQ.B Testa se A é IGUAL a B
A.NE.B Testa se A é DIFERENTE de B
A.LT.B Testa se A é MENOR que B
A.LE.B Testa se A é MENOR OU IGUAL que B
A.GT.B Testa se A é MAIOR que B
A.GE.B Testa se A é MAIOR OU IGUAL que B

Neste programa recorre-se em particular à utilização de um SUBPROGRAMA do tipo


SUBROUTINE. Uma SUBROUTINE é, num certo sentido, um programa independente que tem
um certo número de valores de entrada (conhecidos no momento em que é iniciada a execução da
subroutine) e um certo número de valores de saída (a calcular no interior da subroutine). A sua
utilização faz-se do seguinte modo:
a) No programa "principal" escreve-se:
CALL nome_da_subroutine (arg1,arg2,....,argN)
em que nome_da_subroutine representa um nome aceitável pelo fortran (sequência de caracteres
alfanuméricos como por exemplo RAIZ2) e arg1,arg2,...,argN representa a sequência de
argumentos de entrada e saída, por qualquer ordem (mas idêntica à sua ordem na instrução
SUBROUTINE).
b) O subprograma terá a seguinte estrutura:
SUBROUTINE nome_da_subroutine (arg1,arg2,....,argN)
(Declarações
Instruções
...)
RETURN
END

13
Introdução à Programação

2.5.2 Programa

PROGRAM GRAVE
C
C Este Programa determina o tempo de chegada à posição S de um
C ponto material lançado de baixo para cima num campo gravítico
C com aceleração G (constante) e cuja posição inicial é S0
C com velocidade V0.
C O método utilizado baseia-se na fórmula resolvente da equação
C do segundo grau a*x**2+b*x+c=0, cujas raízes são calculadas
C na subroutine RAIZ2.
C
REAL S0,V0,G,S,T,X1,X2,Y1,Y2,A,B,C
PARAMETER (S0=10.,V0=20.,G=9.81)
C
WRITE(*,*) 'Programa GRAVE'
WRITE(*,*) 'Calculo do tempo de queda de um ponto material'
WRITE(*,*) 'Indique o valor de S (posição final)'
READ(*,*) S
C
A=-0.5*G
B=V0
C=S0-S
C
CALL RAIZ2(A,B,C,X1,X2,Y1,Y2)
C
IF(Y1.NE.0. .OR. Y2.NE.0.) THEN
WRITE(*,*) 'Não há solução'
STOP
ELSE
T=MIN(X1,X2)
IF(T.LT.0.) THEN
T=MAX(X1,X2)
ENDIF
ENDIF
C
WRITE(*,*) 'Solução: t=',T
STOP
END
C
C
C
SUBROUTINE RAIZ2(A,B,C,R1,R2,I1,I2)
C
C Esta subroutine calcula as raízes C1=R1+i*I1, C2=R2+i*I2
C da equação do segundo grau a*x**2+b*x+c=0, utilizando a

14
Introdução à Programação

C fórmula resolvente.
C
REAL A,B,C,R1,R2,I1,I2,RAD,ARAD
C
RAD=B**2-4.*A*C
C
IF(RAD.LT.0.) THEN
ARAD=ABS(RAD)
R1=-B/(2.*A)
R2=R1
I1=SQRT(ARAD)/(2.*A)
I2=-I1
ELSE
R1=(-B+SQRT(RAD))/(2.*A)
R2=(-B-SQRT(RAD))/(2.*A)
I1=0.
I2=0.
ENDIF
C
RETURN
END

2.5.3 Notas
a) As variáveis têm carácter local, i.e., o Programa principal e a subroutine só conhecem, além
das variáveis definidas localmente em cada um deles, as variáveis transferidas em argumento. As
variáveis transferidas em argumento não necessitam de ter o mesmo nome nos dois
subprogramas. Devem no entanto ser no mesmo número e ter o mesmo tipo uma a uma (de
acordo com a sua posição na ordem dos argumentos).
b) A declaração de I1 e I2 como Real. O FORTRAN não exige a declaração explícita de
escalares reais ou inteiros, atribuindo por defeito o tipo inteiro às variáveis e constantes cujo
nome comece pelas letras no intervalo I-N e o tipo real nos outros casos. Assim, I1 e I2 seriam,
por defeito, variáveis inteiras. É boa programação declarar explicitamente todas as variáveis
utilizadas.
b) A utilização das funções intrínsecas MIN e MAX. Estas funções calculam, respectivamente, o
mínimo ou máximo de uma sequência de números (2 ou mais).
c) A utilização das funções intrínsecas ABS (Calcula o valor absoluto de um número real) e
SQRT (calcula a raiz quadrada de um número real).

2.6 Sugestões de trabalho


Escreva um pequeno programa principal para testar a subroutine com valores de A,B,C para os
quais a solução tenha sido obtida analiticamente.

15
Introdução à Programação

Teste o Programa apresentado comparando-o com resultados analíticos para os casos: a)


s0 < s < s max ; b) s = s max ; c) s < s0 ; d) s > s max .

Modifique o programa utilizando aritmética complexa.


Modifique o programa utilizando a estrutura de controle d2 definida em 4.2.

2.7 Conceitos introduzidos


a) Programa principal (PROGRAM, END)
b) Declarações (REAL)
c) Definição de parâmetros constantes (PARAMETER)
d) Utilização de subprogramas
Subroutine (CALL, SUBROUTINE, RETURN)
Transferência de argumentos
Carácter local das variáveis
e) Estrutura de escolha condicional múltipla (IF-THEN-ELSE, ENDIF)
f) Leitura e escrita no terminal (WRITE(*,*), READ(*,*))
g) Funções intrínsecas: ABS(),MIN(),MAX(),SQRT()

16
Introdução à Programação

3 AJUSTAMENTO DE DADOS EXPERIMENTAIS POR


REGRESSÃO LINEAR
3.1 Problema
Vamos considerar o problema da determinação da constante de Planck h , a partir de dados
obtidos numa experiência com uma célula fotoeléctrica, que consistem numa série de valores do
potencial de paragem V P , em função do comprimento de onda da luz incidente na célula.

Utilizando a lei de Planck E = h ν em que E é a energia de um fotão e ν a sua frequência, e a lei


de conservação da energia pode escrever-se:
e V P = hν - W (3-1)

em que W é a chamada energia de arranque da célula, considerada constante para cada célula.
O problema consiste, portanto, em: dados ( V P i ,ν i )(i = 1,2,..., N) , calcular a melhor aproximação
possível (num sentido a definir) para h . A solução do problema fornecerá igualmente um valor
para W .

3.2 Formulação matemática


O problema referido é um exemplo de uma família muito extensa de problemas de física (e não
só) que se pode reduzir ao problema da determinação dos parâmetros de uma recta (declive e
ordenada na origem) que "melhor" se ajusta a uma série de dados.
Formalmente pode escrever-se: Dados ( xi , yi )(i = 1,2,..., N) , calcular a e b tais que a recta
y = ax + b , é a que melhor se ajusta aos dados (num sentido a definir).

A solução geralmente utilizada para este problema consiste em escolher os parâmetros da recta
que levam à minimização do erro médio quadrático:

∑ [y - (a xi + b )]
1 N
e2 =
2
(3-2)
N i=1 i

Impondo a condição de minimização, i.e., resolvendo as duas equações:



∂a
( ) ( )
e2 =

∂b
e2 = 0 (3-3)

obtém-se:
1
∑ xi y i - ∑ xi ∑ y i
a= N (3-4)
∑(xi2 )
1
(∑ xi )2
N

17
Introdução à Programação

b=
1
(∑ y i - a ∑ xi ) (3-5)
N
em que todos os somatórios são de 1 a N.

3.3 Métodos numéricos


O método consiste unicamente no cálculo dos somatórios necessários e na sua introdução nas
fórmulas (5) e (6). No caso de N ser grande ou para valores particulares da série { xi , yi } , pode
haver problemas graves de arredondamento no cálculo dos somatórios. Para limitar esses erros
pode recorrer-se a cálculos em dupla precisão.

3.4 Algoritmo

3.4.1 Cálculo de um somatório


O cálculo de um somatório, com um número suficientemente grande de termos, realiza-se de
forma iterativa, utilizando uma Estrutura de Controle do tipo ITERAÇÃO COM CONTADOR
(Ciclo DO). O valor do somatório é calculado termo a termo sobre uma variável que assume a
N
função de um acumulador. Assim, para calcular SUM = ∑ f i faz-se:
i =1

SUM ← 0
PARA i=1 ATÉ N PASSO 1
SUM ← SUM + fi
FIM DE CICLO

Deve notar-se que: a) a variável SUM é primeiro posta a 0; b) A mesma variável SUM aparece
dos dois lados da expressão no interior do ciclo. Trata-se em cada iteração de somar mais um
termo ao resultado do somatório.
Neste algoritmo recorre-se a uma variável indexada, isto é a uma sequência de valores
representada por fi (i=1,...,N), que pode ser identificada como um vector.

3.4.2 Algoritmo
Declarar variáveis
Ler N, { xi , y i }
Sx ← 0
Sy ←0
S xx ← 0
S xy ← 0
Para I=1 até N faça

18
Introdução à Programação

S x ← S x + xi
S y ← S y + yi
S xx ← S xx + xi2
S xy ← S xy + xi y i
Fim de ciclo

1
S xy - Sx Sy
a← N
1
S xx - S 2x
N

b←
1
(S y - a S x )
N

Escrever a,b
FIM

3.5 Programa Fortran

3.5.1 Preliminares
a) A tradução do algoritmo anterior em Fortran é razoavelmente simples. Na sequência de
comentário feito anteriormente, vai adoptar-se dupla precisão (64 bits, i.e., 8 bytes) para o
cálculo dos somatórios e do resultado final. As variáveis correspondentes terão, por esse motivo
de ser declaradas utilizando a instrução DOUBLE PRECISION (ou REAL*8).
b) Este programa vai ainda utilizar duas sequências de valores reais, i.e., dois vectores. Em
Fortran, a declaração de um vector real X faz-se pela instrução
REAL X(n)
em que n é o número de elementos do vector. Alternativamente pode escrever-se:
REAL X
DIMENSION X(n)
Podem declarar-se vectores de qualquer tipo (REAL, INTEGER, LOGICAL, COMPLEX,
CHARACTER) e podem declarar-se variáveis com índices múltiplos (e.g. DIMENSION
X(n,m,k)).
c) Dado que o número de pontos experimentais pode ser grande vai admitir-se que eles foram
previamente escritos num ficheiro permanente (em disco). Esse facto obriga à introdução de
formas mais elaboradas da instrução de leitura READ. A instrução READ (assim como a
instrução de escrita WRITE) tem a forma:
READ(unidade,formato[,END=label1,ERR=label2,...]) variáveis
em que os parâmetros no interior de [] são opcionais.
O parâmetro "unidade" é um valor inteiro que identifica uma determinada unidade de leitura. Se
se escrever o símbolo "*" a leitura será feita sobre a "unidade por defeito" que é o teclado. Se se

19
Introdução à Programação

utilizar um número de unidade o seu significado, i.e., a sua correspondência a um dado ficheiro,
ao teclado, à impressora, etc., terá de ser previamente estabelecida por intermédio de uma
instrução de abertura da unidade que tem a forma:
OPEN(unidade,FILE='nome_do_ficheiro',[STATUS='OLD',...])
Assim, poderia escrever-se, por exemplo:
OPEN(10,FILE='PLANCK.DAT')
READ(10,*) N
O segundo parâmetro da instrução READ, referido como o "formato" inclui informação referente
à forma de cada uma das linhas a ser lida, i.e., à disposição dos algarismos e textos nessa linha.
Se se utilizar o formato "*" o sistema será capaz de reconhecer as diferentes variáveis se elas
estiverem separadas entre si por espaços, vírgulas ou mudanças de linha, com as variáveis
CHARACTER delimitadas por plicas (').
d) Na escrita dos resultados, utilizar-se a instrução WRITE com um formato.

3.5.2 Programa

PROGRAM REGRES
C
C Março 1993
C Este programa faz uma regressão linear
C A partir de um conjunto de N pares (x,y) calcula uma recta
C y=ax+b, que melhor se ajusta a esses dados no sentido dos
C mínimos quadrados
C
INTEGER NMAX,N,I
PARAMETER(NMAX=1000)
REAL X(NMAX),Y(NMAX)
CHARACTER*30 FNAME,FORM
DOUBLE PRECISION SX,SY,SXX,SXY,A,B,ELECT
PARAMETER(ELECT=1.602D-19)

WRITE(*,*) 'Regressão linear y=ax+b'


WRITE(*,*) 'Ficheiro de dados de entrada'
READ(*,'(A30)') FNAME
OPEN(10,FILE=FNAME,STATUS='OLD')

READ(10,*) N
IF(N.GT.NMAX) THEN
WRITE(*,*) 'ERRO: N>NMAX'
STOP
ENDIF

DO I=1,N
READ(10,*) X(I),Y(I)

20
Introdução à Programação

ENDDO

SX=0.
SY=0.
SXX=0.
SXY=0.

DO I=1,N
SX=SX+X(I)
SY=SY+Y(I)
SXX=SXX+X(I)*X(I)
SXY=SXY+X(I)*Y(I)
ENDDO

A=(SXY-SX*SY/DBLE(N))/(SXX-SX*SX/DBLE(N))
B=(SY-A*SX)/DBLE(N)

FORM='(1X,''A='',E14.7,'' B='',E14.7)'
WRITE(*,FORM) A,B,A*ELECT,B*ELECT

END

3.5.3 Notas
a) Utilização de precisão dupla para algumas variáveis.
b) Necessidade de inicializar (igualar a 0) os acumuladores antes de iniciar o somatório.
c) O modo como se procede à abertura do ficheiro de dados de entrada.
d) A utilização da leitura em "Formato *" dá grande liberdade ao modo como se podem inscrever
os dados de entrada no ficheiro, podendo estes ser escritos em pares x,y em cada linha, separados
entre si por um espaço ou uma vírgula. Cada um dos valores x e y pode ser escrito na forma de
uma constante numérica compreensível pelo FORTRAN, de qualquer tamanho, como por
exemplo:
1.0 3.14
1.0E+0 31.4E-01
e) A utilização da constante NMAX definida pela instrução PARAMETER, em vez do seu valor
numérico explícito em cada ponto em que ela aparece, torna o programa mais inteligível e mais
fácil de modificar. Assim, no caso de se pretender alterar esse valor bastará modificar o valor
indicado em PARAMETER.

21
Introdução à Programação

3.6 Sugestões de trabalho


3.6.1 Teste o Programa com dados
inventados, aproximadamente em linha recta. Comprimento Frequência VP
de onda (nm) (1012Hz) (V)
3.6.2 Calcule o valor de h a partir dos dados
da tabela. 400 749 1.0

3.6.3 Reescreva o programa de modo a 414 724 0.99


introduzir como input o comprimento de onda 429 699 0.89
e o potencial de paragem e a obter como
output (formatado) os valores de h e W . 444 674 0.79

3.6.3 Considere o problema do ajustamento de 462 649 0.68


recta que passa obrigatoriamente pela origem.
480 624 0.57
Isto é da determinação da recta y = ax , que
minimiza o erro médio quadrático no 500 599 0.47
ajustamento aos dados { xi , yi } . Deduza a
522 574 0.37
expressão para a e escreva o algoritmo.
545 549 0.28
3.6.4 Introduza no programa REGRES o
cálculo do coeficiente de correlação linear. 571 524 0.17
600 499 0.07
3.7 Conceitos introduzidos
a) Declaração INTEGER
b) Utilização de vectores (DIMENSION);
c) Dimensionamento de vectores com parâmetros (PARAMETER).
d) Utilização de variáveis CHARACTER e leitura de "strings" em formato A;
e) Utilização de precisão dupla (DOUBLE PRECISION);
f) Utilização de ficheiros de entrada de dados (OPEN);
g) Utilização de acumuladores, sua inicialização e realização de somatórios;
h) Utilização de ciclos com contador (DO)
i) Conversão entre tipos, de inteiro para dupla precisão (DBLE)
j) Escrita com formato (' ' e Em.n)

22
Balanço térmico de um painel solar 23

4 DETERMINAÇÃO DE RAÍZES DE EQUAÇÕES NÃO


LINEARES.
4.1 Equilíbrio térmico de um painel solar
Considere o seguinte problema de Termodinâmica: determinar a temperatura de equilíbrio de
uma placa exposta ao Sol e ao ar, considerando dados a temperatura do ar, T0 = 273K , e a
irradiância solar ( E S = 500 W m-2 ).

Fisicamente, o problema consiste em resolver a equação de balanço energético da placa


(primeiro princípio da Termodinâmica ou Princípio da conservação da energia) que se pode
escrever:
Fluxo de calor recebido - Fluxo de calor perdido = 0 (4-1)
Nas condições referidas, a placa perde calor sob duas formas: por radiação e por
condução/convecção. O calor emitido pela placa sob a forma de radiação (medido em Wm-2) é
dado pela lei de Stefan-Boltzmann:

Q& rad = σT 4 (4-2)

em que σ = 5.67 × 10 −8 Wm −2 K −4 é a constante de Stefan-Boltzmann e T a temperatura absoluta


da placa (Kelvin).
O calor perdido directamente para o ar sob a forma de condução/convecção pode ser dado, em
primeira aproximação pela expressão:

Q& conv = α (T − T0 ) (4-3)


em que α é uma constante numérica. Considerar-se-á α = 0.4 Wm K . Nestas condições,
−2 −1

a condição de balanço térmico da placa escreve-se:

E sol − Q& rad − Q& conv = 0


(4-4)
⇒ E sol − σT 4 − α (T − T0 ) = 0

o que constitui uma equação não linear para T .


Diversos problemas de Física envolvem a determinação de raízes de equações não lineares.
Neste exemplo vamos considerar unicamente o caso do problema da determinação de raízes
reais. Em muitos casos, como no exemplo considerado, a função tem mais do que uma raiz real.
Os métodos introduzidos neste problema permitem calcular essas raízes uma a uma.

4.2 Formulação matemática:


Determinar T que satisfaz a equação:

500 − 5.67 × 10 −8 T 4 − 0.4(T − 273) = 0 (4-5)

23
Balanço térmico de um painel solar 24
O problema proposto pertence a uma classe de problemas que passam pela determinação de
raízes de uma equação não linear. O problema pode ser escrito na forma geral:
Calcular x ∈ ℜ : f (x) = 0

No caso de existir mais do que uma raiz, será necessário considerar o processo de selecção das
diferentes raízes.

4.2.1 Comentários
No caso concreto da equação (4), dado que se trata de uma equação do quarto grau, é sabido que
ela tem 4 raízes, sendo que só uma delas é relevante para o problema físico posto. Acrescenta-se
que neste caso existem duas raízes reais (aprox: T=-338.5214924,+304.4922920) e duas raízes
complexas (aprox: T=17.01460017±322.4060715 i), sendo claro que a raiz relevante é a única
real e positiva (dado tratar-se de uma temperatura absoluta). No entanto, deve notar-se que em
alguns problemas poderão existir várias soluções com sentido físico.

4.3 Métodos numéricos:


Salvo casos particulares, as equações não lineares não podem ser resolvidas analiticamente, i.e.,
não podem ser resolvida explicitamente em ordem a x . Todos os métodos disponíveis são
métodos iterativos, que partem de uma estimativa inicial do valor da raiz e procedem por
aproximações sucessivas. Vamos considerar unicamente dois métodos, entre os muitos
disponíveis. Uma descrição pormenorizada destes métodos (e também do método da secante)
pode ser estudada na literatura de análise numérica.

4.3.1 Método da bissecção


O método da bissecção baseia-se directamente no teorema do valor médio. Dado o intervalo
[a, b] se sinal{f(a)} ≠ sinal{f(b)} então existe x∈ [a, b] : f (x) = 0 . O método consiste na divisão
sucessiva do intervalo original em duas partes iguais seguida da escolha do sub-intervalo em que
ocorre a mudança de sinal.
O método da bissecção converge sempre (para uma raiz ou para uma singularidade). A sua
convergência é, no entanto, lenta (linear).

4.3.2 Método de Newton-Raphson


O método de Newton-Raphson, baseia-se directamente no desenvolvimento em série de Taylor
da função em torno de um ponto nas proximidades de uma raíz:
f( xi+1 ) = f( xi ) + f ′( xi ) ( xi+1 - xi ) + ... (4-6)

Impondo a condição f( xi+1 ) = 0 , e desprezando os termos de ordem superior à primeira, obtém-


se:
f( xi )
xi+1 = xi − (4-7)
f (′ xi )

24
Balanço térmico de um painel solar 25
A expressão anterior pode então ser utilizada de forma recursiva para, a partir de uma estimativa
inicial do valor da raíz, obter aproximações sucessivamente melhores do seu valor.
Contrariamente ao método da bissecção, não existe garantia de convergência do método de
Newton-Raphson. No caso em que há convergência esta é bastante rápida (quadrática).

4.4 Algoritmo
Trabalho proposto. Dada a simplicidade dos algoritmos eles estão claramente identificados nos
programas que se seguem.
O problema novo mais interessante que se surge nesta aplicação é o problema do controle da
convergência de um método iterativo. Existem diferentes metodologias para fazer esse controle.
Em qualquer caso, elas envolvem o estabelecimento de uma medida numérica do grau de
convergência atingido e a execução da iteração ENQUANTO essa medida não atingir o valor
pretendido. A implementação desse critério faz-se facilmente com recurso a uma Estrutura de
Controle designada como Iteração Condicional (sem contador) com teste inicial ou Estrutura
DO WHILE que tem a seguinte forma:
ENQUANTO (condição) FAÇA
conjunto de instruções
FIM DE ITERAÇÃO
Resta naturalmente estabelecer qual a condição de paragem. As condições mais comuns baseiam-
se no valor do ERRO ABSOLUTO (avaliado como o valor absoluto da correcção introduzida
pela última iteração) do ERRO RELATIVO (a razão entre o erro absoluto e o valor da solução) e
do NÚMERO DE ITERAÇÕES. Este último critério destina-se unicamente a impedir a
continuação indefinida da iteração em caso de não convergência e utiliza-se em simultâneo com
um dos anteriores.

4.5 Programas Fortran


Nos programas que se seguem apresenta-se um exemplo de programação modular em que se
utilizam subprogramas de dois tipos: SUBROUTINE e FUNCTION. O subprograma
FUNCTION define uma função que, uma vez definida, se utiliza do mesmo modo que as funções
intrínsecas. Tanto a subroutine como a function podem ter um ou mais argumentos, mas a
function só devolve ao programa que a chama um único valor do tipo estabelecido (implícita ou
explicitamente) na sua definição.

4.5.1 Bissecção
PROGRAM TERMO

C DETERMINACAO DA TEMPERATURA DE EQUILIBRIO DE UMA PLACA


C EXPOSTA AO SOL E AO AR

REAL A,B,EPS,X
LOGICAL GO
CHARACTER*1 SON

25
Balanço térmico de um painel solar 26
WRITE(*,*) 'Programa TERMO: determinacao da temperatura de'
WRITE(*,*) 'equilibrio de uma placa exposta ao Sol e ao Ar'
WRITE(*,*) 'utilizando o metodo da bisseccao'

GO=.TRUE.

DO WHILE(GO)

WRITE(*,*) 'Indique os valores de:'


WRITE(*,*) 'Tmin(Lim inf),Tmax(Lim sup),eps(Erro)'
READ(*,*) A,B,EPS

CALL BISSEC(A,B,EPS,X)

WRITE(*,*) 'Raiz=',X,' f(x)=',F(X)

WRITE(*,*) 'Repete: (S/N)'


READ(*,'(A1)') SON
IF(SON.NE.'S' .AND. SON.NE.'s') GO=.FALSE.

ENDDO

STOP
END

SUBROUTINE BISSEC(A,B,EPS,X)
C
C marco 1993, P.Miranda
C determinacao de raizes pelo metodo da bisseccao
C determinar x: f(x)=0
C
C Supoe-se F(X) dado em FUNCTION externa
C
C criterio de paragem: eps (erro absoluto em x)
C
REAL A,B,X,EPS
C
C
C verificar intervalo inicial:
C
IF(F(A)*F(B).GT.0.) THEN
WRITE(*,*) 'erro na escolha do intervalo'
RETURN
ENDIF
C
C iteracao:
C

26
Balanço térmico de um painel solar 27
DO WHILE (B-A.GT.EPS)
X=(A+B)/2.
IF(F(A)*F(X).LT.0.) THEN
B=X
ELSE
A=X
ENDIF
WRITE(*,*) 'X=',X,' F(X)=',F(X)
ENDDO
RETURN
END
C
C a funcao deve ser modificada para cada caso especifico:

C
FUNCTION F(X)
REAL F,X,SIGMA,ALFA,TAR
PARAMETER(SIGMA=5.67E-8,ALFA=0.4,TAR=273.)
C
F=500.-SIGMA*X**4-ALFA*(X-TAR)
RETURN
END

4.5.2 Newton-Raphson
PROGRAM NEWTON
C
C Março 1993, P. Miranda
C determinacao de raizes pelo metodo da Newton-Raphson
C determinar x: f(x)=0
C
C criterio de paragem: eps (erro absoluto em x) e N (numero max iteracoes)
C
REAL X0,X,EPS,DELTAX
INTEGER I,N
C
WRITE(*,*) 'Programa Newton: determinacao de raizes'
WRITE(*,*) 'indique os valores de:'
WRITE(*,*) 'x0(Solução inicial),eps(Erro),n(Num max de iter.)'

READ(*,*) X0,EPS,N
C
C Inicializacao (erro=inf)
C
DELTAX=1.E30
I=0
X=X0
C

27
Balanço térmico de um painel solar 28
C iteracao:
C
DO WHILE (ABS(DELTAX).GT.EPS .AND. I.LT.N)
I=I+1
DELTAX=F(X)/DFDX(X)
X=X-DELTAX
WRITE(*,*) I,' X=',X,' F(X)=',F(X),' DELTA=',DELTAX
ENDDO
C
C solucao:
C
WRITE(*,*) 'Raiz=',X,' f(x)=',F(X), ' Num iter=',I
C
STOP
END
C
C a funcao e a derivada devem ser modificadas para cada caso especifico:
C
FUNCTION F(X)
REAL F,X,SIGMA,ALFA,TAR
PARAMETER(SIGMA=5.67E-8,ALFA=0.4,TAR=273.)
C
F=500.-SIGMA*X**4-ALFA*(X-TAR)
RETURN
END
C
FUNCTION DFDX(X)
REAL DFDX,X,SIGMA,ALFA
PARAMETER(SIGMA=5.67E-8,ALFA=0.4)
C
DFDX=-4.*SIGMA*X**3-ALFA
RETURN
END

4.5.3 Notas
a) Note o controle feito aos valores iniciais de a e b no programa BISSEC.
b) No Programa NEWTON o valor inicial de DELTAX é posto a um número arbitrariamente
elevado (1.E30), de modo a garantir que a iteração procede pelo menos uma vez. Nesse programa
faz-se um teste duplo na iteração aos valores do módulo de DELTAX (tomado como uma
avaliação do erro) e de I (número de iterações). O segundo teste destina-se a garantir o fim do
processo de iteração no caso de: 1) O método não convergir; 2) a condição de erro (EPS) estiver
abaixo do erro de arredondamento.
c) Note também que o método da bissecção converge sempre a menos do erro de
arredondamento. Se se estabelecer um erro demasiado pequeno (em termos relativos), ele deixa
de convergir quando chega ao limite do erro de arredondamento. Portanto, o programa BISSEC
também deveria ter um controle do número de iterações.

28
Balanço térmico de um painel solar 29
d) Qualquer dos dois programas escreve tanto o valor da raiz como o valor da função para
permitir distinguir raízes de descontinuidades.

4.6 Sugestões de trabalho


Teste os programas BISSEC e NEWTON.
Verifique o seu comportamento para diferentes valores iniciais:
a) Bissecção - considere intervalos iniciais incluindo cada uma das raízes isoladamente e
incluindo as 2 ou nenhuma raiz;
b) Newton - considere diferentes de partida nas proximidades das raízes e arbitrariamente
distantes.
Modifique os programas de modo a utilizar precisão dupla e repita os testes anteriores.
Utilize estes programas para outras funções. Considere nomeadamente:
a) A equação do segundo grau do Problema 1;
b) A equação tan(x) = 0 . Verifique o comportamento dos métodos na vizinhança de x = 0 e
π
de x = .
2

4.7 Conceitos de programação introduzidos


a) Iteração sem contador com teste inicial (DO WHILE);
b) Utilização de funções externas (FUNCTION);
c) Controle de erros de input;
d) Verificação da convergência de um método iterativo;
e) Utilização de variáveis lógicas (LOGICAL).

29
Balanço térmico de um painel solar 30

5 ARITMÉTICA COMPLEXA
5.1 Circuito RLC
A aritmética complexa é especialmente apropriada para a solução de diversos problemas de
circuitos em corrente alterna. Um exemplo concreto é fornecido pelo circuito RLC descrito na
Figura 1.
Os componentes do circuito representado na
Figura 1 são componentes lineares
caracterizados pelas relações tensão-corrente:
V R= R I
1
V C = ∫ I dt (5-1)
C
dI
V L= L
dt

Se o circuito estiver sujeito a uma tensão


sinusoidal V (circuito em corrente alterna),
tem-se:
V = V L + V C + V R = V 0 cos( ωt) (5-2)

A solução do problema, isto é o cálculo da


intensidade de corrente I, envolve, à primeira
vista, a solução de uma equação diferencial. Dadas as propriedades das funções seno e coseno,
verifica-se, no entanto, que o problema pode ser resolvido, no caso estacionário, por meio de
operações algébricas sobre números complexos. Para o efeito, definem-se impedâncias
complexas dos diferentes componentes lineares:
i
ZR= R ZC = - ZL=i ω L (5-3)
ωC

o que permite escrever para cada componente uma lei de Ohm (generalizada):
V=Z I (5-4)
se se subentender que quando se escreve a tensão ou a corrente na forma:

V = V 0 ei ω t I = I 0 ei( ωt + φ ) (5-5)

significa:

V = Re{ V 0 ei ω t } I = Re{ I 0 ei( ωt + φ ) } (5-6)

em que o operador Re{} (parte real de{}) é, portanto, subentendido.


Uma vez definidas as impedâncias complexas cada circuito pode ser resolvido mediante
utilização das leis de Kirchoff (Lei das malhas e Lei dos nós), exactamente do mesmo modo que

30
Balanço térmico de um painel solar 31
no caso dos circuitos só com Resistências. Em resultado dessas leis obtém-se um sistema de
equações com coeficientes complexos para as incógnitas do problema (por exemplo, as correntes
nas diferentes malhas). No caso do circuito RLC representado na Figura 1, obtém-se uma única
equação complexa para a corrente, que se pode escrever:

⎡ i ⎤
V 0 e = ⎢ R + iω L -
iω t i( ωt +φ )
⎥ I0 e (5-7)
⎣ ωC ⎦
eliminando o termo comum eiωt e escrevendo a impedância complexa da série RLC na forma
a eiθ obtém-se:

V 0 = [R2 + ω - 2 C - 2 + ω 2 L2 ] etan
- 1⎛ ωL
1 ⎞
1/2 ⎜ ⎟ iφ
-
⎝ R RωC ⎠ I0 e (5-8)

ou seja:

V0
I0=
[R + ω C -2 + ω 2 L2 ]
2 -2 1/2

(5-9)
⎡ 1 ωL ⎤
φ = tan -1 ⎢ -
⎣ RωC R ⎥⎦
As equações anteriores (9) podem ser utilizadas directamente para obter a resposta do circuito,
em função da frequência, utilizando unicamente aritmética real. Se se utilizar aritmética
complexa pode resolver-se directamente a equação (7), que é muito mais simples.

5.2 Aritmética complexa em Fortran


Em Fortran é possível utilizar variáveis complexas em precisão simples (COMPLEX *8) e em
precisão dupla (COMPLEX*16). Estas variáveis têm de ser obrigatoriamente declaradas. Por
outro lado, a linguagem possui as necessárias funções de conversão (entre real e complexo) e a
generalidade das funções matemáticas.

5.2.1 Declarações
A declaração de uma constante ou variável (A) como complexo faz-se mediante a instrução:
COMPLEX A
que é equivalente a:
COMPLEX*8 A
Dado que um número complexo é na verdade um par de números reais as declarações anteriores
reservam 4 bytes (32 bits) para cada um desses números reais. Se se pretender realizar os
cálculos com dupla precisão (64 bits por cada elemento do par) deverá escrever-se:
COMPLEX*16 A

5.2.2 Conversões
Existe um número significativo de funções de conversão. As mais importantes são:

31
Balanço térmico de um painel solar 32

Função Significado
REAL A,B
COMPLEX
C,CC

C=CMPLX(A,B) Converte o par de Reais A,B no complexo C

CC=CONJG(C) Complexo conjugado de C

A=CABS(C) Módulo do complexo C

A=REAL(C) Parte real do complexo C

A=AIMAG(C) Parte imaginária do complexo C

5.2.3 Outras Funções Intrínsecas


Em geral, as funções sobre números complexos têm nomes quase iguais às funções
correspondentes sobre números reais, diferindo unicamente pelo acréscimo do prefixo C.
Exemplo: CSIN(C), CCOS(C), etc..

5.3 Cálculo da corrente no circuito RLC


Para fazer o cálculo da corrente do circuito RLC em função da frequência (ω) é necessário
unicamente resolver, para uma gama de valores da frequência, a equação (7). A conversão para
Fortran é bastante simples.

PROGRAM RLC
C
C Calculo da corrente em função da frequência num circuito RLC
C
COMPLEX I,Z,J
REAL R,L,C,OMEGA,I0,PHI
PARAMETER(R=1000.,L=1.E-3,C=1.E-6,V0=1.)

J=CMPLX(0.,1.)
PI=4.*ATAN(1.)

OMEGA=2.*PI
DO WHILE(OMEGA.LT.2.*PI*1.E6)
Z=R+J*OMEGA*L-J/(OMEGA*C)
I=V0/Z
I0=CABS(I)
PHI=ATAN2(AIMAG(I),REAL(I))

32
Balanço térmico de um painel solar 33
WRITE(*,'(F10.0,E14.7,F10.5)') OMEGA,I0,PHI/PI
OMEGA=OMEGA*1.2
ENDDO
END

5.3.1 Comentários
Para evitar confusões entre a corrente I e o número imaginário i = - 1 , representa-se este último
com J. Notar a utilização da função intrínseca CMPLX para o definir.
O programa faz um varrimento da frequência entre 1 Hz e 106Hz. O cálculo da frequência
angular implica a multiplicação por 2π. O varrimento é feito segundo uma série geométrica de
razão 1.2. Note a utilização de diferentes formatos na escrita da frequência angular, da amplitude
e da fase da corrente.
A Figura apresenta de forma gráfica o resultado do programa anterior.

Fig. 5.1 – Circuito RLC.

33
Balanço térmico de um painel solar 34

6 SOLUÇÃO DE EQUAÇÕES DIFERENCIAIS ORDINÁRIAS


COM CONDIÇÕES FRONTEIRA NUM PONTO
6.1 Identificação do Problema e Formulação Matemática

6.1.1 Lei de Newton do arrefecimento


Vamos considerar um problema simples de termodinâmica: o problema do arrefecimento de uma
chávena de café. Em primeira aproximação o processo de arrefecimento obedece à lei de Newton
do arrefecimento, expressa pela relação diferencial:
dT
= - r (T - T a ) (6-1)
dt
em que T(t) é a temperatura do café em cada instante, T a a temperatura do ar e r um coeficiente
de transferência.
O problema considerado é um problema unidimensional e a sua solução consiste na solução da
equação diferencial ordinária (1) dado o valor inicial da temperatura do café e os valores das
constantes T a e r . A solução analítica é dada por:

T = T a + ( T 0 - T a ) e-r t (6-2)

6.1.2 Integração das equações da Mecânica


Existem muitos outros problemas em Física que apresentam uma estrutura formalmente idêntica.
Esse é o caso nomeadamente da solução r
do problema típico de Mecânica: dado um ponto
material actuado por uma lei de forças F(t) , inicialmente na posição rr0 e com velocidade vr0 ,
calcular a sua posição no instante t. Um exemplo muito simples desta família de problemas é
dado pelo movimento unidimensional de um ponto material de massa m , com velocidade inicial
ascendente vr0 = v0 er z , num campo gravítico uniforme de aceleração - g er z , já considerado
anteriormente no âmbito deste curso (Cap. 2). A lei do movimento desse corpo (segunda lei de
Newton da Mecânica) pode escrever-se:
2
d z
2
=- g (6-3)
dt
O problema apresentado na equação (3) apresenta uma dificuldade adicional em relação ao
problema (1.1) visto exigir a solução de uma equação diferencial ordinária de segunda ordem.
Por esse motivo, a sua solução requer o estabelecimento de duas condições iniciais, para a
posição e para a velocidade. É claro, no entanto, que uma equação diferencial de segunda ordem
pode ser facilmente substituída por um sistema equivalente de equações diferenciais de primeira
ordem. Assim, em vez da equação (3) pode escrever-se:

34
Balanço térmico de um painel solar 35
⎧ dv
=- g
⎪⎪ dt
⎨ (6-4)
⎪ dz
=v
⎪⎩ dt

Prosseguindo na mesma linha, podem igualmente considerar-se problemas bi ou tridimensionais.


Um exemplo interessante é fornecido pelo movimento da Terra na sua órbita em torno do Sol. A
lei do movimento é neste caso dada pela conjunção da Lei da Atracção Universal com a Segunda
Lei de Newton da Mecânica, expressa na relação:
r
d2r GM r
2
=- 3 r (6-5)
dt r

em que M e m são, respectivamente, as massas do Sol e da Terra, G a constante de gravitação e


r
r o vector posição da Terra com referência ao Sol. Numa boa aproximaçao, pode considerar-se
que o Sol e a Terra são pontuais e que o Sol se encontra fixo. Por outro lado o problema pode ser
analisado de forma bidimensional, no plano da eclítica. Neste caso, a equação vectorial dá
origem a um sistema de duas equações escalares, uma para cada componente:

d2 x GM
=- x
dt 2 ( x + y2 )
2
3/2

(6-6)
d2 y GM
2
= 3/2
y
dt ( x + y2 )
2

desdobrando as duas equações diferenciais de segunda ordem, obtemos, portanto, neste caso, um
sistema de 4 equações diferenciais, cuja solução exige quatro constantes de integração (as
condições iniciais para as duas componentes da velocidade e da posição).
Todos os problemas considerados anteriormente têm tratamento analítico simples, pelo que é
fácil confirmar os resultados a obter numericamente. No entanto, é preciso esclarecer que os
métodos numéricos podem ser utilizados (e nesse caso é que são verdadeiramente uteis) em
situações de difícil ou impossível solução analítica.
Finalmente deve notar-se que todos os problemas apresentados são traduzidos por sistemas de
equações diferenciais ordinárias (uma só variável independente) em que as condições fronteira
são fornecidas num único ponto, isto é, para t=0. Outros casos exigirão tratamento diferenciado.

6.2 Métodos numéricos (Método de Euler)


A solução numérica de (sistemas de) equações diferenciais, ordinárias ou não, passa
necessariamente pela sua transformação (em sistemas) de equações algébricas. Existem várias
metodologias possíveis para operar essa transformação. Todas elas exigem, no entanto, a redução
do problema de um domínio contínuo (no tempo e/ou no espaço) para um domínio discreto, isto
é a limitação do número de graus de liberdade a um número finito. Na prática, isso quer dizer que
a equação (ou o sistema) vai ser resolvida numa rede discreta de pontos da variável
independente. Isto é define-se um intervalo de discretização ∆x e resolve-se o problema para
x = x0 + i∆x {i = 0,..., N} . Deve notar-se que x é a variável independente que, nos casos apresentados
anteriormente é a variável tempo.

35
Balanço térmico de um painel solar 36

Uma vez estabelecida a rede, a metodologia mais simples consiste em substituir directamente as
derivadas presentes nas equacões por aproximações obtidas por razões entre diferenças finitas
das diferentes variáveis. Assim, uma derivada de primeira ordem pode ser, por exemplo,
substituída por:
dy y(a + ∆x) - y(x)
= (6-7)
dx (x= a) ∆x

A utilização da aproximação anterior, ou de qualquer outra metodologia, envolve, pelo menos, a


consideração de três conceitos básicos, que não serão, no entanto, analisados em nenhuma
profundidade neste curso:
1) Qual é a precisão desta representacão ?
2) Existe convergência ? Isto é a solução numérica tende para a solução analítica quando o
intervalo de discretização ∆x → 0 ?
3) O método é estável ? Isto é, o erro cresce de forma "controlada" ou exponencialmente ?
No caso da representação sugerida anteriormente, é simples verificar que existe convergência. O
seu grau de precisão pode ser analisado recorrendo à série de Taylor:

dy 1 d2 y 2 1 d3 y 3
y(x + ∆x) = y(x) + ∆x + ∆x + ∆x + ... (6-8)
dx 2! dx 2 3! dx3

Resolvendo para a primeira derivada pode escrever-se:


dy y(x + ∆x) - y(x)
= + E( ∆x) (6-9)
dx ∆x
em que E( ∆x) representa o erro de truncatura, cujo desenvolvimento em série de potências de
∆x tem como termo de menor ordem um termo de primeira ordem. Nestas condições diz-se que a
aproximação utilizada é uma aproximação de primeira ordem, querendo significar que à medida
que ∆x → 0 o erro de truncatura se torna proporcional a ∆x .
O estudo do problema da estabilidade é, em geral, muito mais complexo. No caso dos problemas
de Mecânica existe muitas vezes um teste simples que permite verificar, à posteriori, a
estabilidade de um método a partir do cálculo da energia mecânica total do sistema em cada
instante. A conservação de energia é uma condição suficiente de estabilidade (mas não de
precisão ou de convergência).
Estamos agora em condições de apresentar o método de Euler. O método consiste simplesmente
em, a partir da posição inicial x0 (notar,mais uma vez, que a variável independente tanto pode
ser o espaço como o tempo) e para cada posição na rede x = x0 + ∆x , calcular o valor de cada uma
das variáveis dependentes (e.g. temperatura, velocidades e posições) a partir da fórmula:
y i+1,k = y i,k + y ′( xi,k , yi,k ) ∆x (6-10)

36
Balanço térmico de um painel solar 37

em que i identifica o ponto da rede e k a equação do sistema.

6.2.1 Comentários
O método de Euler tem em geral uma precisão insuficiente. Na prática é sempre preferível
recorrer a métodos de 2ª ou mesmo de 4ª ordem (e.g. métodos de Runge-Kutta), cuja utilização é
ainda relativamente simples. A introdução do método de Euler neste curso deve-se, pois,
essencialmente a razões pedagógicas, dado o carácter altamente intuitivo do seu
desenvolvimento.
Quando o método de Euler se utiliza para resolver equações de ordem superior à primeira, é
possível utilizar os valores do primeiro integral no extremo superior do intervalo de integração
para calcular o segundo integral. Muitas vezes esse procedimento é necessário para evitar
instabilidade. Na integração das equações da Mecânica utilizar-se-á essa variante do método de
Euler. Concretamente, far-se-á:

vi+1 = vi + a( xi ) ∆t
(6-11)
xi+1 = xi + vi+1 ∆t

6.3 Algoritmo

6.3.1 Arrefecimento da chávena de café


Vamos considerar uma chávena com café cuja temperatura inicial é de 80oC e que se encontra
numa sala em que a temperatura do ar é de Ta=20oC. Admite-se que a temperatura do ar é
constante. É conveniente neste caso utilizar como unidades oC (para a temperatura) e minutos
(para o tempo). Nessas unidades podemos utilizar o valor de r=0.1 (min-1). Sugere-se o estudo do
comportamento da solução para outros valores dos parâmetros.
O algoritmo pode então escrever-se:

Lei do Arrefecimento de Newton - Método de Euler

∆t ← 0.01
r ← 0.1
N ← 200
Ta ← 20.
T ← 80.
t←0
PARA i=1 ATÉ N
T ← T - r (T - Ta) ∆t
t ← t + ∆t
ESCREVER t,T
FIM DE CICLO

37
Balanço térmico de um painel solar 38

6.3.2 Queda de um corpo


Trabalho proposto.

6.3.3 Movimento planetário


As equações relevantes para este caso foram apresentados na secção 1. Dado que neste problema
as variáveis tomam valores muito elevados no Sistema Internacional de unidades, com
consequentes problemas numéricos, é preferível utilizar como unidades de base o ano (unidade
de tempo) e a "unidade astronómica" (unidade de distância), em que 1 u.a. é a distância média da
Terra ao Sol _ 150 000 000 km. A unidade de massa é irrelevante uma vez que no produto G M
ela é cancelada. A conversão de unidades está feita explicitamente no algoritmo.

Movimento Planetário - Método de Euler

Constantes (Reais):
G ← 6.67*10-11
M ← 1.99*10+30
UA ← 1.5*10+11
ANO ← 365*24*3600
GM ← G*M*ANO2*UA-3

Inicializar: x0, y0, vx0, vy0, ∆t, N

X ← x0
Y ← y0
VX ← vx0
VY ← vy0

PARA I=1 ATÉ N


VX ← VX + AX(X,Y)*∆t
VY ← VY + AY(X,Y)*∆t
X ← X + VX*∆t
Y ← Y + VY*∆t
FIM DE CICLO

ESCREVER RESULTADOS

Funções:
AX(X,Y)= -GM*X*(X2+Y2)-3/2
AY(X,Y)= -GM*Y*(X2+Y2)-3/2
FIM

38
Balanço térmico de um painel solar 39
6.4 Programas FORTRAN

6.4.1 Arrefecimento

PROGRAM ARREFECE
C
C Cálculo da evoluçao da temperatura de um corpo em contacto com
C o ar utilizando a lei Newton do arrefecimento.
C
C METODO DE EULER
C
C TSA: Solucao analítica
C
CHARACTER*30 FNAME

WRITE(*,*) 'Arrefecimento de um corpo - Lei de Newton'

WRITE(*,*) 'Temperatura inicial='


READ(*,*) T0
WRITE(*,*) 'Temperatura do AR='
READ(*,*) TA
WRITE(*,*) 'Coeficiente de arrefecimento='
READ(*,*) R

WRITE(*,*) 'Passo de tempo='


READ(*,*) DELTAT
WRITE(*,*) 'Numero de iteracoes='
READ(*,*) N

WRITE(*,*) 'Nome do ficheiro de RESULTADOS:'


READ(*,'(A30)') FNAME
OPEN(10,FILE=FNAME)

T=0.
TEMP=T0

WRITE(10,'(3F10.3)') T,TEMP

DO I=1,N
TEMP=TEMP-R*DELTAT*(TEMP-TA)
T=I*DELTAT
TSA=TA+(T0-TA)*EXP(-R*T)
WRITE(10,'(3F10.3)') T,TEMP,TSA
ENDDO

END

39
Balanço térmico de um painel solar 40
6.4.2 Queda de um grave
Trabalho proposto.

6.4.3 Movimento Planetário

PROGRAM PLANETA
C
C Cálculo da posicao de um Planeta na sua orbita em torno do Sol
C
C Unidades utilizadas:
C tempo - ano
C distancia - 1 UA (unidade astronomica = 150 000 km)
C
C METODO DE EULER
C
C ENERGY : energia mecânica total do planeta em cada instante
C
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
DOUBLE PRECISION MSOL

PARAMETER(ANO=365.*24.*3600.,UA=1.5D11)
PARAMETER(BIGG=6.67D-11,MSOL=1.99D30)
PARAMETER(GM=BIGG*MSOL*ANO**2/UA**3)
C
CHARACTER*30 FNAME
C
C Funcoes: (INTERNAS)
C
AX(X,Y)=-GM/(X**2+Y**2)**1.5D0*X
AY(X,Y)=-GM/(X**2+Y**2)**1.5D0*Y
C
WRITE(*,*) 'Movimento planetario'
WRITE(*,*) 'Integracao das equacoes do movimento pelo metodo de'
: ,' Euler'
WRITE(*,*) ' '
C
WRITE(*,*) 'POSICAO INICIAL X,Y (u.a.):'
READ(*,*) X0,Y0

WRITE(*,*) 'VELOCIDADE INICIAL VX,VY (u.a./ano):'


READ(*,*) VX0,VY0
C
WRITE(*,*) 'Passo de tempo (ANO):'
READ(*,*) DELTAT

WRITE(*,*) 'Numero de iteracoes:'


READ(*,*) N

40
Balanço térmico de um painel solar 41
C
WRITE(*,*) 'Nome do ficheiro de RESULTADOS:'
READ(*,'(A30)') FNAME
OPEN(10,FILE=FNAME)
C
X=X0
Y=Y0
VX=VX0
VY=VY0
C
ENERGY=0.5D0*(VX**2+VY**2)-GM/DSQRT(X**2+Y**2)
WRITE(*,*) 'ENERGIA:',T,ENERGY
WRITE(*,*) ' '
WRITE(10,*) N+1,0
WRITE(10,'(2E15.7)') X,Y
C
DO I=1,N
T=I*DELTAT
VX=VX+AX(X,Y)*DELTAT
VY=VY+AY(X,Y)*DELTAT
X=X+VX*DELTAT
Y=Y+VY*DELTAT
WRITE(10,1000) X,Y
IF(MOD(I,10).EQ.0) THEN
ENERGY=0.5D0*(VX**2+VY**2)-GM/DSQRT(X**2+Y**2)
WRITE(*,'(''+'',A8,I5,E14.7)') 'ENERGIA:',I,ENERGY
ENDIF
ENDDO
STOP
END

6.4.3.1 Comentários
A listagem apresentada inclui diversos aspectos interessantes não referidos no algoritmo:
1) A definição das funções AX e AY é feita sem recurso a um subprograma (FUNCTION).
As funções assim definidas são INTERNAS ao programa ou subrotina e não podem ser
utilizadas a partir de outros subprogramas. As funções internas devem ser definidas
imediatamente após as declarações, antes de qualquer instrução "executável". Trata-se de
uma possibilidade oferecida pelo FORTRAN que tem vantagens no caso de funções simples,
dado simplificar o código.
2) A energia mecânica total é calculada de 10 em 10 passos de tempo, para verificação da
sua (não) conservação pelo método. Em relação a isso dois aspectos devem ser
considerados: a) A utilização da função MOD(I,J) - esta função calcula o resto da divisão
inteira de I por J, só será 0 se I for um múltiplo de J; b) O formato utilizado para a escrita do
valor da energia parte do princípio de que o monitor é tratado como uma impressora, pelo
que as linhas sucessivas deverão aparecer sobrepostas (o primeiro caracter é o '+'),

41
Balanço térmico de um painel solar 42
permitindo uma visualização muito rápida das alterações dos diferentes algarismos
significativos sem ter que parar constantemente a saída para o monitor (com CTRL-S, por
exemplo) e sem encher o écran de números em movimento vertical (SCROLL).
3) O programa utiliza precisão dupla em todos os cálculos.

6.5 Algumas soluções

6.5.1 Lei de Newton do Arrefecimento


A Figura apresenta 5 soluções do problema do arrefecimento utilizando passos de tempo de 6.25
min, 5 min, 2 min, 1 min e 0.1 min, com a integração a prosseguir até t=50 min. A solução
analítica também se encontra no gráfico, mas é, a esta escala, indistinguível da solução numérica
com maior resolução. O método de Euler parece pois suficiente para resolver o problema, desde
que o número de pontos não seja muito pequeno.

Fig. 6.1 – Arrefecimento de um corpo

42
Balanço térmico de um painel solar 43

6.5.2 Movimento Planetário


Algumas soluções obtidas na integração das equações da Mecânica para o movimento planetário
são apresentadas nas Figuras 6.2a-c. Em todos os casos utilizou-se: ∆t=0.001 ano-1, N=2000,
x0=1 ua, y0=0. Nos casos das Figuras 2a e 2b as sucessivas órbitas sobrepõem-se. No caso da
Figura 2c, cuja órbita tem maior elipticidade, o erro de truncatura é muito significativo (e visível
também em oscilações da energia Mecânica total). Esse erro será mais acentuado nas regiões de
maior variação da aceleração. O erro de truncatura não produz, neste exemplo, um crescimento
(ou diminuição) sistemático da energia do sistema (i.e. da distância média do Planeta ao Sol) mas
traduz-se em oscilações importantes dessa energia ao longo da órbita, que fica sujeita a uma
precessão espúria. Em qualquer dos casos, parece claro que o método de Euler não é o método
mais indicado.

Fig 6.2 Movimento planetário (método de Euler)

43
Balanço térmico de um painel solar 44
6.5.3 Trabalho proposto
a) Introduza no programa do movimento planetário um controle à evolução do momemto
angular do planeta.
b) Considere o caso da queda de um grave introduzindo o efeito da resistência do ar,
admitindo que a força de resistência é proporcional ao quadrado da velocidade em cada
instante e tem a direcção oposta à velocidade.
c) Considere o movimento de um oscilador harmónico governado pela lei F=-kx. Integre as
equações do movimento desse corpo, calculando em cada instante a sua energia total.

6.6 Sumário dos conceitos introduzidos


Métodos numéricos
a) Representação de derivadas por diferenças finitas;
b) Precisão, convergência e estabilidade de um método numérico;
c) Condições fronteira;
Programação
d) Funções em dupla precisão: DEXP (exponencial) DSQRT (raíz quadrada);
e) Funções internas;
f) Linhas de continuação.

44
Balanço térmico de um painel solar 45

7 INTEGRAÇÃO NUMÉRICA
7.1 Identificação do Problema e Formulação Matemática
Existem muitas situações em que a solução de problemas em Física passam pelo cálculo de
integrais. A necessidade de proceder a esse cálculo por métodos numéricos surge sempre que a
função integranda oferece dificuldades ao tratamento analítico, por não ser integrável
analiticamente ou por a integração analítica ser muito laboriosa, ou quando os limites de
integração impedem ou dificultam o recurso a métodos analíticos. Outro caso em que o recurso a
métodos numéricos é obrigatório é quando a função integranda não é conhecida analiticamente,
sendo o seu valor dado (por exemplo a partir de medida experimental) num número finito de
pontos.
Para simplificar, vão considerar-se dois exemplos de Mecânica. O primeiro passa pela solução de
um integral simples. O segundo exige o cálculo de um integral triplo difícil de calcular
analiticamente dada a definição dos limites de integração.

7.1.1 Cálculo do momento de inércia de uma placa fina homogénea em


relação a um eixo
Vai-se considerar o problema de calcular
o momento de inércia, em relação ao eixo
dos yy, da placa fina apresentada na
Figura 1, de densidade ρ=3.5kg m-2, cuja
forma é dada por:
180

⎛ ⎞
∫ x f (x) dx ; f (x) = sin ⎜ 180 ⎟ (7-1)
2
I=
0 ⎝ ⎠

A solução do problema consiste no


cálculo do integral:
180

⎛ ⎞
∫ x f (x) dx ; f (x) = sin ⎜ 180 ⎟ (7-2)
2
I=
0 ⎝ ⎠

7.1.2 Cálculo do centro de massa de uma secção de um toro


Considere-se o problema do cálculo do centro de massa do sólido, de densidade ρ=1.2×103 kg m-
3
, obtido a partir de um toro (de raio menor 2 e raio maior 4) dado por:

2
z + ( x + y - 3) ≤ 1
2 2
2
(7-3)

por intermédio do corte:


x≥1 y ≥3 (7-4)

Neste caso o problema consiste no cálculo do integral triplo:

45
Balanço térmico de um painel solar 46
r
∫ ∫ ∫ ρ r dV
V
(7-5)
∫ ∫ ∫ ρ dV
V

com limites de integração dados pelas desigualdades anteriores. O problema não é tratável
analiticamente dada a geometria peculiar do corpo.

7.2 Métodos numéricos


Existem diversos métodos numéricos utilizáveis no cálculo de integrais. No caso do problema
1.1 vão considerar-se 3 métodos possíveis, de simples implementação, mas que são, em geral,
suficientemente eficientes (método do ponto médio, método do trapézio, método de Simpson).
No caso do problema 1.2 introduzir-se-á uma técnica extremamente geral de integração numérica
(método de Monte Carlo), que permite resolver, ainda que com um tempo de cálculo
relativamente elevado, muitos problemas de difícil tratamento.

7.2.1 Cálculo de integrais por interpolação entre pontos regularmente


espaçados
O método mais simples de calcular integrais consiste em utilizar directamente a definição de
integral de Riemman. Neste caso, divide-se o domínio de integração em N intervalos, limitados
por N+1 pontos, e calcula-se o integral como a soma das áreas definidas em cada intervalo. Para
calcular estas áreas considera-se que a função varia em cada intervalo de acordo com uma lei
simples, concretamente, que ela é aproximada por um polinómio de baixo grau.
Assim, em todos os casos vai considerar-se a discretização:

xi = x0 + i h (7-6)

em que h é o intervalo de discretização.

7.2.1.1 Método do ponto médio


Este método consiste em admitir que o valor médio da função em cada intervalo é igual ao seu
valor no ponto médio. Esta hipótese será satisfeita, em particular, se a variação for linear dentro
do intervalo.
Neste caso, com N intervalos, calcula-se o integral na forma:

∫ f (x) dx _ S N = h ∑ f i -1/2 = h [ f 1/2 + f 3/2 + ...+ f N1/2 ]


xN N
(7-7)
x0 i=1

7.2.1.2 Método do trapézio


Esto método é semelhante ao anterior. Neste caso, no entanto, toma-se como valor médio da
função integranda a média aritmética do seu valor nas duas extremidades do intervalo.
Geometricamente, esta regra consiste em aproximar o integral pela área de um trapézio, isto é,
em aproximar a função integranda por um segmento de recta no intervalo.

46
Balanço térmico de um painel solar 47
Com N intervalos tem-se:
xN N
f i -1 + f i ⎡f f ⎤
∫ f (x) dx _ S N _ h ∑ = h ⎢ 0 + f 1 + f 2 + ...+ f N -1 + N ⎥ (7-8)
x0 i=1 2 ⎣2 2 ⎦

7.2.1.3 Método de Simpson


Tanto nol método do ponto médio como nométodo do trapézio o erro decresce com N2. É
possível obter métodos de convergência mais rápida, se a função integranda for suficientemente
suave, recorrendo a polinómios interpoladores de ordem mais elevada. O método de Simpson
corresponde ao passo seguinte nesse sentido, utilizando como interpolador uma parábola. Nesse
caso, mercê de um cancelamento que ocorre no desenvolvimento do problema, obtém-se um
método cujo erro decresce com N4.
Para definir uma parábola são precisos três pontos. Assim, impondo o valor da função nos dois
extremos do intervalo e no ponto médio, obtêm-se por substituição:

⎡1 1 ⎤
x2
4
∫ f (x) dx _ h ⎢ f 0 + f 1 + f 2 ⎥
⎣3 3 3 ⎦
(7-9)
x0

com N+1 pontos obtém-se:


xN
⎡f 4 f1 2 f2 4 f3 2 f N - 2 4 f N -1 f N ⎤
∫ f (x) dx _ S N = h ⎢ 0 +
⎣3 3
+
3
+
3
+ ...+
3
+
3
+
3 ⎥⎦
(7-10)
x0

7.2.2 Método de Monte Carlo


O método de Monte Carlo baseia-se no teorema do mesmo nome. De acordo com este teorema
dado um volume V e N xi pontos aleatoriamente distribuídos nesse volume, com uma distribuição
uniforme, tem-se:
2
< f > - < f >2
∫ f (x, y, z) dV _ V < f > ± V (7-11)
N

em que:
1 N 1 N
< f >= ∑ f ( xi , y i , z i ) < f 2
>= ∑ [ f ( xi , y i , z i ) ]
2
(7-12)
N i=1 N i=1

Em geral só é fácil obter uma série de pontos aleatoriamente distribuídos com distribuição
uniforme, em volumes muito simples, como por exemplo um paralelepípedo. Se não for esse o
caso, o método pode ainda ser utilizado substituindo o volume V por um paralelepípedo P que
contenha esse volume e redefinindo a função integranda. Nesse caso faz-se:

∫ ∫ ∫ f dV = ∫ ∫ ∫ g dP
V P

⎧ f ( xi ) xi ∈ V
(7-13)
g( xi ) = ⎨
⎩ 0 xi ∉ V

47
Balanço térmico de um painel solar 48
O preço a pagar pela substituição anterior consiste numa redução da velocidade de convergência
do método, inversamente proporcional ao aumento do volume de V para P.

7.3 Algoritmo

7.3.1 Cálculo do momento de inércia de uma placa


Trabalho proposto. Os algoritmos correspondem unicamente ao cálculo dos somatórios
apresentados anteriormente, para cada um dos métodos.

7.3.2 Cálculo do centro de massa de um corpo de geometria


complicada, pelo método de Monte Carlo
O cálculo de uma série de N números aleatórios exige normalmente uma inicialização do
sistema, mediante a definição de uma "semente", seguida de N chamadas à rotina geradora de
números aleatórios. O sistema é determinista, gerando para cada "semente" sempre a mesma
série de números. Vai partir-se do princípio de que os números gerados se encontram
uniformemente distribuídos no intervalo [0,1].
O algoritmo seguinte refere-se unicamente ao cálculo de cada um dos integrais triplos
necessários para determinar o centro de massa. São necessários 4 integrais triplos (um para a
massa e um para cada uma das três componentes do centro de massa). A diferença entre eles está
unicamente na função integranda f(x,y,z). Note que o Programa Fortran procede ao cálculo de
todos os integrais necessários.

Método de Monte Carlo

Comentários:
Paralelipedo 1≤x≤4; 3≤y≤7; -1≤z≤1
2
Toro z 2 + ⎛⎜ x 2 + y 2 3 ⎞⎟ le 1
⎝ ⎠

Algoritmo:
RO←1.2 103
Ler N
Inicializar gerador de números aleatórios
S←0
Q←0
PARA i=1 ATE N
Calcular os números aleatórios x,y,z

Com: Deslocar e escalar os números para o interior do paralelipipedo


x←1+x*3
y←3+y*4
z←-1+z*2
SE (x,y,z) é interior ao Toro ENTÃO
S←S+f(x,y,z)

48
Balanço térmico de um painel solar 49
Q←Q+f(x,y,z) 2

FIM DE OPÇÕES
FIM DE CICLO
S←S/N
Q←Q/N
SMC←S*V
Q - S2
ERRO← V
n
ESCREVER SMC, ERRO

7.4 Programas Fortran

7.4.1 Métodos do ponto médio e do trapézio


Trabalho proposto.

7.4.2 Método de Simpson

PROGRAM SIMP
C
C Calculo do momento de inercia de uma placa de densidade RO
C e forma f(x), pelo método de Simpson
C
IMPLICIT DOUBLE PRECISION (A-H,O-Z)

WRITE(*,*) 'Número de pontos:'


READ(*,*) N

WRITE(*,*) 'Limites de integração (a,b)'


READ(*,*) A,B
C
CALL SIMPSON(A,B,N,S)
C
WRITE(*,'(1X,A11,E14.7)') 'INTEGRAL = ',S
STOP
END
C
C
C
SUBROUTINE SIMPSON(A,B,N,S)
C
C Cálculo de integrais pelo método de Simpson
C Integral FUN(x) dx
C Limites A,B

49
Balanço térmico de um painel solar 50
C
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
EXTERNAL FUN
C
H=(B-A)/N
C
IF(N.LT.3) THEN
WRITE(*,*) 'Erro: N<3'
RETURN
ENDIF
C
S=FUN(A)+4.*FUN(B-H)+FUN(B)
DO I=1,N-3,2
X=I*H
S=S+4.*FUN(X)+2.*FUN(X+H)
ENDDO

S=S/3.*H
C
RETURN
END
C
FUNCTION FUN(X)
IMPLICIT DOUBLE PRECISION (A-H,O-Z)

PI=4.D0*DATAN(1.D0)
RO=3.5D+3
FUN=RO*X*X*DSQRT(ABS(SIN(PI*X/180.D0)))

RETURN
END

7.4.2.1 Comentários
a) Utilizou-se dupla precisão para reduzir a acumulação de erros de arredondamento no caso
de se utilizar um número grande de pontos no cálculo do integral. Caso contrário (sugere-se
a verificação) pode criar-se facilmente a situação em que um aumento do número de pontos
se traduz numa degradação do resultado. Note que mesmo com dupla precisão esse
problema não é completamente evitado, mas é improvável para valores utilizáveis de N.
b) Note o modo como foi escrito o cálculo do somatório do método de Simpson, agrupando
os termos em pares e tratando de modo independente 3 termos (o primeiro e os dois
últimos). Assim, cada par tem sempre os mesmos 2 pesos (4/3 e 2/3), por esta ordem.
Alternativamente, podia ter-se tratado de modo independente os dois primeiros e o último
termo (usando pesos 2/3 e 4/3).
c) A rotina SIMPSON pode ser utilizado para qualquer outra função integranda, bastando
modificar a FUNCTION FUN(X).

50
Balanço térmico de um painel solar 51
d) Note que se N=3 o ciclo do não é executado nenhuma vez.
e) Note a definição de π (PI) em dupla precisão.

7.4.3 Método de Monte Carlo

PROGRAM MONTCAR
C
C Cálculo do centro de massa de uma secção de um toro.
C
C Integração numérica pelo método de Monte Carlo
C
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
INTEGER*2 ISEED
REAL*4 AL
PARAMETER(RO=1.2E3)
C
C Inicialização do Gerador de números aleatórios
C
WRITE(*,'(A\)') ' Semente (Inteiro 2 bytes)='
READ(*,*) ISEED
CALL SEED(ISEED)
C
WRITE(*,'(A\)') ' Numero de pontos:'
READ(*,*) N
C
C Volume do paralelipipedo
C
V=3.*4.*2.
C
C Inicialização dos acumuladores
C
ERO=0.
ERO2=0.
EX=0.
EX2=0.
EY=0.
EY2=0.
EZ=0.
EZ2=0.
C
DO I=1,N
CALL RANDOM(AL)
X=1.+3*AL
CALL RANDOM(AL)
Y=3.+4*AL
CALL RANDOM(AL)

51
Balanço térmico de um painel solar 52
Z=-1.+2*AL
IF((Z*Z+(SQRT(X*X+Y*Y)-3.)**2).LE.1.) THEN
ERO=ERO+RO
ERO2=ERO2+RO*RO
EX=EX+RO*X
EX2=EX2+(RO*X)**2
EY=EY+RO*Y
EY2=EY2+(RO*Y)**2
EZ=EZ+RO*Z
EZ2=EZ2+(RO*Z)**2
ENDIF
IF(MOD(I,1000).EQ.0) WRITE(*,'(''+'',I10)') I
ENDDO
C
C Calculo do valor esperado e do erro
C
ERO=ERO/FLOAT(N)
ERO2=ERO2/FLOAT(N)
RMAS=V*ERO
DELMAS=V*SQRT((ERO2-ERO**2)/N)
EX=EX/FLOAT(N)
EX2=EX2/FLOAT(N)
RX=V*EX
DELX=V*SQRT((EX2-EX**2)/N)
EY=EY/FLOAT(N)
EY2=EY2/FLOAT(N)
RY=V*EY
DELY=V*SQRT((EY2-EY**2)/N)
EZ=EZ/FLOAT(N)
EZ2=EZ2/FLOAT(N)
RZ=V*EZ
DELZ=V*SQRT((EZ2-EZ**2)/N)
C
WRITE(*,'(1X,T1,''Massa='',E14.7,'' Erro='',E14.7)') RMAS,DELMAS
WRITE(*,1000)
WRITE(*,1001) 'X',RX,DELX
WRITE(*,1001) 'Y',RY,DELY
WRITE(*,1001) 'Y',RZ,DELZ
STOP
1000 FORMAT(1X,'Centro de Massa:')
1001 FORMAT(1X,A1,'=',E14.7,3X,' Erro=',E14.7)
END

7.4.3.1 Notas
a) A rotina de geração de números aleatórios não é standard do Fortran, podendo ter sintaxe
diferente em diferentes compiladores. Existem, no entanto, diversas rotinas na literatura,
fáceis de implementar.

52
Balanço térmico de um painel solar 53
b) Note a utilização da função MOD para fazer uma saída regular no terminal, que será útil
se o número N for muito grande, para fornecer uma indicação do tempo que falta para
terminar o cálculo.
c) Note a necessidade de utilizar '' em vez de ' nalguns formatos.
d) Este exemplo foi retirado do livro "Numerical Recipes, the art of scientific computing"
(Press et al).

7.5 Trabalho proposto


a) Desenvolva os programas propostos e teste-os por comparação com integrais conhecidos;
b) Teste o programa MONTCAR com diferentes valores de N e de ISEED;
c) Desenvolva uma rotina para calcular um integral pelo método do trapézio para números
de intervalo iguais a 1,2,4,...,2N, recursivamente, utilizando para cada valor de N os
resultados obtidos para N-1 (metade dos intervalos).

7.6 Sumário de conceitos introduzidos


a) Geração de números aleatórios
b) Cálculo de somatórios e de médias
c) Dupla precisão
d) Ciclos com passo diferente de 1
e) Diferentes formatos de escrita

53
Balanço térmico de um painel solar 54

8 SOLUÇÃO DE SISTEMAS DE EQUAÇÕES LINEARES


8.1 Identificação do problema e formulação matemática
Muitos problemas em Física passam pela solução de sistemas de equações algébricas lineares.
Formalmente, esses problemas consistem na determinação do conjunto de N variáveis
( x1 , x 2 ,..., x N ) , dados { ai j , b j ; i = 1, M ; j = 1, N} e as relações:

a11 x1 + a12 x 2 + ...+ a1N x N = b1


a 21 x1 + a 22 x 2 + ... + a 2N x N = b 2
(8-1)
...
a M1 x1 + a M2 x 2 + ... + a MN x N = b N

O problema pode também ser escrito de forma condensada, usando notação matricial:
r r
Ax=b
r r (8-2)
A ≡ {a i j} ; b = {bi} ; x = {x j} (i = 1, M , j = 1, N )

Vamos considerar unicamente o caso em que M=N. Os outros dois casos (casos com mais ou
menos equações do que incógnitas), que estão também associados a importantes problemas de
Física, são demasiado especializados para o âmbito deste curso.
Se M=N (a partir deste ponto referir-se-á unicamente N como a dimensão do sistema de
equações) e as equações forem linearmente independentes, o sistema tem solução. Caso
contrário, diz-se que a matriz dos coeficientes A é singular (nesse caso, tem determinante nulo).
Em sistemas quase-singulares, ou quando N é muito grande, o erro de arredondamento pode
dificultar a obtenção da solução.

8.2 Métodos numéricos


Existem basicamente duas famílias de métodos de solução de sistemas de equações lineares:
métodos directos e iterativos. Neste curso vamos considerar unicamente métodos directos, que
são geralmente os mais apropriados para sistemas de dimensão "manejável". Tanto os métodos
directos como os métodos iterativos podem ser desenvolvidos de modo a tirarem partido de casos
em que a matriz dos coeficientes é esparsa, isto é tem grande número de termos nulos, com uma
disposição organizada. O caso mais típico de uma matriz esparsa é constituído pela matriz
tridiagonal em que todos os elementos são nulos excepto os da diagonal principal e das duas
subdiagonais adjacente.
Os métodos de solução de sistemas de equações lineares baseiam-se na imposição de uma
sequência de transformações
r
equivalentes da matriz dos coeficientes ( A )e do vector dos termos
independentes ( b ). Cada transformação equivalente, por definição, prodece a modificações
daqueles termos sem alterar a solução do sistema. As transformações básicas são:
a) Multiplicação de equação por uma constante;

54
Balanço térmico de um painel solar 55
b) Substituição de uma equação pelo resultado de uma combinaçao linear dessa equação
com outra (adição de uma equação com o produto de outra por uma constante);
c) Troca de duas equações.
Notar que as modificações de uma equação implicam alterações em todos os seus termos (na
matriz e no vector independente).

8.2.1 Eliminação de Gauss


O método da eliminação de Gauss baseia-se no seguinte facto: se o sistema de equações for
transformado (por uma sequência de transformações equivalentes) num sistema tridiagonal
superior, isto é um sistema da forma:

⎡u11 u12 ... u1N ⎤ ⎡ x1 ⎤ ⎡ c1 ⎤


⎢0 u ... u 2 N ⎥⎥ ⎢⎢ x2 ⎥⎥ ⎢⎢ c2 ⎥⎥
⎢ 22
= (8-3)
⎢ ... ... ⎥ ⎢ ... ⎥ ⎢ ... ⎥
⎢ ⎥⎢ ⎥ ⎢ ⎥
⎣0 0 ... u NN ⎦ ⎣ x N ⎦ ⎣c N ⎦

A solução pode ser obtida muito facilmente começando na última equação e substituindo para
trás ("backsubstitution"). O método da eliminação de Gauss consiste pois na construção de um
conjunto de transformações que permitam a eliminação progressiva dos termos da matriz dos
coeficientes que se encontram abaixo da diagonal principal.
Para uma boa compreensão do método recomenda-se o estudo dos exemplos simples
apresentados na bibliografia e uma consulta sobre o desenvolvimento do algoritmo. Em geral,
para k = 1,..., N - 1 ,usa-se a equação k para eliminar o termo em xk das equações
j = k + 1,..., N . Para o efeito multiplica-se a equação k for -a jk / a kk e soma-se à equação j . É
evidente, no entanto, que se akk = 0 o processo não funciona. A situação anterior não implica
necessariamente que a matriz seja singular, podendo acontecer que existam outras equações
ainda disponíveis que possam ser utilizadas nessa fase da eliminação. O problema consiste,
portanto, em, em cada passo, escolher para eliminar a variável x k , não a equação k , mas
qualquer outra das equações ainda disponíveis ( i ) para a qual a jk / aik ≠ 0 . A essa equação
chama-se equação pivot. O algoritmo da eliminação de Gauss deve pois, no caso geral, incluir
uma escolha de pivot. Em certos casos há garantia de que a situação a k k = 0 nunca ocorre e a
estratégia de pivot é desnecessária.
A utilização de estratégia de pivot é equivalente à realização da transformação equivalente de
troca entre duas equações no sistema. No entanto, para evitar os custos computacionais de
proceder a essa troca, que envolve em cada caso a 3( N + 1) movimentações de coeficientes,
utiliza-se um sistema de indexação indirecta que mantém um registo das equações já utilizadas e
das falta utilizar.

8.3 Algoritmo
Com: Algoritmo de Eliminação de Gauss. Resolve o sistema ai k x k = bi .
Com: Definir variáveis

55
Balanço térmico de um painel solar 56

Reais a(n,n),b(n),x(n)
Inteiro p(n)
PARA i = 1 ATE n
p( i )ri
PARA k = 1 ATE n1
ESCOLHER m ≥ k : a[p(m), k] _ 0
TROCAR p(k) COM p(m)
PARA i = k + 1 ATE n
a[p(i), k]
er
a[p(k), k]
a[p(i), k] r e
PARA j = k + 1 ATE n
a[p(i), j] r a[p(i), j] ea[p(k), j]
b[p(i)] r b[p(i)] eb[p(k)]
PARA k = n ATE 1 PASSO 1
n
b[ p (k)] ∑ a[
j= k +1
p(k), j ] x( j )
x( k ) r
a[ p(k), k]
FIM

8.4 Programa Fortran

8.4.1 Eliminação de Gauss sem estratégia de Pivot

PROGRAM SISTEMA
C
C Este programa utiliza o metodo da eliminacao de Gauss sem
C estrategia de pivot para
C resolver um sistema de N equacoes lineares com N incognitas,
C da forma A(i,j)X(j)=B(i)
C
PARAMETER(NMAX=100)
REAL A(NMAX,NMAX),B(NMAX),X(NMAX)
REAL AA(NMAX,NMAX),BB(NMAX),ERR
CHARACTER*30 FNAME
INTEGER I,J,N,NMAX,IERR
C
C Leitura dos coeficientes da problema (A e B) a partir de
C um ficheiro
C

56
Balanço térmico de um painel solar 57
WRITE(*,*) ' Ficheiro de Entrada'
READ(*,'(A)') FNAME
OPEN(10,FILE=FNAME,STATUS='OLD')
C
READ(10,*) N
IF(N.GT.NMAX) THEN
WRITE(*,*) 'ERRO FATAL: N>NMAX'
STOP
ENDIF
C
C Leitura de dados
C Notar que se faz uma copia dos coeficientes para a matriz AA
C e vector BB a fim de testar a solucao
C
DO I=1,N
READ(10,*) (A(I,J),J=1,N),B(I)
DO J=1,N
AA(I,J)=A(I,J)
ENDDO
BB(I)=B(I)
ENDDO
C
C Solucao do sistema
C
CALL GAUSS(NMAX,N,A,B,X,IERR)
C
C Escrita dos resultados
C
IF(IERR.EQ.1) THEN
WRITE(*,*) 'ERRO: IERR=1'
STOP
ENDIF
C
C Verificação do resultado e escrita
C
WRITE(*,'('' I'',T5,''X'',T22,''ERRO(B)'',T40,''B'')')
DO I=1,N
ERR=BB(I)
DO J=1,N
ERR=ERR-AA(I,J)*X(J)
ENDDO
WRITE(*,'(I3,T5,E14.7,T22,E14.7,T40,E14.7)') I,X(I),ERR,BB(I)
ENDDO
STOP
END
C
C

57
Balanço térmico de um painel solar 58
C
SUBROUTINE GAUSS(NMAX,N,A,B,X,IERR)
C
C Algoritmo da eliminacao de Gauss sem pivot
C
REAL A(NMAX,NMAX),B(NMAX),X(NMAX),E,SUM
INTEGER I,J,K,N,NMAX,IERR
C
C Eliminacao
C
DO K=1,N-1
C
C Eliminacao do coeficiente k
C
IF(A(K,K).EQ.0.) THEN
IERR=1
RETURN
ENDIF

DO I=K+1,N
E=A(I,K)/A(K,K)
DO J=K+1,N
A(I,J)=A(I,J)-E*A(K,J)
ENDDO
B(I)=B(I)-E*B(K)
ENDDO
ENDDO
C
C Substituicao
C
DO K=N,1,-1
SUM=0.
DO J=K+1,N
SUM=SUM+A(K,J)*X(J)
ENDDO
X(K)=(B(K)-SUM)/A(K,K)
ENDDO
C
IERR=0
C
RETURN
END

58
Balanço térmico de um painel solar 59

8.4.2 Eliminação de Gauss com estratégia de Pivot


PROGRAM SISTEMP
C
C Este programa utiliza o metodo da eliminacao de Gauss com
C estrategia de pivot para
C resolver um sistema de N equacoes lineares com N incognitas,
C da forma A(i,j)X(j)=B(i)
C P e o vector de ponteiros para o "pivoting"
C
INTEGER NMAX,N,I,J,IERR
PARAMETER(NMAX=100)
REAL A(NMAX,NMAX),B(NMAX),X(NMAX),ANOR(NMAX)
INTEGER P(NMAX)
CHARACTER*30 FNAME
C
C Leitura dos coeficientes da problema (A e B) a partir de
C um ficheiro
C
WRITE(*,*) 'Ficheiro de dados de entrada ?'
READ(*,'(A)') FNAME
OPEN(10,FILE=FNAME,STATUS='OLD')
C
READ(10,*) N
WRITE(*,*) 'N=',N

IF(N.GT.NMAX) THEN
WRITE(*,*) 'ERRO FATAL: N>NMAX'
STOP
ENDIF
C
DO I=1,N
READ(10,*) (A(I,J),J=1,N),B(I)
ENDDO
C
C Solucao do sistema
C
CALL GAUSSP(NMAX,N,A,B,X,P,ANOR,IERR)
C
C Escrita dos resultados
C
IF(IERR.EQ.1) THEN
WRITE(*,*) 'ERRO FATAL A(KK)=0.'
STOP
ENDIF
C
WRITE(*,'('' I'',T5,''X'')')

59
Balanço térmico de um painel solar 60
DO I=1,N
WRITE(*,'(I3,T5,E14.7)') I,X(I)
ENDDO
STOP
END
C
C
C
SUBROUTINE GAUSSP(NMAX,N,A,B,X,P,ANOR,IERR)
C
C Algoritmo da eliminacao de Gauss com pivot
C
REAL A(NMAX,NMAX),B(NMAX),X(NMAX),ANOR(NMAX)
INTEGER P(NMAX)
C
C Inicializacao do vector pivot
C
WRITE(*,*) 'N=',N
DO I=1,N
P(I)=I
ENDDO
C
C Calculo da norma de cada linha
C
DO I=1,N
ANOR(I)=0.
DO J=1,N
ANOR(I)=MAX(ANOR(I),ABS(A(I,J)))
ENDDO
IF(ANOR(I).EQ.0.) THEN
IERR=1
WRITE(*,*) 'ERRO FATAL: MATRIZ SINGULAR'
RETURN
ENDIF
ENDDO
C
C Eliminacao
C
DO K=1,N-1
C
C Escolha da equacao pivot
C
KP=P(K)
M=K
COLMAX=ABS(A(KP,K))/ANOR(KP)
DO KK=K+1,N
KKP=P(KK)

60
Balanço térmico de um painel solar 61
COLKK=ABS(A(KKP,K))/ANOR(KKP)
IF(COLMAX.LT.COLKK) THEN
COLMAX=COLKK
M=KK
ENDIF
ENDDO
IF(M.NE.K) THEN
ITEMP=P(K)
P(K)=P(M)
P(M)=ITEMP
ENDIF
C
C Eliminacao do coeficiente k
C
DO I=K+1,N
E=A(P(I),K)/A(P(K),K)
C A(P(I),K)=E
DO J=K+1,N
A(P(I),J)=A(P(I),J)-E*A(P(K),J)
ENDDO
B(P(I))=B(P(I))-E*B(P(K))
ENDDO
ENDDO
C
C Substituicao
C
DO K=N,1,-1
SUM=0.
DO J=K+1,N
SUM=SUM+A(P(K),J)*X(J)
ENDDO
X(K)=(B(P(K))-SUM)/A(P(K),K)
ENDDO
C
IERR=0
C
WRITE(*,*) 'N=',N
RETURN
END

8.4.3 Notas
a) Na escolha da equação pivot utilizou-se um critério ligeiramente mais complicado que o
referido anteriormente no texto, para diminuir problemas associados a erros de
arredondamento. Ver bibliografia.
b) Notar a utilização da variável IERR para a sinalização do erro fatal correspondente à
utilização de uma matriz de coeficientes singular.

61
Balanço térmico de um painel solar 62
c) A passagem do parâmetro NMAX juntamente com N para a subrotina é indispensável
para uma definição consistente da dimensão ajustável das diferentes tabelas (arrays).
d) Notar a utilização de indexação indirecta na referência ao primeiro índice da matriz A.
e) Os valores abaixo da diagonal principal de A não são realmente postos a zero neste
programa. Isso não é necessário porque o algoritmo de substituição não os utiliza.

8.5 Sugestões de trabalho


a) Teste os programas apresentado com sistemas de solução conhecida. Considere os 5 sistemas
de equações (todos com solução x1=x2=x3=1):

⎡0.0001 1000 1000 ⎤ ⎡ x1⎤ ⎡2000.0001⎤


⎢ ⎥⎢ ⎥ ⎢ ⎥
⎢ 4 1 1⎥ ⎢ x 2 ⎥ = ⎢ 6⎥
⎢ ⎢ ⎥
⎣ 2 3 1⎥⎦ ⎣⎢ x3⎦⎥ ⎢⎣ 6 ⎥⎦

⎡0.01 1000 1000 ⎤ ⎡ x1⎤ ⎡2000.01⎤


⎢ ⎥⎢ ⎥ ⎢ ⎥
⎢ 4 1 1⎥ ⎢ x 2 ⎥ = ⎢ 6⎥
⎢ 2 ⎢ ⎥
⎣ 3 1⎥⎦ ⎢⎣ x 3⎥⎦ ⎢⎣ 6 ⎥⎦

⎡ 1 1000 1000 ⎤ ⎡ x1⎤ ⎡2001⎤


⎢ ⎥⎢ ⎥ ⎢ ⎥
⎢4 1 1⎥ ⎢ x 2 ⎥ = ⎢ 6 ⎥
⎢2 ⎢ ⎥
⎣ 3 1⎥⎦ ⎢⎣ x3⎥⎦ ⎢⎣ 6 ⎥⎦

⎡1000 1000 1000 ⎤ ⎡ x1⎤ ⎡3000 ⎤


⎢ ⎥⎢ ⎥ ⎢ ⎥
⎢ 4 1 1⎥ ⎢ x 2 ⎥ = ⎢ 6 ⎥
⎢ 2 ⎢ ⎥
⎣ 3 1⎥⎦ ⎢⎣ x 3⎥⎦ ⎢⎣ 6 ⎥⎦

⎡4 1 2 ⎤ ⎡ x1⎤ ⎡7 ⎤
⎢ ⎥⎢ ⎥ ⎢ ⎥
⎢4 1 1⎥ ⎢ x 2 ⎥ = ⎢6 ⎥
⎢ ⎥⎢ ⎥ ⎢ ⎥
⎣2 3 1⎦ ⎢⎣ x 3⎥⎦ ⎣6 ⎦

b) Inclua no fim do programa SISTEMP um teste da solução encontrada, mediante o cálculo


r
directo do produto da rmatriz dos coeficientes A pelo vector solução x e comparação do r
resultado com o vector b . Atenção: isso implica guardar cópias dos valores originais de A e b ,
uma vez que eles são modificados na subrotina GAUSS. Uma vez concluída a modificação b) (e
testada!), pode utilizar o programa em testes com qualquer input.
c) Verifique o comportamento do programa com sistemas singulares e quase singulares.

8.6 Conceitos introduzidos


a) Utilização de matrizes;
b) Passagem de matrizes para subrotinas, dimensões ajustáveis;

62
Balanço térmico de um painel solar 63
c) Indexação indirecta;
d) Controle de erros em subrotinas;
e) Escrita formatada.

63
Balanço térmico de um painel solar 64

9 SOLUÇÃO DE PROBLEMAS DE FÍSICA PELO MÉTODO


DA RELAXAÇÃO
9.1 Identificação do Problema e Formulação Matemática

9.1.1 Equação de Poisson do potencial de uma distribuição contínua de


carga
Recorda-se da Electrostática que o potencial gerado por uma distribuição contínua de carga
eléctrica numa placa satisfaz à equação:

∂2V ∂2V ρ
+ =- (9-1)
∂ x2 ∂ y2 ε0

em que V é o potencial eléctrico, ρ(x,y) a densidade volúmica de carga e ε0 a permitividade


eléctrica do meio.
A equação anterior é uma Equação de Poisson. A solução da equação de Poisson é o que
geralmente se designa como um problema de condições fronteira, na medida em que a solução é
completamente determinada pelas condições impostas na fronteira do domínio do problema. A
equação de Poisson surge em muitos outros problemas de Física, em particular na determinação
do potencial eléctrico (ou gravítico) na presença de uma distribuição de cargas (ou de massas)
geradoras e em problemas de Mecânica de Fluidos.
Recorda-se que nos problemas considerados no âmbito da apresentação do método de Euler a
solução dependia essencialmente das condições iniciais (valor da função ou da função e suas
derivadas no instante inicial).

9.1.2 Equação de Laplace aplicada ao equilíbrio térmico de uma placa


Na ausência de fontes ou sumidouros de calor, a condução de calor num corpo satisfaz a
equação:

∂T ⎡ ∂2 T ∂2 T ∂2 T ⎤
=κ2 ⎢ 2 + + ⎥ (9-2)
∂t ⎢⎣ ∂ x ∂ y 2 ∂ z 2 ⎥⎦

Se a temperatura na fronteira do corpo for imposta e se esperar tempo suficiente a distribuição de


temperatura no seu interior pode obter-se resolvendo a equação anterior com o primeiro membro
igual a zero. A equação designa-se então por equação de Laplace. Se o corpo em estudo tiver
uma geometria bidimensional (caso de uma placa fina) a equação de Laplace escreve-se
simplesmente:

∂2 T ∂2 T
+ =0 (9-3)
∂ x2 ∂ y 2

É claro que a Equação de Laplace é um caso particular da Equação de Poisson (com ρ=0), pelo
que se vai considerar unicamente o caso mais geral para o desenvolvimento de um algoritmo. A

64
Balanço térmico de um painel solar 65
equação de Laplace surge em muitos outros problemas de Física, em particular na determinação
do potencial eléctrico (ou gravítico) numa zona do espaço exterior às cargas (ou às massas)
geradoras e em problemas de Mecânica de Fluidos.

9.1.3 Formulação geral


Vai-se então considerar a solução da equação:

∂2φ ∂2φ
+ = f (x, y) (9-4)
∂ x2 ∂ y2

dadas condições fronteira, por exemplo, na forma:


φ (0 , y) = φ 1 ( y)
φ ( L x , y) = φ 2 ( y)
(9-5)
φ (x , 0) = φ 3 (x)
φ (x , L y ) = φ 4 ( x)

Valores concretos para as condições fronteira e para o termo independente (f) serão considerados
antes da apresentação dos programas.

9.2 Métodos numéricos (Relaxação)


Contrariamente ao caso dos problemas de valores iniciais considerados num capítulo anterior
(em que se apresentou o método de Euler), não é possível obter a solução da equação de Poisson
partindo do valor da solução num ponto da fronteira e calculando a solução ponto a ponto,
localmente. Para satisfazer as condições fronteira em todos os pontos limite é necessário obter a
solução para os pontos interiores de forma global.
Existem vários métodos numéricos (iterativos e directos) de solução da Equação de Poisson. No
âmbito deste curso vai-se considerar unicamente um método iterativo, chamado método da
Relaxação (sobrerrelaxação simultânea) que tem a vantagem de ser muito simples e convergir
sempre, sendo no entanto relativamente lento. Para problemas em que o tempo seja um factor
determinante devem ser considerados métodos directos.
O método da relaxação baseia-se (tal como a generalidade dos outros métodos) na representação
das derivadas parciais presentes na equação (4) por diferenças finitas centradas (numa
aproximação de segunda ordem):

∂ 2 φ φ i -1, j - 2 φ i, j + φ i+1, j
_
∂ x2 ∆x 2
(9-6)
∂ φ φ i, j -1 2 φ i, j + φ i, j+1
2
_
∂ y2 ∆y 2

com:

65
Balanço térmico de um painel solar 66
φ i , j = φ ( xi , y j )
xi = i ∆x ; i = 0,..., M (9-7)
y j = j ∆y ; j = 0,..., N

A dedução das relações anteriores é muito simples e baseia-se no desenvolvimento da função


considerada em série de Taylor. Assim, na vizinhança do ponto x tem-se:

∂φ ∂ φ
2
∂ φ
3
φ (x ± ∆t) = φ (x) ± ∆x + 2 ∆x 2 ± 3 ∆x 3 + ... (9-8)
∂x ∂x ∂x

somando as duas equações (8) e resolvendo para a segunda derivada obtém-se:

∂ 2 φ φ i -1, j - 2 φ i, j + φ i+1, j ∂ 4 φ
= - 4 ∆x 2 - ... (9-9)
∂ x2 ∆x 2 ∂x

pelo que as aproximações (6) consistem em desprezar termos de segunda ordem (em ∆x2) e
superiores.
Para simplificar, vai considerar-se o caso ∆x=∆y=∆. Fazendo a substituição na equação (4)
obtém-se um sistema de (M-1)×(N-1) equações:
φ i -1 , j + φ i+1 , j + φ i , j -1 + φ i , j+1 - 4 φ i , j - ∆ 2 f i , j = 0 i = 1,..., M - 1 ; j = 1,...N - 1 (9-10)

Note-se que o sistema (10) se refere unicamente aos pontos interiores, devendo a solução na
fronteira ser imposta.
O sistema (10) é um sistema de equações lineares mas que envolve em geral um número muito
grande de equações pelo que a sua solução directa apresenta algumas dificuldades. O método da
relaxação consiste na solução iterativa desse sistema de equações. Tal como em outros métodos
iterativos é necessário escolher uma primeira aproximação, para a qual se escolhe normalmente
um valor constante. Como o método converge sempre, a escolha da solução "inicial" só interfere
no número de iterações necessário. Assim, na iteração n pode escrever-se:

φ i1n , j + φ in+1 , j + φ in, j -1 + φ in, j+1 - 4 φ in, j - ∆ 2 f i , j = Ri , j (9-11)

em que Ri , j , definido por (9), é uma medida do erro em cada ponto (resíduo) após a última
iteração. O objectivo da iteração é, naturalmente fazer tender o resíduo para zero. Um método de
reduzir o erro é calcular um novo valor no ponto (i,j) que garanta o anulamento do resíduo
correspondente, isto é:
Ri , j
φ in+, j1 = φ in, j + (9-12)
4

Deve notar-se no entanto que quando se anula o resíduo num ponto, vai-se perturbar
necessariamente a solução em pontos adjacentes. Mas há convergência.
Há duas pequenas modificações que podem melhorar o método, acelerando a convergência. A
primeira consiste em utilizar para o cálculo dos resíduos os valores da função à medida que vão

66
Balanço térmico de um painel solar 67
sendo conhecidos. Neste caso, alguns dos termos do primeiro membro da equação (11)
pertencem à iteração n+1 enquanto outros ainda pertencem à iteração n. Ao método da relaxação
modificado desta maneira chama-se relaxação simultânea. Em termos de programação a
relaxação simultânea é ainda mais simples do que a relaxação sucessiva porque não é necessário
guardar os valores da função em várias iterações.
A segunda modificação, designada por sobrerrelaxação, consiste em introduzir um peso no
cálculo da correcção (12). Nesse caso escreve-se:

Ri , j
φ in+, j1 = φ in, j + α
4 (9-13)
1≤ α ≤ 2

A justificação da vantagem da sobrerrelaxação não é trivial, mas pode ser facilmente verificada
nos programas apresentados posteriormente. No caso da Equação de Poisson o valor óptimo do
parâmetro de sobrerrelaxação é dado por:
1/2
⎛ 1 1 ⎞
α opt = 2 - π 2 ⎜ 2+ 2⎟ (9-14)
⎝M N ⎠

para uma rede de M por N pontos.


Recomenda-se a consulta da bibliografia para mais informação.

9.3 Algoritmo
Trabalho proposto

9.4 Programas FORTRAN

9.4.1 Potencial de uma distribuição bidimensional contínua de cargas


(Equação de Poisson)
O exemplo apresentado corresponde ao caso limite em que a distribuição é pontual, sendo, no
entanto, tratada como contínua. A utilização do programa para outras distribuições é trivial,
sendo unicamente necessário recalcular o termo independente da equação de Poisson (a
densidade de carga).
No programa seguinte consideram-se duas cargas pontuais nos pontos (XQ1,YQ1) e (XQ2,YQ2).
O número de pontos da rede depende do espaçamento escolhido (∆x=∆y). As cargas têm,
respectivamente 10-9 e -10-9 Coulomb. Do ponto de vista do programa elas são tratadas como
distribuições contínuas, centradas naqueles pontos e com densidade igual a razão entre a carga
respectiva e a área de um rectângulo elementar da rede ("grid box"). Impõe-se a condição de
potencial constante (V=0) na fronteira.
É de esperar, naturalmente, que a solução seja bastante diferente da solução analítica para uma
distribuição de cargas pontuais, no interior do rectângulo elementar onde está localizada a carga
e na sua vizinhança imediata. Se se aumentar o número de pontos da rede a solução converge.

67
Balanço térmico de um painel solar 68

PROGRAM RELAXP
C
C SOLUCAO DE EQUACAO DE POISSON PELO METODO DA RELAXACAO
C SOBRERRELAXACAO SIMULTANEA
C
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
REAL*8 LX,LY
PARAMETER(NMAX=100)
PARAMETER(RESMAX=1.E-5,ITMAX=100)
PARAMETER(V0=0.)
PARAMETER(LX=1.,LY=1.)
PARAMETER(Q1= 1.E-9,XQ1=LX/3. ,YQ1=LY/2.)
PARAMETER(Q2=-1.E-9,XQ2=2.*LX/3.,YQ2=LY/2.)
PARAMETER(EPS0=8.8544E-12)
C
DIMENSION V(0:NMAX,0:NMAX),F(0:NMAX,0:NMAX)
CHARACTER*30 FNAME
C
PI=4.D0*DATAN(1.D0)
C
WRITE(*,*) 'Solucao da equacao de Poisson Lap V=F'
WRITE(*,*) 'num rectangulo 0<x<',LX,' 0<y<',LY
WRITE(*,'(1X,A,\)') 'DX=DY='
READ(*,*) D

M=LX/D
N=LY/D
DD=D*D

IF(MAX(N,M).GT.NMAX) THEN
WRITE(*,*) 'ERRO FATAL: N,M>NMAX'
STOP
ENDIF

ALFA=2.-PI*SQRT(2.)*SQRT(1./(FLOAT(M)**2)+1./(FLOAT(N)**2))
WRITE(*,*) 'Sobre-relaxacao Valor optimo=',ALFA
WRITE(*,'(1X,A5\)') 'ALFA='
READ(*,*) ALFA
C
WRITE(*,*) 'Ficheiro para escrita dos resultados'
READ(*,'(A30)') FNAME
OPEN(10,FILE=FNAME)
C
C Condicoes fronteira
C
DO I=0,M

68
Balanço térmico de um painel solar 69
V(I,0)=V0
V(I,N)=V0
ENDDO
C
DO J=0,M
V(0,J)=V0
V(M,J)=V0
ENDDO
C
C Condicoes "iniciais" no interior ("First guess")
C
DO I=1,M-1
DO J=1,N-1
V(I,J)=V0
ENDDO
ENDDO

69
Introdução aos Computadores (2º Semestre)

C
C FONTES: Cargas/eps
C
DO I=0,M
DO J=0,N
F(I,J)=0.
ENDDO
ENDDO

IQ1=XQ1/D
JQ1=YQ1/D
IQ2=XQ2/D
JQ2=YQ2/D

F(IQ1,JQ1)=-Q1/(EPS0*DD)
F(IQ2,JQ2)=-Q2/(EPS0*DD)
C
C Relaxacao
C
IT=0
RESIT=1.E20
C
DO WHILE(RESIT.GT.RESMAX .AND. IT.LE.ITMAX)

IT=IT+1
RESIT=0.
VMAX=0.

DO I=1,M-1
DO J=1,N-1
RIJ=V(I-1,J)+V(I+1,J)+V(I,J-1)+V(I,J+1)-4.*V(I,J)
: -DD*F(I,J)
V(I,J)=V(I,J)+0.25*ALFA*RIJ
RESIT=MAX(RESIT,ABS(RIJ))
VMAX=MAX(VMAX,ABS(V(I,J)))
ENDDO
ENDDO
C
RESIT=RESIT/VMAX
WRITE(*,*) IT,RESIT
ENDDO
C
IF(RESIT.GT.RESMAX) THEN
WRITE(*,*) 'Criterio de convergencia nao foi atingido'
ENDIF
C
WRITE(10,*) M+1,N+1

DO J=0,N

70
Introdução aos Computadores (2º Semestre)

WRITE(10,'(10E14.6)') (V(I,J),I=0,M)
ENDDO

STOP
END

9.4.2 Distribuição de Temperatura numa placa em regime estacionário


(Equação de Laplace)
Vai considerar-se a situação em que a temperatura na fronteira da placa é constante (T0) em três das
arestas (x=0,Lx e y=0) e tem uma distribuição sinusoidal (meia onda) na quarta aresta (y=Ly). A
imposição de condições fronteira diferentes é trivial e sugere-se que se tentem diversos exemplos.
No exemplo apresentado na alínea 5 utiliza-se a condição fronteira:

C
C Condicoes fronteira
C
DO I=0,M
T(I,0)=T0
T(I,N)=T0+TM*SIN(I*PI/M)
ENDDO
C
DO J=0,M
T(0,J)=T0
T(M,J)=T0
ENDDO

9.4.3 Comentários
a) O critério de convergência é baseado no erro relativo com um controle simultâneo do número
máximo de iterações, para evitar situações de repetição infinita da iteração;
b) Na escrita dos valores da Temperatura de equilíbrio poderia utilizar-se, por exemplo um formato
F6.1 dado se conhecer à priori o alcance dos valores dessa distribuição (entre T0 e T0+TM). No outro
programa utiliza-se, em vez disso, um formato E14.6 que é mais dispendioso mas oferece a garantia de
poder representar um número de qualquer grandeza com 6 algarismos significativos.
c) Notar a utilização de índices nulos nas matrizes;
d) Ao parâmetro de sobrerrelaxação é atribuído "por defeito" o valor óptimo. Se esse valor for o
escolhido pode responder-se à pergunta correspondente com "/" ou "," seguidos de um "ENTER". Esta
é uma facilidade standard do sistema de leitura com "formato *" ("list directed input").

9.5 Algumas soluções


Nas figuras seguintes apresentam-se graficamente soluções obtidas com os programas anteriores. Em
cada caso calcularam-se isolinhas, isto é, linhas de igual valor da solução (Temperatura ou Potencial

71
Introdução aos Computadores (2º Semestre)

Eléctrico) igualmente espaçadas. Note-se, no entanto, que nas Figura 3 e 4 não se desenhou a isolinha
correspondente a V=0 (segmento de recta x=Lx/2 e fronteira), dado ela apresentar uma bifurcação.

Fig. 9.1 – Exemplos de solução

9.6 Trabalho proposto


a) Teste os programas;
b) Verifique a diferença de comportamento do método para diferentes valores do parâmetro de
sobrerrelaxação;
c) Experimente modificar as condições fronteira;
d) Compare os resultados do potencial das duas cargas "pontuais" com resultados analíticos;
e) Tente outras distribuições de carga "pontuais" e contínuas.

9.7 Sumário dos conceitos introduzidos


Métodos numéricos
a) Método da Relaxação

72
Introdução aos Computadores (2º Semestre)

b) ou Solução iterativa de sistemas de equações


Programação
c) Matrizes com índice inferior diferente de 1;
d) Escolha de formatos com atenção ao seu alcance;
e) Valores por defeito de variáveis.

73
Introdução aos Computadores (2º Semestre)

BIBLIOGRAFIA
As normas da linguagem Fortran encontram-se detalhadamente explicadas com muitos exemplos em
diversos livros. A título de exemplo indica-se:
Ellis, T.M.R., "A structured approach to FORTRAN 77 Programming", Addison-Wesley, London,
1982.
Deve, no entanto, notar-se que os programas desenvolvidos neste curso utilizam duas extensões ao
Fortran 77 (implementadas na maioria dos compiladores acessíveis e introduzidas no Fortran 90): a
estrutura {DO WHILE() ... ENDDO} e o ciclo DO na forma {DO i=1,N,J .... ENDDO}. O Fortran 90 é
uma linguagem moderna, extremamente poderosa, que inclui diversas outras extensões de muito maior
impacto na norma do Fortran que, no entanto não serão abordadas. Assim, os programas desenvolvidos
ao longo dos exemplos utilizados no curso farão uso unicamente de um subconjunto da linguagem,
evitando os aspectos mais complexos da sua implementação.
No que se refere aos algoritmos e métodos numéricos utilizados, eles foram introduzidos no curso
essencialmente como exemplos convenientes e úteis de programação. Quer isto dizer que não se
procede a demonstrações formais das suas propriedades, sendo estes apresentados em função da sua
simplicidade em termos de programação e por constituírem exemplos práticos de muita utilidade, em
que a utilização de computadores se revela uma vantagem em face de outras metodologias. Os
exemplos apresentados cobrem, no entanto, aspectos fundamentais de um curso de introdução aos
métodos numéricos. Para uma melhor compreensão desses e doutros algoritmos sugere-se a consulta do
livro:
Press et al, "Numerical Recipes, the art of Scientific Computing", Cambridge University Press,
versão em Fortran, 1986 (1 ed) e 1993 (2 ed). Existem versões do mesmo livro para outras
linguagens de alto nível (Pascal, C e Basic).

74

You might also like