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 1.2 1.3
2

Números inteiros.......................................................................................... 5 Números de vírgula flutuante ....................................................................... 6 Erros e estabilidade ..................................................................................... 7 Problema do movimento no campo gravítico uniforme ................................ 9 Formulação matemática .............................................................................. 9 Métodos numéricos:..................................................................................... 9 Algoritmo...................................................................................................... 9 Programa Fortran....................................................................................... 13 Sugestões de trabalho ............................................................................... 15 Conceitos introduzidos............................................................................... 16 Problema.................................................................................................... 17 Formulação matemática ............................................................................ 17 Métodos numéricos.................................................................................... 18 Algoritmo.................................................................................................... 18 Programa Fortran....................................................................................... 19 Sugestões de trabalho ............................................................................... 22 Conceitos introduzidos............................................................................... 22 Equilíbrio térmico de um painel solar ......................................................... 23 Formulação matemática: ........................................................................... 23 Métodos numéricos:................................................................................... 24 Algoritmo.................................................................................................... 25 Programas Fortran..................................................................................... 25 Sugestões de trabalho ............................................................................... 29 Conceitos de programação introduzidos.................................................... 29 Circuito RLC............................................................................................... 30 Aritmética complexa em Fortran ................................................................ 31 Cálculo da corrente no circuito RLC .......................................................... 32 Identificação do Problema e Formulação Matemática ............................... 34 Métodos numéricos (Método de Euler) ...................................................... 35 Algoritmo.................................................................................................... 37 Programas FORTRAN ............................................................................... 39 Algumas soluções...................................................................................... 42 Sumário dos conceitos introduzidos .......................................................... 44 Identificação do Problema e Formulação Matemática ............................... 45 Métodos numéricos.................................................................................... 46 Algoritmo.................................................................................................... 48 Programas Fortran..................................................................................... 49 Trabalho proposto...................................................................................... 53 Sumário de conceitos introduzidos ............................................................ 53
3

PROGRAMAÇÃO ELEMENTAR.................................................................................................... 9

2.1 2.2 2.3 2.4 2.5 2.6 2.7
3

AJUSTAMENTO DE DADOS EXPERIMENTAIS POR REGRESSÃO LINEAR .......................... 17

3.1 3.2 3.3 3.4 3.5 3.6 3.7
4

DETERMINAÇÃO DE RAÍZES DE EQUAÇÕES NÃO LINEARES. ............................................ 23

4.1 4.2 4.3 4.4 4.5 4.6 4.7
5

ARITMÉTICA COMPLEXA........................................................................................................... 30

5.1 5.2 5.3 6.1 6.2 6.3 6.4 6.5 6.6
7

6 SOLUÇÃO DE EQUAÇÕES DIFERENCIAIS ORDINÁRIAS COM CONDIÇÕES FRONTEIRA NUM PONTO ........................................................................................................................................ 34

INTEGRAÇÃO NUMÉRICA.......................................................................................................... 45

7.1 7.2 7.3 7.4 7.5 7.6

Introdução à Programação 8 SOLUÇÃO DE SISTEMAS DE EQUAÇÕES LINEARES ............................................................ 54

8.1 8.2 8.3 8.4 8.5 8.6
9

Identificação do problema e formulação matemática................................. 54 Métodos numéricos.................................................................................... 54 Algoritmo.................................................................................................... 55 Programa Fortran....................................................................................... 56 Sugestões de trabalho ............................................................................... 62 Conceitos introduzidos............................................................................... 62 Identificação do Problema e Formulação Matemática ............................... 64 Métodos numéricos (Relaxação) ............................................................... 65 Algoritmo.................................................................................................... 67 Programas FORTRAN ............................................................................... 67 Algumas soluções...................................................................................... 71 Trabalho proposto...................................................................................... 72 Sumário dos conceitos introduzidos .......................................................... 72

SOLUÇÃO DE PROBLEMAS DE FÍSICA PELO MÉTODO DA RELAXAÇÃO ........................... 64

