Física Computacional - FSC-5705

só um divisor

Primeiro script

Diferente de linguagens como C, Fortran ou Java, o Python não é uma linguagem compilada, ele é uma linguagem interpretada o que significa que sempre que for rodar o programa devera chamar o interpretador para que ele lei e execute o script. A maior desvantagem desta abordagem é que Phyton é muito mais lento do que os programas feitos em outras linguagens, mas as vantagens são tantas que superam esta dificuldade, contudo devemos ter sempre em mente que cada programa tem seu proposito, assim caso você precise de velocidade de computo utilize C ou Fortran, mas caso precise de agilidade fique com Python.

primeiro script
Figura 01: executando um script python.

Na figura 01 se mostra um tipo script, ele inicia no cabeçalho informando qual é a linguagem, no caso #!/usr/bin/env python. O primeiro que você deve saber é que ele é um arquivo de texto normal, assim poderia ser escrito em qualquer editor simples (usuários windows: eso significa usar o bloco de notas). Note que o # é o mesmo simbolo utilizado para comentário. Para executar o script existem diversas formas, a mais simples é digitar python nome_do_script; a outra forma é converter o script em um executável: chmod u+x nome_do_script e depois executar ele utilizando o comando ./ (execute): ./nome_do_script . O outro jeito é entrar no ipython e digitar run nome_script (note que no devem ser usados acentos!!). Esse último método é o que será utilizado com windows quando se instala o python (x,y) (o problema é que por enquanto só tem para 32 bits mas o windows de 64 emula bem)

primeiro script desde o ipython
Figura 02: O ipython.

Para sair do ipython basta digital CTRL+d (a tecla control junto da tecla d). O ipython é um shell interativo em python, você pode rodar comando python diretamente nele. Para rodar o ipython basta digitar no terminal ipython e se você deseja utilizar a matplotlib é melhor digitar no terminal ipython -pylab

O python é extremadamente chato com a tabulação, por favor cuide isso, tabular em python significa entrar num bloco tipo if ou for (Do em Fortran), while, etc.



Variáveis

O python tem a peculiaridade de não ser tipificado, ou seja, se você trabalha em fortran o C (e derivados), você sempre necessita definir as variáveis, se são inteiras, reais (float) ou caráteres (strings), no python isso não é necessário, as variáveis (constantes) são objetos e na execução o python saberá que se trata de uma variável de um tipo determinado.


      #!/usr/bin/env python

      a = 2
      b = a + 1
      a = '2'
      c = 'a vale ' + a

      print b
      print c

      

Similar a outras linguagens as variáveis básicas do python (na verdade os objetos) podem ser strings (palavras - cadeia de caráteres), inteiros, reais (float), complexos (intrínseco a fortran 90 e superiores só), lógicos; mas como as variáveis armazenam objetos elas podem armazenar coisas ainda mais complexas como matrizes, figuras, gráficos, músicas, etc. Um ponto importante (principalmente para programador em C já que os "fortraneros" em geral nem sabem desse problema) é o referente à precisão, recomendo dar uma olhada no módulo decimal do python e em o documento relativo a representação de números de ponto flutuante - reais. Você pode dar a uma variável o nome que desejar, menos aqueles nomes associados às palavras reservadas: and, as, assert, break, class, continue, def, del, elif, else, except, False, finally, for, from, global, if, import, in, is, lambda, None, nonlocal, not, or, pass, raise, return, True, try, with, while

Exemplo 01

Faça um programa que calcule atribua cada objeto e imprima na tela o resultado da soma, produto e divisão:


      
      #!/usr/bin/env python

      print "Inicio das Somas"
      a = 5
      b = 3
      c = a + b
      print c

      a = 5.0
      b = 3.0
      c = a + b
      print c

      a = 1.0E-4
      b = 9.0E-5
      c = a + b
      print c

      a = complex(1.0, 1.0)
      b = complex(1.0, 2.0)
      c = a + b
      print c

      a = "ola "
      b = "mundo"
      c = a + b
      print c

      print "\nInicio dos Produtos"
      a = 5
      b = 3
      c = a * b
      print a, " * ", b, " = ", c

      a = 5.0
      b = 3.0
      c = a * b
      print c

      a = 1.0E-4
      b = 9.0E-5
      c = a * b
      print c

      a = complex(1.0, 1.0)
      b = complex(1.0, 2.0)
      c = a * b
      print c

      #a = "ola "
      #b = "mundo"
      #c = a * b
      #print c


      print "\nInicio das Divisoes"
      a = 5
      b = 3
      c = a / b
      print c

      a = 5.0
      b = 3.0
      c = a / b
      print c

      a = 1.0E-4
      b = 9.0E-5
      c = a / b
      print c

      a = complex(1.0, 1.0)
      b = complex(1.0, 2.0)
      c = a / b
      print c

      #a = "ola "
      #b = "mundo"
      #c = a / b
      #print c      

      

