Escolar Documentos
Profissional Documentos
Cultura Documentos
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
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
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
-------------------------------------------------------------
>> Exer12Pag64
Rendimento: 7000
Residência: continente
>> Exer12Pag64
Rendimento: 75000
Residência: Açores
resid=lower(resid);
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
-------------------------------------------------------------
-------------------------------------------------------------
%Resolução alternativa
else
error('Caracter não válido.')
end
>> Exer14Pag65
>> Exer14Pag65
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)
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])
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)
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;
-------------------------------------------------------------
ans =
2.8300
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
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.
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.
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.
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)
chaveOrd(7)=suplementar;
----------------------------------------------------------------------------------------------------------------------------- -------
totoloto(1,5,1,2008);
Chave: 6 8 14 33 34 37 + 25
Ordem Saída: 37 14 34 33 8 6 + 25
totoloto(2,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);
Chave: 7 21 24 40 45 47 + 39
Ordem Saída: 47 24 40 7 21 45 + 39
b)
function chavepremiada(aposta,chave)
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)
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)
chavepremiada([10 22 24 32 38 39],chave)
1.º prémio!!
chavepremiada([10 22 24 32 38 35],chave)
2.º Prémio.