Tópicos Especiais, Prof. Dr.Ing. Jorge Centeno - UFPR

Exercício 01 - Primeiros passos

Neste exercício usaremos a linguagem Python para criar e manipular imagens.
usando PYzo Usando Colab

Por favor, verifique se o Winpy está instalado no seu computador. Se não, obtenha uma copia do site oficial PYZO

Usando Colab: Crie uma conta Google e entre no COLAB

abra o PYZO. Você terá uma tela com um prompt ">>" esperando comandos para interação. Você pode usar os ícones na barra superior para alterar o diretório de trabalho ou usar os comando no prompt.

Você tem duas opções: "código", ou "texto", use texto para comentários e códigopara partes do programa

No editor de textos, crie um programa com as seguintes linhas:
		  
a=5 
b=4  
c= a + b 
print(c)

  	

Salvar e rodar o programa

usando PYzo Usando Colab

Agora salve seu programa em seu diretório de trabalho, por exemplo com o nome "prog001.py". Para isto, mude o nome do arquivo. Verifique se ele foi criado na pasta selecionada

Mude o nome "rename" de seu programa. Deve estar como Unttled. Renomeie para "prog001.py". Ele será armazenado em seu Google Drive

Para rodar o programa: pode teclar "run" ou control+Shift+E.

Acionar a tecla play (triângulo)

Para isto, mude o nome do arquivo. Verifique se ele foi criado (no Drive, se você está usando o COLAB).
usando PYzo Usando Colab

veja a resposta na área interativa logo abaixo!

Agora, altere o valor de "a" ou de "b" e rode o programa de novo.

parte 2

Bem, parece que você já está programando algo. Vamos criar dois vetores (com numpy que serve para manipular arrays) e plotar um gráfico, usando matpotlib (biblioteca de plotagem matemática).

Passos:

		  
import numpy as np
import matplotlib.pyplot as plt  

 # definir dois vetores x e y  
x=[0, 50, 60, 80, 90, 100]
y=[0, 0, 1, 1, 0 , 0]

 # plotar o gráfico x vs y  
plt.plot(x,y)
plt.show()
 # ou com legenda...  
plt.plot(x,y, label='X vs Y')
plt.legend()
plt.show()
  	