9.1 9.2 9.3 9.4 9.5 9.6 9.7

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. Dizse 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 dizse 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:
y= - b ± b2 - 4 a c 2a

(1-5)

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
Com 7 algarismos significativos, as raízes são:
y1 = 8855.000 y 2 = 0.0001129305

(1-6)

(1-7)

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 y 2 = 0.00002823264

(1-8)

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:

y=

2c - b ± b2 - 4ac

(1-9)

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 utilizarse 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
Calcular t ∈ ℜ+ : s0 - s + v0 t -

1 2 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:
- b ± b 2 - 4ac 2a

Não são necessários. Vai usar-se a forma resolvente da equação do segundo grau:
ax + bx + c = 0 _ x =
2

(2-1)

2.4

Algoritmo
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.1 Estrutura Geral:

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 (IFTHEN-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 A.EQ.B A.NE.B A.LT.B A.LE.B A.GT.B A.GE.B Significado Testa se A é IGUAL a B Testa se A é DIFERENTE de B Testa se A é MENOR que B Testa se A é MENOR OU IGUAL que B Testa se A é MAIOR que 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:
e2 = 1 N 2 ∑ [y - (a xi + b )] N i=1 i

(3-2)

Impondo a condição de minimização, i.e., resolvendo as duas equações:
∂ ∂ e2 = e2 = 0 ∂a ∂b

( ) ( )

(3-3)

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

(3-4)

17

Introdução à Programação

b=

1 (∑ y i - a ∑ xi ) N

(3-5)

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 função de um acumulador. Assim, para calcular SUM = ∑ f i faz-se:
i =1 N

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 Sx Sy N a← 1 S xx - S 2 x N S xy 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
Comprimento de onda (nm) Frequência (1012Hz)

3.6.1 Teste o Programa com dados inventados, aproximadamente em linha recta. 3.6.2 Calcule o valor de h a partir dos dados da tabela. 3.6.3 Reescreva o programa de modo a introduzir como input o comprimento de onda e o potencial de paragem e a obter como output (formatado) os valores de h e W . 3.6.3 Considere o problema do ajustamento de recta que passa obrigatoriamente pela origem. Isto é da determinação da recta y = ax , que minimiza o erro médio quadrático no ajustamento aos dados { xi , yi } . Deduza a expressão para a e escreva o algoritmo. 3.6.4 Introduza no programa REGRES o cálculo do coeficiente de correlação linear.

VP (V) 1.0 0.99 0.89 0.79 0.68 0.57 0.47 0.37 0.28 0.17 0.07

400 414 429 444 462 480 500 522 545 571 600

749 724 699 674 649 624 599 574 549 524 499

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:

& Qrad = σ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:
& Qconv = α (T − T0 )
−2 −1

(4-3)

em que α é uma constante numérica. Considerar-se-á α = 0.4 Wm K . Nestas condições, a condição de balanço térmico da placa escreve-se: & & E sol − Qrad − Qconv = 0 ⇒ 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-4)

4.2

Formulação matemática:
500 − 5.67 × 10 −8 T 4 − 0.4(T − 273) = 0 (4-5)

Determinar T que satisfaz a equação:

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émse:

xi+1 = xi −

f( xi ) ′ f ( xi )

(4-7)

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 baseiamse 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 C dI V L= L dt

(5-1)

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:
ZR= R ZC = i ωC ZL=i ω L

(5-3)

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
significa:

I = I 0 ei( ωt + φ )

(5-5)

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 ⎤ ⎡ iω t i( ωt +φ ) V 0 e = ⎢ R + iω L ⎥ I0 e ωC ⎦ ⎣

(5-7)

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/2

- 1⎛ ωL

1 ⎞ ⎜ ⎟ ⎝ R RωC ⎠

I0 e

(5-8)

ou seja:

I0=

