Você está na página 1de 22

Proposta de resolução de alguns exercícios das páginas 60 a 69 do texto de apoio

Matemática Computacional I

Exercicio 4

function int=int_aleat(a,b)
%
%int_aleat Gera um inteiro aleatório entre a e b (inclusivé).
%
%Parâmetros de entrada: a e b - números inteiros, sendo a<b.
%Parâmetro de saída: int - número inteiro entre a e b.
%
%Exercício 4, página 61

if a>b
disp('o intervalo indicado [a,b] não está bem definido.')
return
else
int=randi([a b]);
end

-------------------------------------------------------------

int_aleat(2,6)

ans =
6

int_aleat(2,6)

ans =
5

int_aleat(10,30)

ans =
10

int_aleat(10,30)

ans =
27
Exercicio 7

%Script com nome Exer7Pag61


%Exercício 7, página 61
%

disp(' ');

for k=1:7
disp([num2str(k), ' Hellow world']);
end

disp(' ');

for k=1:4
disp([num2str(k), ' Hellow world ', num2str(k+4), ' Hellow world']);
end

disp(' ');

for k=1:2:7
disp([num2str(k), ' Hellow world ', num2str(k+1), ' Hellow world']);
end

disp(' ');

-------------------------------------------------------------

Exer7Pag61

1 Hellow world
2 Hellow world
3 Hellow world
4 Hellow world
5 Hellow world
6 Hellow world
7 Hellow world

1 Hellow world 5 Hellow world


2 Hellow world 6 Hellow world
3 Hellow world 7 Hellow world
4 Hellow world 8 Hellow world

1 Hellow world 2 Hellow world


3 Hellow world 4 Hellow world
5 Hellow world 6 Hellow world
7 Hellow world 8 Hellow world
Exercicio 12

%Scrip com nome Exer12Pag64


%Exercício 12, página 64
%

rend=input('\n Rendimento: ');


resid=input('\n Residência: ','s');

resid=lower(resid);

if rend<4544
switch resid
case 'continente'
taxa=10.5;
case 'madeira'
taxa=8.5;
case 'açores'
taxa=8.4;
otherwise
fprintf('\n Residência não existente.')
end
elseif rend>=4544 && rend<6873
switch resid
case 'continente'
taxa=13.0;
case 'madeira'
taxa=11.0;
case 'açores'
taxa=10.4;
otherwise
fprintf('\n Residência não existente.')
end
elseif rend>=6873 && rend<17043
switch resid
case 'continente'
taxa=23.5;
case 'madeira'
taxa=22.0;
case 'açores'
taxa=18.8;
otherwise
fprintf('\n Residência não existente.')
end
elseif rend>=17043 && rend<39197
switch resid
case 'continente'
taxa=34.0;
case 'madeira'
taxa=32.5;
case 'açores'
taxa=27.2;
otherwise
fprintf('\n Residência não existente.')
end
elseif rend>=39197 && rend<56807
switch resid
case 'continente'
taxa=36.5;
case 'madeira'
taxa=36.0;
case 'açores'
taxa=29.2;
otherwise
fprintf('\n Residência não existente.')
end
elseif rend>=56807 && rend<61260
switch resid
case 'continente'
taxa=40.0;
case 'madeira'
taxa=39.0;
case 'açores'
taxa=32.0;
otherwise
fprintf('\n Residência não existente.')
end
else
switch resid
case 'continente'
taxa=42.0;
case 'madeira'
taxa=41.0;
case 'açores'
taxa=33.6;
otherwise
fprintf('\n Residência não existente.')
end
end

fprintf('\n Taxa de IRS a aplicar em 2007: %4.1f \n', taxa);

-------------------------------------------------------------

>> Exer12Pag64

Rendimento: 7000

Residência: continente

Taxa de IRS a aplicar em 2007: 23.5

>> Exer12Pag64

Rendimento: 75000

Residência: Açores

Taxa de IRS a aplicar em 2007: 33.6


Exercicio 12 (resolução alternativa)

%Scrip com nome Exer12Pag64


%Exercício 12, página 64
%

rend=input('\n Rendimento: ');


resid=input('\n Residência: ','s');

resid=lower(resid);

taxas=[10.5 8.5 8.4;13.0 11.0 10.4;23.5 22.0 18.8;34.0 32.5 27.2;


36.5 36.0 29.3; 40.0 39.0 32.0 ; 42.0 41.0 33.6];