É muito prático ler dados de um arquivo ASCII. Vamos então escrever uma série de linhas que permitem ler dados de um arquivo no disco (pode ser seu diretório, ou no google drive.

Opção 1, usando Pyzo.
		  
 import numpy as np
# ler uma tabela com 2 linhas contendo 9 numeros cada uma 
Nlinhas=2	# aqui defino o nro de linhas e colunas da tabela 
Ncolunas=9
T = np.zeros((Nlinhas, Ncolunas),dtype = float) # criamos tabela vazia  
f = open(‘tabela1.txt', 'r') # abrir arquivo

cl=0                 	 	 # um contador de linhas
for line in f:            	 # varrer linhas no arquivo
   cc=0;   		 	 # um contador de colunas
   for n in line.split(','):  #varrer elementos da linha lida
      a=float(n)            # converter em float e armazenar em T(cl, cc)
      T[cl,cc]=a
      cc=cc+1
   cl=cl+1
f.close()

   	

Opção 2, usando COLAB.
		  
 import numpy as np
import matplotlib.pylab as plt 
from google.colab import drive  # isto serve para usar  o drive 

drive.mount('/content/gdrive')  # montar seu drive como um disco virtual 

# ler uma tabela com 2 linhas contendo 9 numeros cada uma  
Nlinhas=2	 # aqui defino o nro de linhas e colunas da tabela 
Ncolunas=9
T = np.zeros((Nlinhas, Ncolunas),dtype = float) # criamos tabela vazia   
f = open('gdrive/My Drive/tabela1.csv', 'r')  

cl=0                 	 		 # um contador de linhas 
for line in f:            		 # varrer linhas no arquivo 
   cc=0   		 			 # um contador de colunas 
   for n in line.split(','):     #varrer elementos da linha lida 
      a=float(n)                 # converter em float e armazenar em T(cl, cc) 
      T[cl,cc]=a
      cc=cc+1
   cl=cl+1
f.close()
print(T)
 # separar X e Y, cada um em uma linha ...  
x=T[0,:]
y=T[1,:]
plt.plot(x,y, color=‘red’)
plt.show()


   	

Está gostando? vamos juntar os conhecimentos. Crie um arquivo com duas linhas (duas variáveis) contendo a temperatura dos últimos 15 dias, pro exemplo. Leia estes dados e plote como gráfico.

Podemos combinar os valores, somar, dividir, etc., variando os elementos dos vetores.
		  
 # combinar duas variáveis, por exemplo, uma tangente
tg= x    # copia x, para ter um vetor de saida
tg[0]=0    # mudamos primeiro elemento
for i in range(1,9):    # calculamos para cada elemento (de 1 a 8 (9-1) )
   dx=x[i]-x[i-1]
   dy=y[i]-y[i-1]
   tg[i]=dy/dx
plt.plot(tg, color='yellow')
plt.show()

   	

Exercício 01b - Balanço hídrico simples

Considere um balanço hídrico simples, onde desejamos calcular o volume da reserva de água no solo:

  • P = ETR + EX + DR

    Onde:

    1. P = precipitação em mm;
    2. ETR = evapotranspiração real em mm;
    3. EX = excedente de água (escoamento e infiltração);
    4. DR = variação da reserva de água utilizada pelas plantas.

    Considerando que em final de setembro o reservatório estava vazio, calcule a variação da reserva de água ao longo do ano, dado...

    Elabore um programa em Python que leia o arquivo de entrada contendo estes dados em 3 linhas e no final mostre um gráfico com a reserva calculada para cada mês.

    mes OUT NOV DEZ JAN FEV MAR ABR MAI JUN JUL AGO SET
    evapotranspiração potencial 114 99.2 102 100 87.6 93.5 83 63.9 59 55 75 80
    Precipitação 31.7 107.7 272.7 175.4 220.7 138.6 66.1 0.0 0.0 30.0 0.0 0.0
    Excedente de água 0 0 13.3 16.5 43.3 17.2 0 0 0 0 0 0

    Passos:

  • Primeiro: Importamos algumas bibliotecas (import)
  • depois, ler a tabela de dados (crie uma antes)
  • separe as variáveis
  • mostre um gráfico com estas entradas, usaremos subplot para criar sub-figuras.

    		  
    
    import numpy as np
    import matplotlib.pyplot as plt
    # ler uma tabela com 3 linhas contendo 12 dados (mensais)   
    Nlinhas=3 		 # aqui defino o nro de linhas e colunas da tabela 
    Ncolunas=12
    T = np.zeros((Nlinhas, Ncolunas),dtype = float) 	 # criação de tabela vazia
    f = open('gdrive/My Drive/dadosbalanco.txt', 'r')   # abrir arquivo 
    cl=0 		# um contador de linhas 
    for line in f: 	# varrer linhas no arquivo 
       cc=0  
       for n in line.split(' ‘):  
          a=float(n)  # converter em float e armazenar em T(cl, cc) 
          T[cl,cc]=a
          cc=cc+1   # incrementar linha para o seguinte elemento 
       cl=cl+1 # incrementar linha para seguinte conjunto de elementos 
    f.close() # fechar arquivo  
    
     # Separar as variáveis , uma variável em cada linha ...
    ETX=T[0,:]
    P=T[1,:]
    Q=T[2,:]
     #mostrar as entradas 
    sub1 = plt.subplot(3,1,1)
    plt.plot(ETX, label='ETX')
    plt.legend()
    sub2 = plt.subplot(3,1,2)
    plt.plot(P, label='P')
    plt.legend()
    sub3 = plt.subplot(3,1,3)
    plt.plot(Q, label='Q')
    plt.legend()
    plt.show()
    
      	

    continuando... Vamos calcular o balanço mesmo

    		  
    
    DR= [0 for x in range(12)]
     # calcular reserva como R(i)=R(i-1) +P -ETX - Q 
    meses=12
    for i in range(0,meses):
    	if i==0:
    		DR[i]=P[i]-ETX[i]-Q[i]
    	else:
    		DR[i]=DR[i-1]+P[i]-ETX[i]-Q[i]
    plt.plot(DR, label='DR', color=‘red')
    plt.legend()
    plt.xlabel('meses')
    plt.ylabel('DR em mm')
    plt.show()
    
      	

    tarefa

    agora, vamos ler uma imagem colorida, localizada no mesmo local, e separar as três imagens das cores básicas R, G, e B. Sabemos que a imagem preto e granco pode ser obtida somando as três imagens, melhor, calculando a média, para poder armazenar em 8 bits.

    Como não pode existir DR<0, por favor modifique o código para que, quando seja calculado um valor negativo de DR, o valor armazenado seja RD=0.

    Também deve incluir um “alerta” e imprimir uma mensagem quando o armazenamento for maior que 300. print(‘Armazenamento’, DR[i], ‘no mês’, i)

    		  
    114 99.2 102 100 87.6 93.5 83 63.9 59 55 75 80
    31.7 107.7 272.7 175.4 220.7 138.6 66.1 0.0 0.0 30.0 0.0 0.0
    0 0 13.3 16.5 43.3 17.2 0 0 0 0 0 0
       	

    Copyright © 2022
    Jorge Centeno: centeno@ufpr.br