Física Computacional - FSC-5705

só um divisor

Algoritmos, pseudo-programas e fluxograma

É muito provável que este texto seja o mais importante do curso já que el transcende ao curso propriamente. Aqui tratarei de dar umas dicas de como organizar alguma ideia a fim de transformar em um programa, mas essas mesmas dicas se aplicam com algumas ligeiras modificações à resolução de problemas em outras disciplinas e porque não, no dia dia.

Modelo

Nosso objetivo fim é poder transcrever um problema em alguma linguagem de computação a fim de obter de forma rápida resultados que de outra forma seriam muito demorados o mesmo impossíveis de serem obtidos. Para isto devemos primeiro estabelecer um modelo que de alguma forma represente (ou esteja próximo de representar) o problema a tratar. A Física toda está baseada na construção de modelos que utilizamos para "reduzir" o número de variáveis que descrevem o sistema, nesse processo de redução isolamos e tratamos aquelas variáveis que som de maior importância e outras são consideradas como perturbações às primeiras. Como exemplo citemos o paradigma da Física, o sistema massa-mola; esse sistema é um modelo que permite analisar o movimento de um corpo que é sujeito à ação de uma força restauradora (mola) contudo esse modelo é uma aproximação da realidade pois é válido para a faixa de deslocamentos pequena onde as deformações seja elásticas (retorna à posição original sem mudar de forma) e não plasticas (mudança de forma).

fig01
Figura 01: Deformação de um corpo como função da Força aplicada.

Da figura 01 vemos que a região linear onde a lei de Hook é válida \[ F = -kx \nonumber \] só é valida para pequenas deformações, acima disso temos que considerar termos não lineares, assim de alguma forma a lei de Hook é uma aproximação de primeira ordem da realidade. Esse tipo de aproximações é mais frequente do que pode parecer na física.

Mas, porque os Físicos trabalhamos dessa forma? Porque deixa o problema tratável matematicamente e tem mais sentido físico. Essa força de Hook deriva de um potencial de II ordem \[ F = -\frac{dU}{dx} = -\frac{d\;}{dx}\left[\frac{1}{2}k(x-x_0)^2\right] \nonumber \] Do ponto de vista físico esse resultado é muito intuitivo já que a Física nos diz que o sistema vai procurar ficar perto desse mínimo já seja oscilando ou mesmo nessa posição de equilíbrio.

Figura 02: Potencial quadrático.

Matematicamente, por outro lado, essa equação de II grau é fácil de resolver (usando Baskara). Equação de III ordem já são um problema, temos algumas soluções fechadas (método de cardano), mas não são simples e muito menos intuitiva já que fisicamente nos leva a problemas complexos como os encontrados com a equação de Duffing

Algoritmo

O algoritmo tem a ver com os procedimentos ou passos seguidos para chegar a uma dada solução de um problema, assim por exemplo para resolvermos um problema - exercício - de Física temos um algoritmo genérico que funciona relativamente bem:

  1. leia o exercício mais de uma vez
  2. Identifica os dados conhecidos
  3. Identifique os dados não conhecidos
  4. Em base a os dados, identifique o modelo físico adequado (operação mental)
  5. Substitua as variáveis conhecidas nas equações que descrevem o modelo
  6. Isole as variáveis desconhecidas
  7. Resolva a equação final
Na pesquisa científica seguimos um algoritmo que nasceu com Galileu, o chamado método científico. Esse método consiste a grosso modo
  1. Observação do fenômeno
  2. Formulação de hipóteses
  3. Experimentação a fim de verificar hipóteses
Note que o algoritmo associado ao método científico e uma simplificação do algoritmo de resolução de problemas. Foram propositalmente escolhido esses dois algoritmos para você ver que está sendo treinado para aprender a aplicação desse algoritmo inicial, ser Físico é resolver problemas mas a diferencia de outros profissionais você deve aprender a reduzir o problema a suas componentes essenciais (o modelo), isso é o que nos torna diferente de um engenheiro, isso é o que torna a Física uma ciência mãe (geradora de outras ciências), por tanto você deve exigir que seus professores lhes tratem como tais, alunos de Física.

