Professional Documents
Culture Documents
INTRODUÇÃO À PROGRAMAÇÃO
com exemplos em Fortran
Pedro M A Miranda
1994,2004
Introdução à Programação
Nota Introdutória
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
4
Introdução à Programação
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.
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).
- 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)
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 .
- b ± b 2 - 4ac
ax + bx + c = 0 _ x =
2
(2-1)
2a
2.4 Algoritmo
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
Comentário: DECLARAÇÕES
Reais: s0,v0,s,g,x1,y1,x2,y2,t
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.
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:
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:
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:
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.
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.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
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).
15
Introdução à Programação
16
Introdução à Programação
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 .
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
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.4 Algoritmo
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.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)
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
22
Balanço térmico de um painel solar 23
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.
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.1 Bissecção
PROGRAM TERMO
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)
CALL BISSEC(A,B,EPS,X)
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.
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
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:
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.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
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.
33
Balanço térmico de um painel solar 34
T = T a + ( T 0 - T a ) e-r t (6-2)
34
Balanço térmico de um painel solar 35
⎧ dv
=- g
⎪⎪ dt
⎨ (6-4)
⎪ dz
=v
⎪⎩ dt
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.
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
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
36
Balanço térmico de um painel solar 37
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
∆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
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
X ← x0
Y ← y0
VX ← vx0
VY ← vy0
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
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.
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
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.
42
Balanço térmico de um painel solar 43
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.
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.
2
z + ( x + y - 3) ≤ 1
2 2
2
(7-3)
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.
xi = x0 + i h (7-6)
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 ⎦
⎡1 1 ⎤
x2
4
∫ f (x) dx _ h ⎢ f 0 + f 1 + f 2 ⎥
⎣3 3 3 ⎦
(7-9)
x0
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
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
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
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)
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.
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).
53
Balanço térmico de um painel solar 54
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.
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).
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
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
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.
⎡4 1 2 ⎤ ⎡ x1⎤ ⎡7 ⎤
⎢ ⎥⎢ ⎥ ⎢ ⎥
⎢4 1 1⎥ ⎢ x 2 ⎥ = ⎢6 ⎥
⎢ ⎥⎢ ⎥ ⎢ ⎥
⎣2 3 1⎦ ⎢⎣ x 3⎥⎦ ⎣6 ⎦
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
∂2V ∂2V ρ
+ =- (9-1)
∂ x2 ∂ y2 ε0
∂T ⎡ ∂2 T ∂2 T ∂2 T ⎤
=κ2 ⎢ 2 + + ⎥ (9-2)
∂t ⎢⎣ ∂ x ∂ y 2 ∂ z 2 ⎥⎦
∂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.
∂2φ ∂2φ
+ = f (x, y) (9-4)
∂ x2 ∂ y2
Valores concretos para as condições fronteira e para o termo independente (f) serão considerados
antes da apresentação dos programas.
∂ 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
∂φ ∂ φ
2
∂ φ
3
φ (x ± ∆t) = φ (x) ± ∆x + 2 ∆x 2 ± 3 ∆x 3 + ... (9-8)
∂x ∂x ∂x
∂ 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:
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 ⎠
9.3 Algoritmo
Trabalho proposto
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
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").
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.
72
Introdução aos Computadores (2º Semestre)
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