Podemos converter uma variável de um tipo em outro utilizando int (nome_variavel), float (nome_variavel) e str (nome_variavel). Veremos adiante que podemos até realizar conversões para outros tipos de objetos mais complexos.

Operações de entrada e saída básica

Imprimindo no terminal

O print é o comando de escrita ao terminal que já foi utilizado em vários pontos deste texto. O que pode merecer um pouco mais de atenção é a formatação que pode ser dado ao dados. Ao igual que no C, o print converte para string aquilo que vai ser impresso no terminal, assim essa formatação pode ser aplicada às string. Para que a conversão seja feita de forma direta é necessário informar ao print qual é a formatação que será dada ao dados segundo:

print "formatação" % (variável1, variável2, ...)

onde a formatação tem a sintaxe

%[flags][largura][.precisão]código

em que flags é dada por uma das opções da seguinte tabela

flag significado
* argumento especifica a largura ou precisão
- justificado á esquerda
+ mostra o sinal positivo
<spc> deixa um espaço em branco antes de um número positivo
# adiciona zero (0) ao octal ou (0x ou 0X) ao hexadecimal
0 completa com 0 à esquerda a largura do campo ([largura]).

largura diz a quantidade de campos que serão utilizados para imprimir e precisão diz a máxima quantidade de dígitos apos o ponto decimal.

onde código diz respeito a um dos mencionado na coluna 1 da próxima tabela

código significado
s String
c Carácter
d, i Número decimal.
o Número octal
x, X Número inteiro hexadecimal. o x imprime as letras em minuscula e o X em maiúscula.
f imprime um número real em notação decimal.
e, E Real em notação científica. O e imprime em minúscula e o E maiúscula.
g, G Dependendo de qual tiver o menor comprimento na impressão, utiliza f (ou F) ou e (ou E).
% Imprime o caráter porcentagem (%).

No exemplo embaixo se exemplifica o uso da impressão formatada. Aproveitamos e mostramos o módulo de matemática simbólica do python (tipo maple, matemática, maxima, etc)

        #!/usr/bin/env python

        import sympy                     #modulo de comp. symbolica

        x = sympy.Symbol('x')                  #x eh um simbolo
        y = sympy.integrate(x**2 + x + 1, x)   #avalia a integral

        print y                    #imprime em tela o resultado, eh uma string
        sympy.pprint(y)            #pretty print, funcao de sympy
        y2 = y.subs(x, -3)         #subtitui x por -3 e avalia

        print "%+07.2f" % (y2.evalf())  #converte a real, se positivo imprime +
                                        #7 campos, 2 digitos apos zero, prenche
                                        #com zero a esquerda o espaços em branco
      

a título de esclarecimento, na linha 6 foi criado um objeto do tipo sympy de forma que herda todos os métodos da classe sympy, por isso na linha 10 podemos acessar o método subs e na linha 12 o método evalf().

Lendo do terminal

Para ler do terminal o python possui 2 funções (na realidade mais, podemos fazer um open do stdio com opção r): input() e raw_input(). A diferença entre elas é que raw_input() sempre devolve uma string, enquanto que input() avalia a operação realizada entre os objetos de entrada (ou seja realiza uma conversão de tipo), vejamos o exemplo

        #!/usr/bin/env python

        a = raw_input("Por favor, digite sua idade ")
        b = input("Por favor, digite sua idade novamente ")

        print "primeiro informastes que tens %s anos" % a
        print "depois informastes que tens %s anos" % b
      