if rend<4544
lin=1;
elseif rend>=4544 && rend<6873
lin=2;
elseif rend>=6873 && rend<17043
lin=3;
elseif rend>=17043 && rend<39197
lin=4;
elseif rend>=39197 && rend<56807
lin=5;
elseif rend>=56807 && rend<61260
lin=6;
else
linha=7;
end

switch resid
case 'continente'
col=1;
case 'madeira'
col=2;
case 'açores'
col=3;
otherwise
fprintf('\n Residência não existente.\n');
return
end

fprintf('\n Taxa de IRS a aplicar em 2007: %4.1f \n', taxas(lin,col));


Exercicio 14

%Script com nome Exer14Pag65


%Exercício 14, página 65
%

letra=input('\nEscreva uma letra: ','s');

if length(letra)==1 && isletter(letra)


if any(strcmpi(letra,{'a','e','i','o','u'}))
disp('Vogal');
else
disp('Consoante');
end
else
disp('Caracter não válido.')
end

-------------------------------------------------------------
-------------------------------------------------------------

%Resolução alternativa

letra=input('\nEscreva uma letra: ','s');

if length(letra)==1 && isletter(letra)


letra=lower(letra);
switch letra
case {'a','e','i','o','u'}
disp('Vogal');
otherwise
disp('Consoante');
end

else
error('Caracter não válido.')
end

%Ver isstrprop, ischar, isspace,...


%Ver também any e all
-------------------------------------------------------------

>> Exer14Pag65

Escreva uma letra: A


Vogal

>> Exer14Pag65

Escreva uma letra: b


Consoante
Exercicio 15

function s=isinteger1(n)

%Exercício 15
% isinteger1 Testa se um número é inteiro.

s=(fix(n)==n);
-------------------------------------------------------------

isinteger1(12)
ans =
1

isinteger1(10.0)
ans =
1

isinteger1(10.3)
ans =
0

Exercicio 18

function s=somaprog(r,n)
%
% Exercício 18, página 65
%
% somaprog soma de uma progressão geométrica
%
% Parâmetros de entrada: r - razão (número real)
% n - número de termos a somar
% (inteiro positivo)
% Parâmetros de saída: s - soma dos n termos da progressão geométrica
% de razão r.

if nargin==1
n=20;
end

s=sum(r.^(0:n));
-------------------------------------------------------------
format long

somaprog(0.5,10)

ans =
1.999023437500000

somaprog(0.5,20)
ans =
1.999999046325684
somaprog(0.5)

ans =
1.999999046325684

somaprog(0.5,100)

ans =
2

Exercicio 25

function teste=lados(a,b,c)

%lados Verifica se existe um triângulo cujas medidas são os três


% números dados.
%
%Parâmetros de entrada: a,b e c - números reais.
%Parâmetros de saída: teste - valor lógico 0 ou 1.
%
%Exercício 25, página 66

if a<b+c && b<a+c && c<a+b


teste=1;
else
teste=0;
end
%ou, simplesmente, teste=(a<b+c && b<a+c && c<a+b);

if teste
num=length(unique([a b c]));
switch num
case 1
disp('Triângulo equilátero.')
case 2
disp('Trângulo isósceles.')
case 3
disp('Triângulo escaleno')
end
end
-------------------------------------------------------------
lados(3,4,5)

Triângulo escaleno
ans =
1

lados(3,3,7)

ans =
0
Exercicio 26

function triangulo(p1,p2,p3)
%
%triangulo Desenha o triângulo com vértices nos pontos p1, p2 e p3.
%
%Parâmetros de entrada: p1, p2 e p3 devem ser arrays de comprimento 2,
com a abcissa e a ordenanda de cada ponto.
%

abcissas=[p1(1),p2(1),p3(1)];
ordenadas=[p1(2),p2(2),p3(2)];

X=[abcissas;ordenadas;ones(1,3)];

if rank(X)<3
error('Os pontos não definem um triângulo.')
end

abcissas(4)=p1(1);
ordenadas(4)=p1(2);

plot(abcissas,ordenadas)

-------------------------------------------------------------
triangulo([1 2],[4,5],[3,6])

triangulo([1 2],[1,5],[1,6])

