Física Computacional - FSC-5705

só um divisor

Matemática no Python

Já vimos na aula anterior que o python permite realizar operações básica como soma, diferença, multiplicação e divisão; mas ele também permite realizar operações lógicas, de forma transparente. Para acessarmos funções matemáticas mais complexas devemos utilizar o módulo matemático que será explicado em detalhe nesta seção.

Operações matemáticas básicas

Por padrão o python trás definidas as operações básica: soma (+), resta (-), divisão (/) e multiplicação(*), resto da divisão (%) (mod em fortran) e potenciação (**) as quais funciona para inteiros:

        #!/usr/bin/env python

        a = 2
        b = 3

        c = a + b; print '%d + %d = %d' % (a, b, c)
        c = a - b; print '%d - %d = %d' % (a, b, c)
        c = a * b; print '%d * %d = %d' % (a, b, c)
        c = a / b; print '%d / %d = %d' % (a, b, c)
        c = a % b; print '%d %% %d = %d' % (a, b, c)
        c = a**b; print '%d**%d  = %d' % (a, b, c)
      

[usuario@python: ]# python exemplo01.py
2 + 3 = 5
2 - 3 = -1
2 * 3 = 6
2 / 3 = 0
2 % 3 = 2
2**3 = 8

números reais (floats)

        #!/usr/bin/env python

        a = 2.0
        b = 3.0

        c = a + b; print '%f + %f = %f' % (a, b, c)
        c = a - b; print '%f - %f = %f' % (a, b, c)
        c = a * b; print '%f * %f = %f' % (a, b, c)
        c = a / b; print '%f / %f = %f' % (a, b, c)
        c = a % b; print '%f %% %f = %f' % (a, b, c)
        c = a**b; print '%f**%f  = %f' % (a, b, c)
      

[usuario@python: ]# python exemplo02.py
2.000000 + 3.000000 = 5.000000
2.000000 - 3.000000 = -1.000000
2.000000 * 3.000000 = 6.000000
2.000000 / 3.000000 = 0.666667
2.000000 % 3.000000 = 2.000000
2.000000**3.000000 = 8.000000

números complexos (note que o print não tem como representar adequadamente um número complexo)

        #!/usr/bin/env python
        #!/usr/bin/env python

        a = 2.3 + 4.0j
        b = 3.1 + 6.5j

        c = a + b; print a, "+",  b, "=", c
        c = a - b; print a, "-",  b, "=", c
        c = a * b; print a, "*",  b, "=", c 
        c = a / b; print a, "/",  b, "=", c 
        c = a % b; print a, "%",  b, "=", c 
        c = a**b;  print a, "**", b, "=", c
      

[usuario@python: ]# python exemplo03.py
(2.3+4j) + (3.1+6.5j) = (5.4+10.5j)
(2.3+4j) - (3.1+6.5j) = (-0.8-2.5j)
(2.3+4j) * (3.1+6.5j) = (-18.87+27.35j)
(2.3+4j) / (3.1+6.5j) = (0.638835325877-0.0491708445816j)
(2.3+4j) % (3.1+6.5j) = (2.3+4j)
(2.3+4j) ** (3.1+6.5j) = (0.101541299887+0.0732116181261j)

e a soma com strings (adiante veremos muitas mais operações com string, que é uma classe especial)

        #!/usr/bin/env python

        a = 'ola'
        b = ' mundo'
        c = 2012

        c = a + b
        print '%s + %s = %s' % (a, b, c)
        d = a + b + ' em ' + str(c)
        print c
      

[usuario@python: ]# python exemplo04.py
ola + mundo = ola mundo
ola mundo

O ponto e vírgula nos exemplos prévios significa fim da linha. Além dessas operações o python também disponibiliza recursos para manipular dados em nível de bits: deslocamento à esquerda (<<), deslocamento à direita (>>), e (&), ou (|), xor (^) e complemento de 1 (~).

Operações lógicas

