Baixe o app para aproveitar ainda mais
Prévia do material em texto
Universidade Federal de Itajubá - Campus de Itabira ENGENHARIA DE CONTROLE E AUTOMAÇÃO 12 de setembro de 2021 ATIVIDADE 01 - ECOI04 Larissa Gabriela Xavier Clemente - RA: 2020012414∗ E-mail: larissagxc@unifei.edu.br Resumo— Oferecendo a oportunidade dos alunos utilizarem conceitos sobre arquivos em C/C++, programação de funções multimodais, gráficos em Python, escrita de artigos em LaTeX, além de promover a integração entre linguagens (C/C++ e Python), o desenvolvimento da Atividade 01, proposta pelo prof. Sandro Izidoro Carvalho, para a turma 03 da disciplina ECOi04 - Algoritmos e Estrutura de Dados I, será apresentado o longo deste documento. Palavras-chave — Manipulação de Arquivos, C/C++, Python, Funções Multimodais 1 Introdução Inseridas em um amplo campo de estudo, as fun- ções multimodais possuem várias inflexões em sua su- perf́ıcie, caracterizando múltiplos pontos de mı́nimo ou máximo e, portanto, sendo definida como uma função-objetivo, isto é, que deve ser minimizada por um algoritmo de otimização. A otimização, por sua vez, é definida como a busca da melhor solução para um dado problema den- tro de um conjunto finito ou infinito de posśıveis solu- ções. O processo de busca pode partir de uma solução inicial ou de um conjunto delas, realizando melhora- mentos progressivos até chegar a um outro conjunto que contenha uma ou todas as melhores soluções pos- śıveis dentro do espaço de busca (OLIVEIRA, 2001). Sem estender para o entendimento do processo de otimização, o objetivo desta atividade é aplicar conceitos de programação para gerar o gráfico de uma dada função multimodal. 2 Referencial Teórico Nesta seção, serão apresentados brevemente os conceitos utilizados, abrangendo as áreas de manipu- lação de arquivos em C/C++ e gráficos em Python, bem como a integração entre essas linguagens, além de alguns comandos básicos necessários para o desen- volvimento da atividade. 2.1 Manipulação de Arquivos Os arquivos – files – são, geralmente, definidos como estruturas organizadas, armazenadas e mani- puladas em um dispositivo de memória secundária, sendo lidos ou escritos por um programa. Em C++, o conceito se estende para dispositivos de entrada e sáıda, sendo os arquivos tratados como um stream, isto é, um fluxo de caracteres. 2.1.1 Comandos e Funções em C/C++ A partir da inclusão da biblioteca fstream, é per- mitido o uso de comandos e funções necessários para a leitura de um arquivo, bem como para salvar os dados obtidos em um segundo arquivo de sáıda, conforme so- licitado. Assim, a manipulação dos arquivos em C++, parte da estipulação do tipo do fluxo seguido da de- finição de uma variável qualquer para manipular esse fluxo e, por fim, têm-se a associação de um arquivo com a variável, através de uma função open. Os fluxos podem ser dados como de entrada - in- put filestream - ou de sáıda - output filestream - e as variáveis serão declaradas a partir destes tipos, con- forme apresentado abaixo. Vale destacar que o Có- digo 1 não é funcional, sendo apenas um modo de ilustrar determinadas funções de linhas de código es- senciais para a manipulação dos arquivos. Código 1: Comandos de fluxo para manipulação de arquivos. 1 #include <fstream > // biblioteca necess ária 2 3 ifstream arq_entrada; // declara uma vari ável para controlar o fluxo de entrada 4 ofstream arq_saida; // declara uma vari ável para controlar o fluxo de sa ı́da 5 arq_entrada.open("arquivo.txt"); //abre o arquivo indicado se ele existir 6 arq_entrada.close(); // fecha o arquivo 7 arq_saida.open("arquivo2.txt"); //cria um arquivo com este nome se ele n~ao existir ou atualiza as informa ç~oes contidas nele 8 arq_saida.close(); // fecha o arquivo Outros comandos e funções podem ser integra- dos ao código para realizar a manipulação desejada, como, por exemplo, a leitura linha a linha pelo uso do .getline, incluso na biblioteca padrão como função membro do objeto de entrada. 2.1.2 Comandos e Funções em Python Com funções semelhantes às indicadas para C++, abaixo são apresentadas as principais linhas de có- digo necessárias para a manipulação de arquivos em Python, sendo dispostas de forma ilustrativa. Código 2: Comandos para manipulação de arquivos em Python 1 arql = open(’arquivo1.txt’, ’r’) #abre um arquivo para leitura 2 cont = arql.readlines () #lê o conte údo do arquivo 3 4 arqe = open(’arquivo2.txt’, ’w’) #abre um arquivo para escrita 5 arqe.write() #escreve conte údo no arquivo 6 7 arquivo.close() #fecha o arquivo O formato de arquivo denominado CSV (Comma Separated Values) é o formato de importação e expor- tação mais comum para planilhas e bancos de dados, sendo utilizado para o desenvolvimento deste traba- lho, cuja forma de leitura estará especificada a seguir: Código 3: Leitura de arquivo de extensão .csv 1 import csv #biblioteca necess ária para manipula ç~ao de arquivo csv 2 3 csv.reader(open("arquivo.csv", "r"), delimiter=",") #sele ç~ao de leitor csv antes da abertura do arquivo // o delimitador pode variar de acordo com o conte údo do arquivo 2.2 Gráficos em Python Aplicados em diversas áreas de estudos, os gráfi- cos são representações visuais de um conjunto de in- formações facilitando a análise de dados ao proporci- onar uma impressão mais ágil e viva do fenômeno em questão, o que favorece a compreensão do comporta- mento e tendência dos dados. Dentre os diversos tipos de gráficos, têm-se a plo- tagem de superf́ıcie – representação tridimensional de um conjunto de dados – que descreve uma relação funcional entre duas variáveis independentes X e Y e uma variável dependente designada Z, ao invés de mostrar os pontos de dados individuais, criando uma topologia para a superf́ıcie a ser visualizada. 2.2.1 Matplotlib OMatplotlib é uma biblioteca para a visualização de dados em Python que apresenta uma API orien- tada a objetos que permite a criação de gráficos em 2D de uma forma simples e com poucos comandos, auxiliando a biblioteca matemática NumPy. A ferra- menta disponibiliza diversos tipos de gráficos, como em barra, em linha, em pizza, histogramas entre ou- tras opções. Para a criação de gráficos utiliza-se o módulo Py- Plot e, para a plotagem 3d, é preciso importar o pa- cote de ferramentas Mplot3d, incluso no Matplotlib. Para utilizá-los é necessário fazer a importação: Código 4: Importação do módulo PyPlot do Matplotlib 1 import matplotlib.pyplot as plt Código 5: Importação do pacote de ferramentas Mplot3d 1 from mpl_toolkits import mplot3d Existem outras maneiras de criar gráficos com esta e outras bibliotecas do Python e, com opções mais complexas e com outros módulos, é posśıvel criar gráficos ainda mais sofisticados. 3 Metodologia A atividade foi dividida em quatro tarefas: • Tarefa 1: Implementar uma rotina em C/C++ para importar os dados do arquivo disponibili- zado no SIGAA (nome do arquivo: arq01.txt); • Tarefa 2: Implementar uma função multimodal em C/C++ (Função 1) utilizando os dados do arquivo aberto na Tarefa 1; f(x, y) = x · y · sin (x) · sin (y) (1) • Tarefa 3: Implementar uma rotina em C/C++ para salvar em um arquivo os dados gerados a partir da Tarefa 2; • Tarefa 4: Implementar uma rotina em Python para importar os dados salvos pela rotina da Ta- refa 3 e gerar um gráfico com esses dados. Assim, o seu desenvolvimento está disposto em duas etapas: sabendo que as Tarefas 1, 2 e 3 pode- riam ser desenvolvidas em um mesmo programa, estas serão apresentadas conjuntamente em 3.1 - Rotina em C/C++, enquanto a Tarefa 4 estará disposta em 3.2 - Rotina em Python. 3.1 Rotina em C/C++ Seguindo os conceitos apresentados anteriormente na seção 2, foi desenvolvido o Código 6, cujas funções aplicadas estão devidamente comentadas para com- preensão adequada do que foi realizado na rotina. Código 6: Rotina em C/C++1 /* 2 Cr é ation: mercredi , 8 septembre 2021 3 Atividade 01 - ECOi04 - Tarefas 01 a 03 4 Larissa Gabriela Xavier Clemente (2020012414) 5 */ 6 7 #include <fstream > 8 #include <stdlib.h> 9 #include <cmath > 10 #include <iostream > 11 using namespace std; 12 13 /* 14 * fun ç~ao para troca de vı́ rgulas para pontos 15 */ 16 void trocav(char v[3]) 17 { 18 int i; 19 for (i = 0; i < 3; i++) 20 { 21 if (v[i] == ’,’) 22 v[i] = ’.’; 23 } 24 } 25 26 /* 27 * fun ç~ao multimodal 28 */ 29 void multimodal(double f[101][101] , double *x , double *y) 30 { 31 for (int i = 0; i < 101; i++) 32 { 33 for (int j = 0; j < 101; j++) 34 f[i][j] = (x[i] * y[j]) * (sin(x[ i])) * (sin(y[j])); // realiza a opera ç~ao para cada valor de x e cada valor de y, de acordo com a fun ç~ao 1 35 } 36 } 37 38 int main() 39 { 40 double x[101], y[101]; 41 double f[101][101]; 42 char linha [255]; 43 44 ifstream arq_entrada; // define nome do comando para leitura de arquivos 45 ofstream arq_saida; // define nome do comando para um arquivo de sa ı́da dos dados 46 47 arq_entrada.open("arq01.txt"); //lê o arquivo dado pela atividade 48 49 if (arq_entrada.is_open ()) 50 { 51 int l = 0; 52 while (arq_entrada.getline(linha , 255)) 53 { 54 trocav(linha); 55 x[l] = atof(linha); 56 y[l] = atof(linha); 57 l++; 58 } 59 } 60 else 61 { 62 cout << "Impossivel abrir o arquivo." ; 63 arq_entrada.close(); 64 } 65 66 multimodal(f, x, y); // implementa a fun ç~a o para os valores de x e y do arq01.txt 67 68 arq_saida.open("resultados_funcao.csv"); // cria um arquivo .csv se n~ao houver , sobrescreve um arquivo de mesmo nome se j á existir 69 70 // transfere os resultados obtidos para um novo arquivo .csv (101 x101) 71 for (int i = 0; i < 101; i++) 72 { 73 for (int j = 0; j < 101; j++){ 74 if (j==100) // evita cé lulas vazias no arquivo dos resultados para cada linha 75 arq_saida << f[i][j]; 76 else 77 arq_saida << f[i][j] << ", "; // uso de vı́ rgula para separar os valores 78 } 79 if (i<100) 80 arq_saida << endl; // evita linha vazia ao final do arquivo 81 } 82 83 arq_saida.close(); 84 85 return 0; 86 } Após executar a rotina em C/C++ conforme ori- entado, foi gerado um arquivo de extensão .csv com os resultados para a função multimodal dada pela Fun- ção 1, totalizando 10201 valores para f(x, y), tomado como z, haja vista que o arquivo“arq01.txt”dado para a realização da atividade, continha 101 valores para x e 101 valores para y. 3.2 Rotina em Python Tendo em mãos o arquivo“resultados funcao.csv” com os valores necessários para o desenvolvimento da Tarefa 4, aplica-se os conceitos apresentados anterior- mente nas seções 2.1.2 e 2.2, realizando a rotina em Python, demonstrada no Código 7. Código 7: Rotina em Python 1 #Cr é ation: mercredi , 8 septembre 2021 2 #Atividade 01 - ECOi04 - Tarefa 04 3 #Larissa Gabriela Xavier Clemente (2020012414) 4 5 from mpl_toolkits import mplot3d 6 import numpy as np 7 import matplotlib.pyplot as plt 8 import csv 9 10 #declara ç~ao dos dados 11 #linspace (s, f, n): distribui n valores entre um ponto de partida s e um ponto de parada f de modo uniforme. 12 x = np.linspace(6, 16, 101) 13 y = np.linspace(6, 16, 101) 14 z = np.array(list(csv.reader(open(" resultados_funcao.csv", "r"), delimiter=" ,"))).astype("float") #os dados estavam sendo lidos como string , precisando de um comando para repassar os valores como float 15 16 X, Y = np.meshgrid(x,y) 17 Z = z 18 19 ax = plt.axes(projection=’3d’) #define a proje ç~ao 3d 20 ax.plot_surface(X,Y,Z, cmap = ’hot’) #plota o gr áfico da superf ı́cie 21 22 #Informa ç~oes do gr áfico: tı́tulo e valores para os eixos 23 ax.set_title(’Tarefa 04 - Gr áfico da Fun ç~ao Multimodal ’) 24 ax.set_xlabel(’x’) 25 ax.set_ylabel(’y’) 26 ax.set_zlabel(’z’) 27 28 plt.show() Durante a declaração dos dados x e y, não foi re- alizada a leitura do arquivo“arq01.txt”, como feito na primeira etapa desta atividade. A alternativa encon- trada foi a aplicação da função linspace que, a partir de um dado ponto inicial e de parada, assim como a quantidade de valores, distribui os dados uniforme- mente em uma matriz NumPy, ou seja, retorna nú- meros espaçados de modo uniforme em um intervalo. Dessa forma, a função em questão torna muito mais prática a visualização de dados e declaração de eixos durante a plotagem. 4 Resultados Ao final da atividade, obteve-se a Figura 1, refe- rente à plotagem de um gráfico 3D a partir da função multimodal dada em Função 1. Figura 1: Imagem gerada ao final da Atividade 01 5 Referências 3D Surface plotting in Python using Matplotlib. ln: GeeksforGeeks. 30 abr. 2020. Dispońıvel em: https://www.geeksforgeeks.org/3d-surface-plotting- in-python-using-matplotlib/. Acesso em: 08 set 2021. Arquivos. In: Bac004. Dispońıvel em: http://bac004.wikidot.com/arquivos. Acesso em: 06 set. 2021. CSV File Reading and Writing. In: The Python Standard Library. Dispońıvel em: https://docs.python.org/3/library/csv.html. Acesso em: 09 set. 2021. LIMA, Stefani. Visualização de dados 3D em Python. 01 ago. 2018. Dispońıvel em: https://stefanilima.com.br/2018/08/01/visualizacao- de-dados-3d-em-python/. Acesso em: 11 set. 2021. OLIVEIRA, A. C. M. Algoritmos Evolutivos para Problemas de Otimização Numérica com Variáveis Reais. Monografia de Exame de qua- lificação CAP/INPE, 2001. Dispońıvel em: http://www.lac.inpe.br/∼lorena/monografia- alexandre.pdf. Acesso em: 11 set. 2021.
Compartilhar