Se você digitar algo como 21 + 2 a variável a vai armazenar literalmente o que você digitou: 21 + 2, enquanto que a variável b vai armazenar 23, já que o input avalia antes de salvar na variável, mas o resultado em b é uma string. Como a leitura do terminal sempre da uma string o melhor é converter ela para o tipo de dado que se quer, no exemplo anterior é obvio que se quer um inteiro por tanto o script muda para

        #!/usr/bin/env python

        a = int( raw_input("Por favor, digite sua idade ") )
        b = int( input("Por favor, digite sua idade novamente ") )

        print "primeiro informastes que tens %03d anos" % a
        print "depois informastes que tens %03d anos" % b
      

de forma que se você digitar de novo 21 + 2 vamos ter um erro de conversão já na atribuição em a; caso voce digite 23 e depois 21 + 2, não dará ero. Veja que agora podemos formatar a saída já que a e b são de tipo inteiro (imprime um inteiro com no mínimo 3 campo, preenchendo com zeros à esquerda as lacunas).

Exercícios

  1. Escreva um programa que calcule e e imprima a raiz quarta de 81.0. Assim que tu verifiques que teu programa está correto, usa ele para calcular a raiz quarta de 1728.896400 Tu programa deve utilizar a função sqrt().
  2. Faça um programa que receba o preço de um produto, calcule e mostre o novo preço, sabendo-se que este sofreu um desconto de 10%
  3. Faça um programa que calcule e mostre a área de um trapézio.
  4. Faça um programa que calcule o perímetro equatorial, a área e o volume de uma esfera.
  5. Faça um programa que calcule o deslocamento de um corpo ideal sabendo a massa, o tempo de percurso, a sua velocidade inicial e a força aplicada sobre ele.
  6. O sistema de avaliação de uma determinada disciplina é composto por três provas. A primeira prova tem peso 2, a segunda prova tem peso 4 e a terceira prova tem peso 6. Faça um programa que calcule a média final de um aluno dessa disciplina.
  7. Crie um programa que dada a temperatura em centigrado faça a converção para Fahrenheit
  8. Faça um programa que receba a hora, minuto e segundo e converta essa informação e imprima essa informação para minutos e segundos transcorridos desde a meia noite (hora zero).
  9. Dado o preço de um mesmo produto em dois datas diferentes, calcule a inflação no preço desse produto.
  10. Dado um angulo em graus, minutos e segundos (exemplo: $31^\circ 12' 73''$), converta ele para radianos
  11. Dado os pontos $P_1$ e $P_2$, e sabendo que por eles passa uma linha reta, calcule a inclinação e ponto de corte do eixo das ordenadas (nota: um ponto no plano cartesiano é constituído de 2 variáveis)
  12. Dado o vetor $\vec{A}$ (constituído pelas componente $A_x$, $A_y$, $A_z$) e o vetor $\vec{B}$ (constituído pelas componente $B_x$, $B_y$, $B_z$), calcule: (a) a soma ($\vec{A}+\vec{B}$), (b) A diferencia ($\vec{A}-\vec{B}$) e (c) o produto escalar ($\vec{A}\cdot\vec{B}$)
  13. Sabendo que sobre um corpo atua uma força $\vec{F}$ a qual prova um deslocamento do corpo desde o ponto $\vec{r_1}$ até $\vec{r_2}$, calcule o trabalho feito por essa força.
  14. Calcule a força gravitacional $\vec{F_g}$ entre a Terra e Marte sabendo a posição de Terra $\vec{r}_T$ e posição de Marte $\vec{r}_M$ em um dado instante.
  15. Sabendo que um barra fininha de comprimento $l$ pode girar livremente em torno de um ponto $P_1$, se é aplicada uma força $\vec{F}$ no ponto $P_2$, calcule o torque experimentado por ela. Se a massa da barra é $m$, calcule a velocidade linear de um ponto $P_3$ sobre a barra, depois de transcorridos $t$ segundos.
  16. Para pequenos valores de $x$ o $\sin x$ pode ser aproximado pelos 3 primeiros termos da serie: \[ \sin x \approx x - \frac{x^3}{6} + \frac{x^5}{120} \nonumber \] onde $x$ está em radianos. Escreva um programa que calcule o valor do $\sin$ para $x=0.0314$, $x=0.314$, $x=3.14$. Compare com os valores devolvidos pela função sin
  17. Escreve um programa que armazene a soma dos inteiros 12 e 33 na variável chamada soma. O programa deve mostrar na tela o valor armazenado em soma
  18. Escreve uma programa que armazene o valor 16 na variável comprimento e 18 na variável largura. O programa deve armazenar na variável perímetro o resultado da seguinte operação \[ perimetro = 2 * (comprimento * largura) \nonumber \] e imprimir o valor armazenado em perímetro na tela.
  19. Escreva um programa que armazene 105.62 na variável primNum, 89.352 em secNum e 98.67 em terNum (declara as variáveis double). O programa deve calcular o valor médio desses numeros e armazenar na variável media. Imprima o resultado na tela.
  20. Escreva um programa que calcule a circunferência e a área de um circulo que tem um raio de $3.3\,cm$
  21. Escreva um programa que converta a temperatura dada em graus Fahrenheit ($F$) para graus Celcius ($C$). A equação que relaciona essa escalas termométricas é \[ C = \frac{5}{9} (F - 32) \nonumber \]
  22. Escreva um programa que calcule o $n$-esimo termo ($v$) da sequencia aritmética dada pela equação \[ v = a + (n-1)d \nonumber \] onde $a$ é o primeiro termo da sequencia e $d$ é a diferença entre dois termos quaisquer da sequencia.
  23. Escreva um programa que calcule a expansão linear como função da temperatura. A equação para expansão linear, $l$, é \[ l = l_0 [1+\alpha (T_f-T_0)] \nonumber \] onde $l_0$ é o comprimento do material à temperatura $T_0$, $\alpha$ é o coeficiente de expansão linear, $T_f$ é a temperatura final. Considere uma barra de aço à temperatura inicial de $0^\circ C$ e à temperatura final de $40^\circ C$. O coeficiente de expansão térmica do aço nessa faixa de temperatura é $10.5\times 10^{-6}\, ^\circ C^{-1}$. O programa deve imprimir o novo comprimento e o incremento porcentual.
  24. Escreve um programa que calcule a área de uma elipse, $A = \pi \,a\, b$, onde $a$ é o semieixo menor, $b$ é o semieixo maior. Suponha o semieixo menor é 2.5 cm e o maior 6.4 cm.
  25. A resistência equivalente de 3 resistores conetados em paralelos está dada por \[ R_{eq} = \frac{1}{\frac{1}{R_1} + \frac{1}{R_2} + \frac{1}{R_3}} \nonumber \] Escreva um programa que calcule a $R_{eq}$ das resistências $R_1 = 1000\Omega$, $R_2 = 1500\Omega$ e $R_3 = 2000\Omega$. O programa deve imprimir na tela o seguinte:
           A resistencia equivalente, em Ohms, eh _______
    onde o segmento deve ser subtituido pelo valor de $R_{eq}$
  26. As corrente $i_1$, $i_2$ e $i_3$ correspondentes ao circuito da figura embaixo podem ser calculadas utilizando as equações
    circuito \[ i_1 = \frac{V_2R_3 + V_1(R_1+R_3)}{(R_1+R_3)(R_2+R_3)-R_3^2} \nonumber \] \[ i_2 = \frac{V_1R_3 + V_2(R_1+R_3)}{(R_1+R_3)(R_2+R_3)-R_3^2} \nonumber \] \[ i_3 = i_1 - i_2 \nonumber \] Usando essas expressões escreva um programa que calcule as correntes quando $R_1 = 10\Omega$, $R_2 = 4\Omega$ e $R_3 = 6\Omega$, $V_1 = 12V$ e $V_2 = 9V$. A saída producida pelo programa deve ser
    Corrente i1 eh ______
    Corrente i2 eh ______
    Corrente i3 eh ______
  27. Escreva um programa que calcule e imprima o valor da inclinação de uma reta que une dois pontos cujas coordenadas são $(3,7)$ e $(8,12)$. Para o calculo da inclinação utilize a seguinte expressão \[ m = \frac{y_2 - y_1}{x_2 - X_1} \nonumber \] Modifique seu programa para calcular a inclinação da reta que passa por $(2,10)$ e $(12,6)$.