O python permite trabalhar diretamente com objetos lógicos: True (verdadeiro) e False (falso) que podem ser atribuídos à uma variável (note que é em maiúscula),

Sobre esse objetos se admitem a seguintes operações lógicas> and, or e not, como exemplo temos

        #!/usr/bin/env python

        a = 1.0
        b = 2.0
        c = 3
        d = True
        e = (a>b)

        print ( e and (b<c) )
        print ( ( not e ) and d )

        t1 = 'mae'
        t2 = 'pae'
        t  = (t1==t2)

        print t
      

[usuario@python: ]# python exemplo05.py
False
True
False

note que os parenteses ajudam na compressão da expressão.

Importando um módulo

Uma das grandes qualidades do pytrhon é que você faz ele tão poderoso quanto precisar. Por padrão o python disponibiliza poucos recursos mas você pode criar ou utilizar recursos criados por outras pessoas. Para se utilizar recursos externos é necessário importar um módulo (tipo subprogramas externos) com a facilidade que você deseja. Para importar um módulo o procedimento é como se mostra no exemplo embaixo

        #!/usr/bin/env python

        import math

        a = 4.0
        b = math.sqrt(a)
        print b
      

[usuario@python: ]# python exemplo06.py
2

As vezes o nome do módulo é comprido resultado enfadonho digitar ele, para isso podemos importar o modulo com outro nome, como mostrado embaixo

        #!/usr/bin/env python

        import math as m

        a = 4.0
        b = m.sqrt(a)
        print b
      

[usuario@python: ]# python exemplo07.py
2

Para evitar a chatice de ter que escrever o nome do modulo, mais um ponto, a fim de acessar à função (atributo) desejada podemos importar todo o módulo, para isso fazemos

        #!/usr/bin/env python

        from math import *

        a = 4.0
        b = sqrt(a)
        print b
      

[usuario@python: ]# python exemplo08.py
2

finalmente, podemos importar só uma função (atributo) que desejemos de um dado módulo

        #!/usr/bin/env python

        from math import sqrt

        a = 4.0
        b = sqrt(a)
        print b
      

[usuario@python: ]# python exemplo09.py
2

Principais Funções matemática

Para acessar às funções matemática devemos importa a classe matemática do python, math, caso seja necessário trabalhar com números complexos devemos utilizar cmath. O módulo math permite acesso a funções como: sin, cos, tan, sinh, cosh, exp, log, pi, e, etc

        #!/usr/bin/env python

        from math import sinh, exp, e, pi

        x  = 2*pi
        r1 = sinh(x)
        r2 = 0.5 * (exp(x) - exp(-x))
        r3 = 0.5 * (e**x - e**(-x))
        print '%.16f %.16f %.16f' % (r1, r2, r3)
      

[usuario@python: ]# python exemplo09.py
267.7448940410164369 267.7448940410164369 267.7448940410163232

Contudo, resulta mais interessante importar o módulo numérico do python que é muito mais completo e que além das operações matemáticas do math nos permite trabalhar com matrizes. Esse módulo é o numpy (numerical python) que é parte do esforço das ferramentas do python para matemática, ciências e engenharia conhecido como scipy. Uma lista completa das funções acessíveis do módulo numpy (com exemplos) pode ser encontrada aqui. Igualmente resulta interessante dar uma olhada no livro de receitas do scipy para ter acesso a funções não tradicionais.

        #!/usr/bin/env python

        import numpy as np
        from fractions import Fraction  #aritmetica racional
        from sympy.mpmath import mp     #matematica simbolica

        theta       = 30.0
        thetaRad    = np.deg2rad(theta)
        thetaRad_pi = np.deg2rad(theta) / np.pi

        f = Fraction(thetaRad_pi).limit_denominator()  #cria uma fracao

        print '%.1f graus =  %f radianos = %s pi radianos' % (theta, thetaRad, f)

        senoAng = np.sin(thetaRad)
        print 'o seno de %.1f graus = %f' % (theta, senoAng)

        cosenoAng2 = np.sqrt(3.0) / 2.0
        theta2Rad  = np.arccos(cosenoAng2)  #arccos nao acos
        theta2     = np.rad2deg(theta2Rad)

        print '%.1f graus tem um coseno igua a = %.15f' % (theta2, cosenoAng2)

        mp.dps = 100                                  #numero de digitos
        piLongo = mp.pi
        print 'pi com 100 decimais = %s' % piLongo    #piLongo como uma string
        print 'pi com 100 decimais = %.100f' %piLongo #piLongo como um decimal
      