Fluxograma

Fluxograma é uma representação visual do algoritmo a ser utilizado para resolver um problema, por exemplo para o caso de método científico acima tratado temos a seguinte representação em fluxograma

fig01
Figura 03: "Fluxograma do Método Científico" tomado da wikipedia.

Estou colocando esse fluxograma para exemplificar o fato de que podemos converter nosso algoritmo em algo do tipo "Follow de white rabbit" (siga o coelho branco - Alice no pais das maravilhas), mas SOU ENFÁTICO em afirmar, FÍSICO NO APRENDE NEM APLICA O MÉTODO CIENTÍFICO DESSA FORMA. Nos aprendemos de 3 formas, fazendo os problemas em casa para fixar o método, vendo o professor MOSTRAR NO QUADRO a origem e modelos utilizados para chegar às equações para assim aprender a construir modelos e ir no laboratório para aprender a perguntar à natureza se o nosso modelo está certo.

Programas, algoritmos, pseudocódigo e Fluxogramas

Um programa é a tradução de um algoritmo a uma determinada linguagem de programação. Veja que nem todo algoritmo pode ser convertido em um programa (pelo menos eu espero), senão o próprio método científico ao estilo dos físicos poderia ser aplicado pelos computadores (o pessoal da inteligencia artificial pensa que é possível, eu acredito que com nossa tenologia atual isso ainda é impossível), mas todo programa tem origem num algoritmo. Os algoritmos que são convertidos em programas seguem regras rígidas que permitem que um outro computador dê o mesmo resultado sem a necessidade de lances geniais ("Feeling") no meio da execução, nesses casos o algoritmo se resume a "Follow de white rabbit", é por isso que a estrutura de fluxograma representam uma ótima forma representar algoritmos computacionais.

Fluxogramas de programas

No caso de fluxograma de algoritmos destinados a auxiliar na construção de programas computacionais existem símbolos que a própria forma dele tem um significado intrínseco, esse símbolos são descrito na tabela a seguir:

Símbolo Nome (alias) Uso
Terminador Mostra o inicio e o fim de um programa.
Linha de Fluxo Mostra a direção do processo
Processo Indica algum tipo de processamento, calculo, etc.
Entrada Manual Indica o ponto onde o usuário do programa interatua com o programa fornecendo dados de forma manual, via teclado, mouse, leitor de barras, etc.
Exibição Representa a forma de interação do programa com o usuário via o monitor.
Dados Este símbolo representa oficialmente dados de uma forma genérica. Tipicamente é associado a operações genéricas de entrada e saída de dados, desde que identificados.
Decisão Indica uma ramificação no fluxo do programa devido a alguma decisão que deva ser tomada. Esse simbolo índica que a resposta será um sim ou não.
Conector Este símbolo representa a entrada ou saída em outra parte do diagrama de blocos. Pode ser usado na definição de quebras de linha e na continuação da execução de decisões.
Preparação Este símbolo representa a modificação de instruções ou grupo de instruções existentes em relação à ação de sua atividade subsequencial.
Inicio de um laço Inicio de um laço. É uma forma de representação gráfica do funcionamento mecânico sem o valor real do laço.
Fim de um laço Fim de um laço. É uma forma de representação gráfica do funcionamento mecânico sem o valor real do laço.
Armazenamento de dados Este símbolo representa a definição de acesso de abertura, fechamento, leitura e escrita em um determinado arquivo de dados a ser realizada por um programa.

Estrutura de seleção

laço Se simples (if simples)

representação do If no diagrama de fluxo
Figura 04: Estrutura Se simples.

Observe que o procedimento (corpo) só será executado se a condição de seleção (cond. de sel.) for verdadeira, caso contrario o programa pula essa seção e continua.