??? Error using triangulo (line 12)


Os pontos não definem um triângulo.
Exercicio 29

function m= reverso(n)
% reverso Calcula o número reverso de n.
%
m=0;
while n~=0
m=10*m+mod(n,10);
n=fix(n/10);
end

-------------------------------------------------------------

reverso(23456)

ans =
65432

reverso(1000)

ans =
1

Exercicio 30

function m=iscapicua(n)
% iscapicua Verifica se um número n é ou não capicua.
%
%Parâmetro de entrada: número natural n
%Parâmetro de saída: m=1 se n é capicua; m=0 se n não é capicua.

m=(reverso(n)==n);
-------------------------------------------------------------

iscapicua(323)

ans =
1

iscapicua(532235)

ans =
1

iscapicua(532)

ans =
0
Exercicio 33

function mp=mediapesada(x,w)

%mediapesada Cálculo da média pesada.


%
%Parâmetros de entrada: x e w - vetores com a mesma dimensão.
%Parâmetros de saída: mp - média pesada
%
%Exercício 33, página 68

if length(x)~=length(w)
error('Erro: os vetores x e w não têm a mesma dimensão.')
end

if any(w<0)
error('Erro: pelo menos um peso é negativo.')
end

somaw=sum(w);

if somaw==0
error('A soma dos pesos é zero.')
end

mp=sum(x.*w)/somaw;

-------------------------------------------------------------

mediapesada([1 2 2.2 3.4 5],[0.1 0.15 0.3 0.3 0.15])

ans =
2.8300

mediapesada([1 2 2.2 3.4 5],[0.1 0.15 0.3 0.3])

??? Error using mediapesada (line 11)


Erro: os vetores x e w não têm a mesma dimensão.

mediapesada([1 2 2.2 3.4 5],[0.1 0.15 0.3 0.3 -0.15])

??? Error using mediapesada (line 15)


Erro: pelo menos um peso é negativo.
Exercicio 34
a)

function f=fib2(n)
%
%FIB Cálculo de números de Fibonacci.
% F1=1;
% F2=1;
% F(k)=F(k-1)+F(k-2), k>2
%
%
%Parâmetro de entrada: n - número natural (n>=1)
%Parâmetro de saída: f – vetor linha com os números de Fibonacci
% até à ordem n
%
% Algoritmo iterativo.

f(1)=1;

if n>1
f(2)=1;
end

for k=3:n
f(k)=f(k-1)+f(k-2);
end

-------------------------------------------------------------

fib2(10)

ans =
1 1 2 3 5 8 13 21 34 55

b)

format long;
NumFib51=fib2(51);
Ratios50=NumFib51(2:end)./NumFib51(1:end-1);
Ratios50'

ans =
1.000000000000000
2.000000000000000
1.500000000000000
1.666666666666667
1.600000000000000
1.625000000000000
1.615384615384615
1.619047619047619
1.617647058823529
1.618181818181818
1.617977528089888
1.618055555555556
1.618025751072961
1.618037135278515
1.618032786885246
1.618034447821682
1.618033813400125
1.618034055727554
1.618033963166706
1.618033998521803
1.618033985017358
1.618033990175597
1.618033988205325
1.618033988957902
1.618033988670443
1.618033988780243
1.618033988738303
1.618033988754323
1.618033988748204
1.618033988750541
1.618033988749648
1.618033988749989
1.618033988749859
1.618033988749909
1.618033988749890
1.618033988749897
1.618033988749894
1.618033988749895
1.618033988749895
1.618033988749895
1.618033988749895
1.618033988749895
1.618033988749895
1.618033988749895
1.618033988749895
1.618033988749895
1.618033988749895
1.618033988749895
1.618033988749895
1.618033988749895

c)

(1+sqrt(5))/2

ans =
1.618033988749895

Sim, os resultados obtidos em b) ilustram a convergência das razões para o número de ouro. A partir do
termo 38 já temos uma aproximação com 15 casas decimais corretas.
Exercicio 36

a)

function lista=sucVida(n)
%
%Exercício 36, pag. 68, a)
%
%SucVida Gera a sequência de números apresentada no exercício 36.
%
%Parâmetro de entrada: n - número inteiro (n>=1)
%Parâmetro de saída: lista - vetor linha com a sequência de
% números gerada para o valor inicial n

