Computação e Programação Aula prática Nº 12 1 Funções em MatLab 1. Qual é a diferença entre um ficheiro de Script e uma função? 2. O que é o esquema de passagem por valor do MatLab e em que é que contribui para uma boa programção? 3. Se a variável array for um array de complexos, o que é que a função plot(array) executa? 4. O que é uma matriz esparsa? Em que é que difere de uma matriz completa? Como é que se converte uma matriz esparsa numa matriz completa e vice- versa? 5. Escreva em Matlab a função hyperbolic para calcular as funções seno hiperbólico, coseno hiperbólico e tangente hiperbólica, atendendo às seguintes definições: e x − e− x sinh( x ) = 2 e x + e −x cosh( x) = 2 e x − e− x tanh( x) = x e + e −x A função deve ter dois argumentos. O pimeiro argumento deverá ser uma string contendo o nome da função ‘sinh’, ‘cosh’, ou ‘tanh’, e o segundo argumento será o valor de x para o qual se quer avaliar a função. O ficheiro deve conter trés subfunções – sinh1, cosh1 e tanh1 – para efectual os calculos, e a primeira função deve deverá chamar a correcta subfunção dependendo do valor da string. Atenda à questão de um número incorrecto de argumetnos, e também de uma string incorrecta, em que neste caso deve devolver um erro (prob 5.12 – Chapman) 6. Escreva uma função que calcula os valores máximo e mínimo de uma função f(x) qualquer dentro de um deteminado intervalo. A função a ser avaliada deve ser passada como argumento. A função deve ter os seguintes argumentos de entrada: first_value – o primeiro valor do intervalo em x last_value – o último valor do intervalo em x num_steps – o número de passos func – o nome da função A função deve ter os seguintes argumentos de saída: xmin – O valor de x correspondente ao mínimo min_value – o mínimo valor de f(x) encontrado xmax – o valor de x correspondente ao máximo max_value – o máximo valor de f(x) encontrado Verifique se o número de argumentos de entrada é válido (prob 5.17 – Chapman) 92 Computação e Programação Aula prática Nº 12 7. Uma função é dita de recursiva se se chama a si própria. Para testar funções recursivas, escreva uma função em Matlab que calcula o factorial de um número N, sabendo que: N ( N − 1)! N ≥ 1 N! = 1 N =0 onde N é um inteiro positivo. A função deve testar se recebe apenas um argumento e se este é um inteiro não negativo, caso contrário devolverá um erro (Prob 5.23 – Chapman) 2 I/O com ficheiros em MatLab 8. Quais são as funções do MatLab que são utilizadas para abrir e fechar ficheiros. Qual é a diferença entre abrir um ficheiro binário e um ficheiro de texto? 9. Porque é que a função textread é especialmente útil para ler dados criados por programas escritos noutras linguagens? 10. Escreva o conjunto de instruções em MatLab, que permita a abertura de um ficheiro existente (myinput.dat) para acrescentar dados de texto. 11. Escreva uma instrução em MatLab que permita a abertura de um ficheiro não formatado para operação de leitura. Verifique se o ficheiro existe, caso não exista faça o output com uma mensagem de erro. 12. Geração de uma tabela de informação. Um boa forma para ilustrar a utilização da função fprintf, é gerar como saída uma tabela de dados. Escreva uma script file que face a inteiros no intervalo de 1 a 10, calcula a raiz quadrada, o quadrado e o cubo. Apresente os resultados numa forma tabular com o cabeçalho respectivo. (Ex 8.2 – Chapman) 13. Atenda à script file lsqfit.m, que faz o ajuste por mínimos quadrados a um conjunto (x,y) de entrada. Altere a leitura dos pares (x,y) utilizando a função load – ascii. Reescreva o programa usando, agora, textread como função de I/O. (Prob. 8.6 – Chapman) % % % % % % % % % % % % Script file: lsqfit.m Purpose: To perform a least-squares fit of an input data set to a straight line, and print out the resulting slope and intercept values. The input data for this fit comes from a user-specified input data file. Record of revisions: Date Programmer ==== ========== 01/22/04 S. J. Chapman Description of change ===================== Original code 93 Computação e Programação Aula prática Nº 12 % % Define variables: % count -- number of values read % filename -- Input file name % n -- Number of input data pairs (x,y) % slope -- Slope of the line % sum_x -- Sum of all input X values % sum_x2 -- Sum of all input X values squared % sum_xy -- Sum of all input X*Y values % sum_y -- Sum of all input Y values % x -- Input X values % x_bar -- Average X value % y -- Input Y values % y_bar -- Average Y value % y_int -- Y-axis intercept of the line % Initialize sums n = 0; sum_x = 0; sum_y = 0; sum_x2 = 0; sum_xy = 0; % Prompt user and get the name of the input file. disp('This program performs a least-squares fit of an'); disp('input data set to a straight line. Enter the name'); disp('of the file containing the input (x,y) pairs: ' ); filename = input(' ','s'); % Open the input file [fid,msg]=fopen(filename,'rt'); % Check to see if the open failed. if fid < 0 % There was an error-tell user. disp(msg); else % File opened successfully. Read the (x,y) pairs from % the input file. Get first (x,y) pair before the % loop starts. [in,count] = fscanf(fid,'%g %g',2); while ~feof(fid) x = in(1); y = in(2); n = n + 1; sum_x = sum_x + x; sum_y = sum_y + y; sum_x2 = sum_x2 + x.^2; sum_xy = sum_xy + x * y; % % Calculate % statistics % % % Get next (x,y) pair [in,count] = fscanf(fid,'%g %g',[1 2]); end % Close the file fclose(fid) % Now x_bar y_bar slope y_int calculate = sum_x / = sum_y / = (sum_xy = y_bar - the slope and intercept. n; n; - sum_x*y_bar) / (sum_x2 - sum_x*x_bar); slope * x_bar; 94 Computação e Programação Aula prática Nº 12 % Tell user. fprintf('Regression coefficients for the least-squares line:\n'); fprintf(' Slope (m) = %12.3f\n',slope); fprintf(' Intercept (b) = %12.3f\n',y_int); fprintf(' No of points = %12d\n',n); 14. Escreva um programa que lê um número arbitrário de valores reais, a partir de um ficheiro de dados especificado pelo utilizador. Arredonde os valores ao inteiro mais próximo, e escreva esse inteiro num ficheiro de saída especificado pelo utilizador. Certifique-se que o ficheiro de entrada existe, caso contrário, informe o utilizador e peça outro ficheiro de dados. Caso o ficheiro de saída exista, questione o utilizador se pretende apagá- lo, senão peça outro nome para o ficheiro de saída. (Prob 8.8 – Chapman) 15. Admita que tem uma quantia de dinheiro P numa conta a juros, depositada no seu banco. O banco paga os juros a uma taxa de i por cento ao ano. A quantidade de dinheiro que tem no banco após n meses, é dada pela seguinte equação: i F = P1 + 1200 n Onde F é o valor ao fim de n meses e i/12 é a percentagem mensal do racio de juros (o factor 100 no denominador converte para o racio de juros em percentagem). Escreva um programa em Matlab que lê um valor inicial de dinheiro P e a taxa anual i , e calcula e escreve numa tabela o o rendimento mensal durante cinco anos. Escreva também o resultado num ficheiro ‘interest’. (prob 8.11 – Chapman) 95 Computação e Programação Aula prática Nº 12 Funções em MatLab 1. Ficheiros Script são conjuntos de instruções de MatLab que são armazenadas num ficheiro. Os ficheiros Script partilham o worspace da janela de comandos, por isso qualquer variável criada no ambiente de trabalho antes de um Script ser utilizado estão disponíveis, e qualquer variável criada pelo Script continua a existir no ambiente de trabalho mesmo depois de o Script ter terminado a execução. 2. A passagem por valor no MatLab permite que uma cópia de cada argumento de entrada seja passada para dentro de uma função em vez de passar o argumento em si. Este esquema contribui para a prática de boa programação porque permite que dentro das funções seja possível modificar os valores dos argumentos de entrada das funções sem prejudicar os cálculos fora da função chamada. 3. A função plot(array) desenharia um gráfico com a parte imaginária versus a parte real do array, com a parte real no eixo dos xx e a parte imaginária no eixo dos yy. 4. Uma matriz esparsa é um tipo especial de matriz em a a memória só é alocada para os valores diferentes de zero. A memória é alocada para os valores e para a respectiva posição na matriz. As matrizes esparsas podem ser convertidas em matrizes completas utilizando a função full, e as matrizes completas podem ser transformadas em matrizes esparsas utilizando a função sparse. 5. Resolução (5.12) incluida no ficheiro solucoes_aula12.zip 6. Resolução (5.17) incluida no ficheiro solucoes_aula12.zip 7. Resolução (5.23) incluida no ficheiro solucoes_aula12.zip 3 I/O com ficheiros em MatLab 8. A função open é utilizada para abrir ficheiros e a função fclose é utilizada para fechar ficheiros. Nos PC’s (mas não em sistemas Linux ou UNIX) existe uma diferença entre o formato de um ficheiro de texto e um ficheiro binário. Para abrir ficheiros em modo de texto, um ‘t’ tem que ser acrescentado na string de permissão da função fopen. 9. A função textread é especialmente útil para ler dados criados por programas escritos noutras linguagens porque está desenhada para ler ficheiros ASCII que estejam formatados em colunas, onde cada coluna pode ser de tipo diferente. Esta função é muito útil para importar tabelas de dados guardadas por outros programas, uma vez que pode lidar com diferentes tipos de dados dentro do mesmo ficheiro. 10. fid = fopen(‘myinput.dat’, ‘at’) 96 Computação e Programação Aula prática Nº 12 11. fid = fopen(‘myinput.dat’, ‘r’) if fid<0; disp(‘O ficheiro input.dat não existe. ’); end 12. Resolução (8.2) incluida no ficheiro solucoes_aula12.zip 13. Resolução (8.6) incluida no ficheiro solucoes_aula12.zip 14. Resolução (8.8) incluida no ficheiro solucoes_aula12.zip 15. Resolução (8.11) incluida no ficheiro solucoes_aula12.zip 97