+ ω C -2 + ω 2 L2 ] ωL ⎤ ⎡ 1 φ = tan -1 ⎢ ⎣ RωC R ⎥ ⎦
2 -2

[R

V0

1/2

(5-9)

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 REAL A,B COMPLEX C,CC C=CMPLX(A,B) CC=CONJG(C) A=CABS(C) A=REAL(C) A=AIMAG(C)

Significado

Converte o par de Reais A,B no complexo C Complexo conjugado de C Módulo do complexo C Parte real do complexo 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 ) dt (6-1)

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 do problema típico de Mecânica: dado um ponto r r r material actuado por uma lei de forças F(t) , inicialmente na posição r 0 e com velocidade v 0 , 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 r r r ascendente v 0 = v0 e z , num campo gravítico uniforme de aceleração - g e 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: d z =- g 2 dt
2

(6-3)

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 dz =v dt

(6-4)

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 GM r d2r =- 3 r 2 dt r

(6-5)

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:
GM d2 x =x 3/2 2 dt 2 ( x + y2 ) GM d2 y = y 2 3/2 2 dt ( x + y2 )

(6-6)

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:
y(a + ∆x) - y(x) dy = ∆x dx (x= a)

(6-7)

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:
y(x + ∆x) = y(x) + dy 1 d2 y 2 1 d3 y 3 ∆x + ∆x + ∆x + ... dx 2! dx 2 3! dx3

(6-8)

Resolvendo para a primeira derivada pode escrever-se:
dy y(x + ∆x) - y(x) = + E( ∆x) dx ∆x

(6-9)

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 xi+1 = xi + vi+1 ∆t

(6-11)

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
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;

Métodos numéricos

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

I=

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

A solução do problema consiste no cálculo do integral:
180

I=

⎞ ⎛ 2 ∫ x f (x) dx ; f (x) = sin ⎜ 180 ⎟ (7-2) ⎠ ⎝ 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 m3 , 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
Neste caso o problema consiste no cálculo do integral triplo:

(7-4)

45

Balanço térmico de um painel solar
V

∫ ∫ ∫ ρ r dV ∫ ∫ ∫ ρ dV
V

r

46

(7-5)

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:
xN x0

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

(7-7)

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

f (x) dx _ S N _ h ∑
i=1

N

x0

f i -1 + f i f ⎤ ⎡f = h ⎢ 0 + f 1 + f 2 + ...+ f N -1 + N ⎥ 2 2 ⎦ ⎣2

(7-8)

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:
x2

x0

4 1 ⎤ ⎡1 f (x) dx _ h ⎢ f 0 + f 1 + f 2 ⎥ 3 3 ⎦ ⎣3

(7-9)

com N+1 pontos obtém-se:
xN

x0

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

(7-10)

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:
∫ f (x, y, z) dV _ V < f > ± V
< f
2

> - < f >2 N

(7-11)

em que:
< f >= 1 N ∑ f ( xi , y i , z i ) N i=1 < f
2

>=

1 N 2 ∑ [ f ( xi , y i , z i ) ] N i=1

(7-12)

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 g( xi ) = ⎨ ⎩ 0 xi ∉ V

(7-13)

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 Toro z 2 + ⎛ x 2 + y 2 3 ⎞ le 1 ⎜ ⎟
⎝ ⎠
2

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
2

Q←Q+f(x,y,z) FIM DE OPÇÕES FIM DE CICLO S←S/N Q←Q/N SMC←S*V ERRO← V
Q - S2 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 ... a M1 x1 + a M2 x 2 + ... + a MN x N = b N

(8-1)

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

(8-2)

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 equivalentes da matriz dos coeficientes ( A )e do vector dos termos r 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 ⎢0 u 22 ⎢ ⎢ ... ⎢ 0 ⎣0 ... u1N ⎤ ⎡ x1 ⎤ ⎡ c1 ⎤ ... u 2 N ⎥ ⎢ x2 ⎥ ⎢ c2 ⎥ ⎥⎢ ⎥ = ⎢ ⎥ ... ⎥ ⎢ ... ⎥ ⎢ ... ⎥ ⎥⎢ ⎥ ⎢ ⎥ ... u NN ⎦ ⎣ x N ⎦ ⎣c N ⎦