lista(1)=n;
i=2;
while n>1
if rem(n,2)==0
sn=n/2;
else
sn=3*n+1;
end
lista(i)=sn;
i=i+1;
n=sn;
end

end

----------------------------------------------------------------------------------------------------------------------------- -------

sucVida(22)

ans =
Columns 1 through 11
22 11 34 17 52 26 13 40 20 10 5
Columns 12 through 16
16 8 4 2 1

sucVida(10)

ans =
10 5 16 8 4 2 1

sucVida(15)

ans =
Columns 1 through 11
15 46 23 70 35 106 53 160 80 40 20
Columns 12 through 18
10 5 16 8 4 2 1
b)
function [lista, comp]=sucVida2(n)
%
%Exercício 36, pag. 68, b)
%
%SucVida2 Gera a sequência de números apresentada no exercício 36
% com indicação do número de elementos nessa sequência.
%
%Parâmetro de entrada: n - número inteiro (n>=1)
%Parâmetros de saída: lista - vetor linha com a sequência de
% números gerada para o valor inicial n;
% comp – número de elementos da sequência.
%

lista(1)=n;
i=2;
while n>1
if rem(n,2)==0
sn=n/2;
else
sn=3*n+1;
end
lista(i)=sn;
i=i+1;
n=sn;
end

comp=length(lista);

end

----------------------------------------------------------------------------------------------------------------------------- -------

[elems num]=sucVida2(10)

elems =
10 5 16 8 4 2 1
num =
7

[elems num]=sucVida2(50)

elems =
Columns 1 through 14
50 25 76 38 19 58 29 88 44 22 11 34 17 52
Columns 15 through 25
26 13 40 20 10 5 16 8 4 2 1
num =
25
c)
clear vidaN

vidaN(1)=1;

for n=2:30
[elems num]=sucVida2(n);
vidaN(n)=num;
end

vidaN

vidaN =
Columns 1 through 11
1 2 8 3 6 9 17 4 20 7 15
Columns 12 through 22
10 10 18 18 5 13 21 21 8 8 16
Columns 23 through 30
16 11 24 11 112 19 19 19

plot(1:30,vidaN,'bo')
title('Sucessão do Problema de Collatz')
ylabel('Vida de n')
xlabel('n')
Exercicio 35

Ver o exemplo da função com algoritmo não recursivo para gerar o


número de Fibonacci de ordem n, contruída nas aulas.

function f=fib(n)
%FIB Cálculo do número de Fibonacci de ordem n.
% Algoritmo iterativo.
%
%Parâmetro de entrada: n - número natural (n>=1)
%Parâmetro de saída: f - número de Fibonacci de ordem n
%

f1=1;
f2=1;
f=1; % Para o caso de n=1 ou n=2

for k=3:n
f=f1+f2;
f1=f2;
f2=f;
end

----------------------------------------------------------------------------------------------------------------------------- -------

function P=Legendre(n,x)
%
%Legendre Calcula o valor do polinómio de Legendre de grau n em x.
%
%Parâmetros de entrada: n - grau do polinómio (n>=0);
% x – número real;
%Parâmetros de saída: P - valor do polinómio de Legendre em x.

% Algoritmo não recursivo

if n==0
P=1;
elseif n==1
P=x;
else
P0=1;
P1=x;
for k=2:n
P=((2*k-1)*x*P1-(k-1)*P0)/k;
P0=P1;
P1=P;
end
end

------------------------------------------------------------------------------------------------------------------------------------
x=linspace(-1,1,50);

y0=ones(1,50);
y1=x;

for k=1:50
y2(k)=Legendre(2,x(k));
y3(k)=Legendre(3,x(k));
y4(k)=Legendre(4,x(k));
y5(k)=Legendre(5,x(k));
end