laço Se composto (if composto)

representação do If no diagrama de fluxo 2
Figura 05: Estrutura Se composta.

Diferentemente do caso anterior, se a condição de seleção não for verdadeira, será executado o Procedimento 1, se for verdadeira será executado o procedimento 2.

Estrutura de repetição

Laço incondicional do tipo para (laço for)

representação do laço for no diagrama de fluxo
Figura 06: Estrutura do laço for.

Na estrutura incondicional do tipo para (laço for) temos um variável (var.) que é um contador, esse contador inicia com um valor preestabelecido (ini.) e a cado volta do laço seu valor é incrementado (inc.) até atingir o valor final (fim) o qual é um teste lógico.

Laço condicional do tipo enquanto verdadeiro repita (laço while)

representação do laço for no diagrama de fluxo
Figura 07: Estrutura do laço while.

Na estrutura do laço condicional do tipo enquanto verdadeiro faça (laço while) temos um condição que será testada (cond. de seleção) caso seja verdadeira essa condição será realizado o Procedimento dentro do bloco e no fim será novamente testada a condição. Isso se repetira até que a condição não mais seja válida o que resulta na saída do laço.

Laço condicional do tipo repita enquanto verdadeiro (laço do while)

representação do laço for no diagrama de fluxo
Figura 08: Estrutura do laço while.

É similar à anterior, com a diferença de que o teste é feito no fim do laço. Isso permite que pelo menos uma vez o procedimento seja realizado.

Exemplos

  1. Monte o diagrama de fluxo que calcule as raízes de uma equação de II grau.
    Solução
    Analisando o problema vemos que a solução de uma equação do tipo \[ ax^2 + bx^2 + c = 0 \nonumber \] está dada pela formula de Bhaskara: \[ x = \frac{-b \pm \sqrt{b^2-4ac}}{2a} \nonumber \] Primeiro montemos um pseudo algorítimo que nos permita pensar a respeito do problema. Um pseudocódigo basicamente é um programa escrito em algo próximo ao português:

    Inicia:
    Lê a, b, c
    Se a = 0 Então
    Imprime "Não é uma equação de II grau!"
    Senão
    D $\leftarrow$ a*a - 4ac
    Se D < 0 Então
    Imprime "Não existem raízes reais!"
    Senão
    x1 $\leftarrow$ (-b + raíz(D)) / (2 * a)
    x2 $\leftarrow$ (-b - raíz(D)) / (2 * a)
    Imprime x1, x2
    Fim Se
    Fim Se
    Termina
    O diagrama de fluxo associado a esse problema é
    diagrama de fluxo bhaskara
    Figura 09: Diagrama de Fluxo da solução por Bhaskara.
  2. A geração de $n$ elementos da serie de Fibonacci é um problema clássico estudado em disciplinas computacionais quando o assunto é tratar de funções e recursividade (uma função func se chama a se própria), mas é possível cria um algoritmo que imprima esses elementos sem necessidade de recorrer à recursividade, aqui é mostrado o fluxograma desse algoritmo a fim de que você note como é representado um laço controlado por contador.
    A série de Fibonacci se define segundo \[ F(i) = \left\{\begin{array}{lcl} 0, & & i = 0\\ 1, & &i = 1\\ F(i-1) + F(i-2) & &i > 1 \end{array}\right. \] Típicamente essa inequação é um caso no qual devemos utilizar blocos de decisão pois ela apresenta 3 opção dependendo do valor de $i$. O algoritmo que da conta dessa equação é descrito no diagrama de fluxo a seguir
    diagrama de fluxo Fibonacci
    Figura 10: Diagrama de Fluxo da serie de Fibonacci.
  3. Nesse algoritmo $a1$, $a2$ e $a3$ representam os valores da sequencia d fibonacci em $F(i-2)$, $F(i-1)$ e $F(i)$, respectivamente, para um dado $i$.