(8-3)

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 b[ p (k)] x( k ) r

j= k +1

∑ a[

n

p(k), j ] x( j )

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⎤ ⎥ ⎢ ⎥⎢ ⎥ ⎢ 6⎥ 4 1 1⎥ ⎢ x 2 ⎥ = ⎢ ⎢ ⎢ ⎥ ⎢ 2 3 1⎥ ⎢ x3⎥ ⎢ 6⎥ ⎦ ⎣ ⎦⎣ ⎦ ⎣ ⎡0.01 1000 1000 ⎤ ⎡ x1⎤ ⎡2000.01⎤ ⎢ ⎥⎢ ⎥ ⎢ ⎥ 1 1⎥ ⎢ x 2 ⎥ = ⎢ 6⎥ ⎢ 4 ⎢ ⎥ ⎢ 2 3 1⎥ ⎢ x 3⎥ ⎢ 6⎥ ⎣ ⎦⎣ ⎦ ⎣ ⎦ ⎡ x1⎤ ⎡2001⎤ ⎡ 1 1000 1000 ⎤ ⎥ ⎢ ⎥⎢ ⎥ ⎢ 1 1⎥ ⎢ x 2 ⎥ = ⎢ 6 ⎥ ⎢4 ⎢ ⎥ ⎢2 3 1⎥ ⎢ x3⎥ ⎢ 6 ⎥ ⎦ ⎣ ⎦⎣ ⎦ ⎣ ⎡1000 1000 1000 ⎤ ⎡ x1⎤ ⎡3000 ⎤ ⎥ ⎢ ⎥⎢ ⎥ ⎢ 1 1⎥ ⎢ x 2 ⎥ = ⎢ 6 ⎥ ⎢ 4 ⎢ ⎥ ⎢ 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 r matriz 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 + =∂ x2 ∂ y2 ε0

(9-1)

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:
⎡ ∂2 T ∂2 T ∂2 T ⎤ ∂T =κ2 ⎢ 2 + + ⎥ ∂t ∂ y2 ∂ z2 ⎥ ⎢∂ x ⎦ ⎣

(9-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 ∂ x2 ∂ y 2

(9-3)

É 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) ∂ x2 ∂ y2

(9-4)

dadas condições fronteira, por exemplo, na forma:
φ (0 , y) = φ 1 ( y) φ ( L x , y) = φ 2 ( y) φ (x , 0) = φ 3 (x) φ (x , L y ) = φ 4 ( x)

(9-5)

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 2 ∂ φ φ i, j -1 2 φ i, j + φ i, j+1 _ ∂ y2 ∆y 2

(9-6)

com:

65

Balanço térmico de um painel solar

66

φ i , j = φ ( xi , y j )
xi = i ∆x ; i = 0,..., M y j = j ∆y ; j = 0,..., N

(9-7)

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:

φ (x ± ∆t) = φ (x) ±

2 3 ∂φ ∂ φ ∂ φ ∆x + 2 ∆x 2 ± 3 ∆x 3 + ... ∂x ∂x ∂x

(9-8)

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 - ... ∂ x2 ∆x 2 ∂x

(9-9)

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:
n φ i1 , 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 é:
φ in+j1 = φ in, j + ,
Ri , j 4

(9-12)

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:

φ in+j1 = φ in, j + α ,
1≤ α ≤ 2

Ri , j 4

(9-13)

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:
α opt = 2 - π
1 ⎞ ⎛ 1 2 ⎜ 2+ 2⎟ N ⎠ ⎝M
1/2

(9-14)

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
a) Método da Relaxação
72

Métodos numéricos

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

Sign up to vote on this title
UsefulNot useful