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 = P1 +

 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
Download

Funções e I/O com ficheiros em Matlab