plot(x,y0,x,y1,x,y2,x,y3,x,y4,x,y5)
legend('Legendre grau 0', 'Legendre grau 1','Legendre grau 2','Legendre grau
3','Legendre grau 4','Legendre grau 5','Location','southoutside')
Observação: podemos vetorizar a função Legendre e evitar o ciclo for na resolução anterior.

Vetorização da função Legendre.

function P=Legendre2(n,x)
%
% Legendre Calcula o valor do polinómio de Legendre de grau n em x.
% Versão vetorizada.
%
%Parâmetros de entrada: n - grau do polinómio (n>=0);
% x - vetor de números reais.
%Parâmetros de saída: P - valor do polinómio de Legendre em x.

% Algoritmo não recursivo.

nx=length(x);
if n==0
P=ones(1,nx);
elseif n==1
P=x;
else
P0=ones(1,nx);
P1=x;
for k=2:n
P=((2*k-1)*x.*P1-(k-1)*P0)/k;
P0=P1;
P1=P;
end
end

----------------------------------------------------------------------------------------------------------------------------- -------

x=linspace(-1,1,50);

y0=ones(1,50);
y1=x;

y2=Legendre2(2,x);
y3=Legendre2(3,x);
y4=Legendre2(4,x);
y5=Legendre2(5,x);

plot(x,y0,x,y1,x,y2,x,y3,x,y4,x,y5)
legend('Legendre grau 0', 'Legendre grau 1','Legendre grau 2','Legendre grau
3','Legendre grau 4','Legendre grau 5','Location','southoutside')
Exercicio 37

a)

function chaveOrd=totoloto(num,dia,mes,ano)

%TOTOLOTO Simula a extração do Totoloto.


%
%Parâmetros de entrada: num - número do concurso (inteiro positivo)
% dia,mes,ano - data do concurso
% (inteiros positivos)
%Parâmetro de saída: chaveOrd - chave ordenada
% (array com sete números)
%
% Exercício 37, página 69, a)
%

%Como podem aparecer números repetidos,gera-se uma chave até ocorrerem


7 números distintos (tenta-se no máximo 1000 vezes).
for k=1:1000
chave=randi([1 49],1,7);
if length(unique(chave))==7
break;
end
end

suplementar=chave(7); %número suplementar


chaveOrd=sort(chave(1:6));

fprintf('\n Totoloto Concurso: %02i/%4i Data do sorteio:


%02i/%02i/%4i \n\n',num,ano,dia,mes,ano);

%conversão do array chaveOrd numa string


chaveOrdStr=sprintf('%4i ', chaveOrd);
fprintf('Chave: %s + %4i\n\n', chaveOrdStr, suplementar)

chaveStr=sprintf('%4d ', chave(1:6));


fprintf('Ordem Saída: %s + %4i\n', chaveStr, suplementar)

chaveOrd(7)=suplementar;

----------------------------------------------------------------------------------------------------------------------------- -------

totoloto(1,5,1,2008);

Totoloto Concurso: 01/2008 Data do sorteio: 05/01/2008

Chave: 6 8 14 33 34 37 + 25

Ordem Saída: 37 14 34 33 8 6 + 25

totoloto(2,22,12,2017);

Totoloto Concurso: 02/2017 Data do sorteio: 22/12/2017

Chave: 11 13 17 29 37 48 + 25

Ordem Saída: 48 17 29 11 37 13 + 25

totoloto(3,29,12,2017);

Totoloto Concurso: 03/2017 Data do sorteio: 29/12/2017

Chave: 7 21 24 40 45 47 + 39

Ordem Saída: 47 24 40 7 21 45 + 39
b)
function chavepremiada(aposta,chave)

%chavepremiada Indica se uma chave de Totoloto é premiada ou não.


%Parâmetros de entrada: aposta - array com 6 números
% chave - chave extraída
%
% Exercício 37, página 69, b)

suplementar=chave(7);
nacertos=sum(ismember(aposta,chave(1:6)));
switch nacertos
case 6
disp('1.º prémio!!');
case 5
if ismember(suplementar,aposta)
disp('2.º Prémio')
else
disp('3.º Prémio')
end
case 4
disp('4.º prémio');
case 3
disp('5.º prémio');
otherwise
disp('Chave não premiada.')
end
------------------------------------------------------------------------------------------------------------------------------------

chave=totoloto(2,22,12,2017)

Totoloto Concurso: 02/2017 Data do sorteio: 22/12/2017

Chave: 10 22 24 32 38 39 + 35

Ordem Saída: 38 39 10 24 22 32 + 35

chave =
10 22 24 32 38 39 35

chavepremiada([3 5 10 12 15 7],chave)

Chave não premiada.

chavepremiada([10 22 24 32 38 39],chave)

1.º prémio!!

chavepremiada([10 22 24 32 38 35],chave)

2.º Prémio.

Você também pode gostar