[usuario@python: ]# python exemplo09.py
30.0 graus = 0.523599 radianos = 1/6 pi radianos
o seno de 30.0 graus = 0.500000
30.0 graus tem um coseno igua a = 0.866025403784439
pi com 100 decimais = 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068
pi com 100 decimais = 3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000

Vale destacar que enquanto numpy define as funções trigonométricas "inversas" como: arcsin, arccos, arctan, o módulo math utiliza a mesma definição utilizada no C: asin, acos, atan, isso também é válido para as funções hiperbólicas.

Exercícios

  1. Restos antigos de animais e plantas podem ser datados utilizando a datação por radiocarbono. Isto depende da criação contínua de uma forma radioativo do carbono, conhecida como ${}_6C^{14}$, devido à interação de raios cósmicos com a atmosfera da Terra. Quando uma planta o animal morre, a razão de ${}_6C^{14}$ para ${}_6C^{12}$ é inicialmente a razão atmosférica, mas ela diminui devido ao decaimento do ${}_6C^{14}$. Na atualidade é possível medir a quantidade de ${}_6C^{14}$ que possuí uma amostra medindo a a razão $A$ na qual as partículas de decaimento de ${}_6C^{14}$ são emitidas pela amostra ($A=\lambda N$, onde $\lambda$ é a constante de decaimento do ${}_6C^{14}$).
    Para datar restos antigos, podemos pegar uma amostra de de carbono deles e uma amostra de carbono - um comparador - de idade conhecida $T$ (o ideal é que seja de uma planta ou animal similar de aproximadamente da mesma idade da amostra) e medir $A_{amostra}$ e $A_{comparador}$. Podemos também pesar ambos, a amostra e o comparador, obtendo a massa de carbono em cada um como $M_{amostra}$ e $M_{comparador}$. Então entraremos a idade $t$ da amostra a partir de \[ \frac{A_{amostra}}{A_{comparador}} \frac{M_{comparador}}{M_{amostra}} = e^{-\lambda \left( t - T \right)}\nonumber \] Escreva um programa que solicite os dados de entrada adequados e informe a idade da amostra. A meia-vida do ${}_6C^{14}$ é 5730 anos, dando uma constante de decaimento de $\lambda = \ln (2) / 5730.0$ por ano.
  2. Escreva um programa que calcule a distância entre dos pontos com coordenadas (7,12) e (3,9). Use o fato de que a distância entre dois pontos que tem coordenadas $(x_1,y_1)$ e $(x_1,y_2)$ é $r = \sqrt{(x_1 - x_2)^2+(y_1 - y_2)^2}$. Depois de verificar manualmente que teu programa funciona, calcula a distância entre os pontos (-12,-15) e (22,5)
  3. A máxima altura que uma bola atinge quando é jogada para cima com uma velocidade inicial $v$ (em m/s) e um angulo em relação à horizontal de $\theta$ está dada por \[ h = \frac{\frac{1}{2} v^2 \sin^2 \theta}{9.8} \nonumber \] Escreva um programa que determine a máxima altura de uma bola que parte com velocidade $v=15 km/h$ e ângulo de $60.0^\circ$
  4. Um modelo para a população mundial em bilhões de pessoas para depois de 1990 está descrito pela equação \[ P = 5.5e^{0.02(A-1990)} \nonumber \] onde $P$ é a população mundial ao ano $A$. Usado essa equação estime a população mundial para o ano 2011.
  5. Escreva um programa que calcule o fator relativista \[ \gamma = \frac{1}{\sqrt{1-(\frac{v}{c})^2}} \nonumber \] para uma velocidade $v$, onde $c=2,99792458\times 10^8\,m/s$.
  6. Escreva um programa que solicite ao usuário um ângulo $\theta$ (em graus) e em seguida imprima o resultado da operação $\cos ^2 \theta + \sin ^2 \theta$ (Note que esse valor não necessariamente é $1.0$ dada a precisão do computador).
  7. Escreva um programa que imprima o resultado da substituição dos valores de $a$, $b$, $c$, $x$ no polinômio de II grau: $ax^2 + bx + c$. O programa deve informar ao usuário que dado vai ser digitado, por exemplo: Digite o coeficiente que acompanha o termo x ao quadrado. Como teste utilize os valores: $a=2.0$, $b=17.0$, $c=-12.0$, $x=1.3$
  8. O número de bacterias, $B$, em uma cultura que é refrigerada pode ser aproximada pela equação $B=3000000e^{-0.032t}$ onde $t$ é o tempo medido em horas. Escreva um programa que solicite ao usuário digitar o tempo e imprima o número de baterias correspondente a esse momento. A fim de testar calcule $B$ para $t = 212, 18, 24. 36. 48$ e $72$.
  9. Escreva um programa que calcule e imprima a quantidade de dinheiro $A$ disponível em $N$ anos dado um deposito inicial de $X$ reais na conta bancaria a qual paga um interesse anual de $R$ porcento. Utilize a relação $A=X(1.0+R/100)^N$. O programa deve solicitar ao cliente que digite os valores das constantes da equação. Aplique seu programa para calcular o dinheiro disponível nos seguintes casos
    1. R\$ 1000.0 investidos por 10 anos ao 8% de interesse.
    2. R\$ 1000.0 investidos por 10 anos ao 10% de interesse.
    3. R\$ 1000.0 investidos por 10 anos ao 12% de interesse.
    4. R\$ 5000.0 investidos por 15 anos ao 8% de interesse.
    5. R\$ 5000.0 investidos por 15 anos ao 10% de interesse.
    6. R\$ 5000.0 investidos por 15 anos ao 12% de interesse.
  10. A equação da curva normal (forma de sino) usada e aplicações de estatística é: \[ y = \frac{1}{\sigma \sqrt{2\pi}}e^{\frac{1}{2}(x-\mu)^2} \nonumber \] Utilizando essa equação e assumindo $\mu = 90$, $sigma = 4$, escreva um programa que calcule $y$ para um valor de $x$ que deve ser informado pelo usuário.
  11. Escreva um programa que solicite ao usuário as coordenadas de 2 vetores tridimensionais. Sobre esses vetores realize as operações básicas: soma, resta, produto vetorial e produto escalar e imprima os resultados na tela.
  12. Escreva um programa que um circulo passando por três pontos, determinados pelas coordenadas $(x_1,y_1)$, $(x_2,y_2)$ e $(x_3,y_3)$; o círculo resultante pode ser determinado pelo seu centro $(x_c,y_c)$ e o raio $R$. O programa também deve determina a distância $d$ entre um ponto $(x,y)$ e o ponto mais próximo em um determinado círculo dado pelo seu centro $(x_c,y_c)$ e o raio $R$. Uma saída tipica desse programa é a seguinte:
    [usuario@pclabfis: ]# python exercicio12
    Tres pontos de um circulo por favor:
    Um par (x,y) por favor: 3.14121356237 3.14121356237
    Um par (x,y) por favor: 0.38196601125 0.8244294954157
    Um par (x,y) por favor: 3.96013315568 1.60266133841
    Centro = (2, 2)
    Raio = 2
    Um par por favor: -0.12132034356 4.12132034356
    Distancia de (-0.12132, 4.12132) ao circulo = 1
    [usuario@pclabfis: ]#