Números de Fibonacci. f n = f n 1 + f n 2. A condição inicial é de que há um par no primeiro mês e dois pares no segundo mês: f 1 = 1, f 2 = 2

Documentos relacionados
Iteração e Pontos Fixos

NÚMEROS DE FIBONACCI E A MODELAGEM DE GENERALIZAÇÕES DA SEÇÃO ÁUREA

Funções - Primeira Lista de Exercícios

SCS Sistemas de Controle / Servomecanismos. Aula 01 Introdução ao software MATLAB

PÓS-GRADUAÇÃO PRESENCIAL MARINGÁ

Capítulo 10 Estruturas de controle de fluxo. Introdução ao MATLAB p.1/21

INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO MARANHÃO - CAMPUS CAXIAS. Aluno (s): 01 ATIVIDADE. Revisão de Conteúdo

Aula 05: - Recursão (parte 1)

Mini curso básico. Gilberto A. S. Segundo Fábio Carmo. Programa de Educação Tutorial

Recursão. Aula 1. Liana Duenha. Faculdade de Computação Universidade Federal de Mato Grosso do Sul

INE Fundamentos de Matemática Discreta para a Computação

MATLAB Avançado. Melissa Weber Mendonça

UNIVERSIDADE FEDERAL DO RIO DE JANEIRO DEPARTAMENTO DE CIÊNCIAS DA COMPUTAÇÃO. 4 a Lista de Exercícios Gabarito de algumas questões.

UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO CURSO: CIÊNCIA DA COMPUTAÇÃO. Prof.ª Danielle Casillo

Aula prática 5. Funções Recursivas

Gauss-Seidel para Solução de Sistemas com Matrizes Banda Usando Armazenamento Especial

Desafios de Programação

Funções - Terceira Lista de Exercícios

Técnicas de análise de algoritmos

Lista 1 - PMR2300. Fabio G. Cozman 3 de abril de 2013

Inteligência Computacional Aula 2 - Introdução ao MatLab Graduação /2

Aula 05: - Recursão (parte 1)

Informática no Ensino de Matemática Prof. José Carlos de Souza Junior

Sistemas de Equações Lineares

Relações de recorrência

BC1424 Algoritmos e Estruturas de Dados I Aula 03: Recursão / Recursividade

CÁLCULO NUMÉRICO. Profa. Dra. Yara de Souza Tadano

PROGRAMAÇÃO de COMPUTADORES: LINGUAGEM FORTRAN 90/95

Recursividade. Prof. Jesus José de Oliveira Neto

Estatística e Modelos Probabilísticos - COE241

Estatística e Modelos Probabilísticos - COE241

Introdução ao MATLAB. Parte 2

Algoritmo. Exemplo. Definição. Programação de Computadores Comparando Algoritmos. Alan de Freitas

Quarto projeto computacional (data de entrega: 05/06/17)

Introdução a Programação na Linguagem C.

INTRODUÇÃO À COMPUTAÇÃO - EPET006 -

Valdex Santos. 09 de junho de 2011

Foi criado em 1990 por pesquisadores do INRIA e da ècole Nationale des Ponts et Chaussées (França), sendo gratuito e similar ao Matlab.

Centro Federal de Educação Tecnológica de Minas Gerais Programa de Pós-Graduação em Modelagem Matemática e Computacional

Matemática Computacional

OS NÚMEROS DE FIBONACCI

Mat.Semana. PC Sampaio Alex Amaral Rafael Jesus. (Roberta Teixeira)

Prof. Natalia Castro Fernandes Mestrado em Telecomunicações UFF 2º semestre/2012

Minicurso de MATLAB. Programa de Educação Tutorial de Engenharia Elétrica. lmax Rodrigues. lcaroline Pereira. lnayara Medeiros

Introdução ao MATLAB. Parte II. Afonso Paiva ICMC-USP

Determinação de uma fórmula para calcular os termos de uma sequência de Fibonacci por meio de progressões geométricas e espaços vetoriais

Medida do Tempo de Execução de um Programa. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

SISTEMA DECIMAL. No sistema decimal o símbolo 0 (zero) posicionado à direita implica em multiplicar a grandeza pela base, ou seja, por 10 (dez).

Introdução à Ciência da Computação II. Recursão. Prof. Ricardo J. G. B. Campello

Olimpíadas de Informática Aulas preparatórias Introdução a Programação em C.

Fundamentos IV. Introdução a OCTAVE. Clarimar Coelho. Departamento de Computação. August 11, 2014

Universidade de São Paulo

Matemática Discreta - 06

CÁLCULO NUMÉRICO. Profa. Dra. Yara de Souza Tadano.

Modelagem Computacional. Parte 2 2

III Encontro de Educação, Ciência e Tecnologia

Estatística e Modelos Probabilísticos - COE241

Fundamentos de Programação

SCC Capítulo 2 Recursão

Programação II RECURSÃO

Instruções, dados e expressões

Exercícios: Arquivos

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA

Computação Científica com MATLAB. Melissa Weber Mendonça

Programação Estruturada

Interpolaça o Polinomial

Computação Científica com MATLAB. Melissa Weber Mendonça

Universidade Federal de Santa Maria Departamento de Matemática Curso de Verão Lista 2. Sequências de Números Reais

Estatística e Modelos Probabilísticos - COE241

Marcelo Keese Albertini Faculdade de Computação Universidade Federal de Uberlândia. 23 de Março de 2018

Minicurso de MATLAB. Programa de Educação Tutorial de Engenharia Elétrica 28/03/15. lmax Rodrigues. lcaroline Pereira.

ESTRUTURAS DE REPETIÇÃO - PARTE 2

ALGORITMOS AVANÇADOS UNIDADE II Recursividade. Luiz Leão

Modelo Matemático simples

Introdução ao Scilab 3.0 Parte 2

Complexidade de Algoritmos

MATLAB. Que é MATLAB?

CÁLCULO NUMÉRICO. Profa. Dra. Yara de Souza Tadano.

Modelagem com relações de recorrência. Exemplo: Determinada população dobra a cada ano; população inicial = 5 a n = população depois de n anos

Exercícios Repetição

Modelagem e Análise de Sistemas - COS767

5. SEQUÊNCIAS E SOMAS

É interessante comparar algoritmos para valores grandes de n. Para valores pequenos de n, mesmo um algoritmo ineficiente não custa muito para ser

Algoritmos e Programação. AULA 21: Recursividade UNIVERSIDADE FEDERAL DE PELOTAS CENTRO DE DESENVOLVIMENTO TECNOLÓGICO CIÊNCIA DA COMPUTAÇÃO

Hashing: conceitos. Hashing

Problema: Números Racionais

Breve Introdução à Programação em Scilab 6.0

Introdução à Programação Aula 07. Prof. Max Santana Rolemberg Farias Colegiado de Engenharia de Computação

ALGORITMOS E PROGRAMAÇÃO DE COMPUTADORES I. Trabalho 1 (T1)

Tópicos avançados sobre funções (cont.)

RESOLUÇÃO. Computação e Programação (2009/2010-1º Semestre) 1º Teste (11/11/2009) Nome. Número. Leia com atenção os pontos que se seguem:

Universidade Estadual de Campinas

Ambiente de Programação, rastreamento e entrada de dados. MCG114 Programação de Computadores I. Interpretador de Comandos. Interpretador de Comandos

Cálculo Numérico BCC760

Universidade Federal de Uberlândia - UFU Faculdade de Computação - FACOM Lista de exercícios de programação em linguagem Python

Tópicos de Matemática Elementar

Transcrição:

Números de Fibonacci Leonardo Pisano Fibonacci nasceu por volta de 1170 e morreu por volta de 1250 em Pisa, atualmente pertencente à Itália. Durante sua vida ele viajou pela Europa e pelo Norte da África, escreveu diversos textos matemáticos que, entre outras coisas, introduziu a Europa à notação Hindu-Arábica para os números. No seu livro mais famoso, Liber Abaci, publicado em 1202, ele apresenta o seguinte problema: "Um homem coloca um par de coelhos em um lugar cercado de muros por todos os lados. Quantos pares de coelhos podem ser produzidos a partir desse par em um ano supondo que todo mês cada par gera um novo par que pode se reproduzir dois meses depois?" Hoje, a solução desse problema é conhecida como sequência de Fibonacci ou números de Fibonacci. Os números de Fibonacci são bem famosos entre os matemáticos, existe até mesmo uma Fibonacci Association que publica um jornal chamado Fibonacci Quarterly. Se Fibonacci não tivesse estabelecido um mês até que os coelhos recém nascidos se tornassem férteis, ele não teria uma sequência com seu nome. Os número de pares simplesmente dobraria a cada mês, de forma que, após n meses, haveriam 2 n pares de coelhos. Seja f n o número de pares de coelhos após n meses. Um fator chave é que o número de coelhos no fim de um mês é o número de coelhos no início do mês mais o número de coelhos nascidos dos pares maduros: f n = f n 1 + f n 2 A condição inicial é de que há um par no primeiro mês e dois pares no segundo mês: f 1 = 1, f 2 = 2 A seguinte função do MATLAB, armazenada em um arquivo chamado fibonacci.m produz um vetor conto os primeiros n números de Fibonacci.

24 experimentos com matlab function f = fibonacci(n) % FIBONACCI Fibonacci sequence % f = FIBONACCI(n) generates the first n Fibonacci numbers. f = zeros(n,1); f(1) = 1; f(2) = 2; for k = 3:n f(k) = f(k 1) + f(k 2); Com as condições iniciais supracitadas, a resposta para a questão original de Fibonacci, sobre o tamanho da população de coelhos após um ano é dada por: fibonacci(12) O comando produz uma sequência: 1 2 3 5 8 13 21 34 55 89 144 233 Ou seja, a resposta é 233 pares de coelhos. A função fibonacci é um bom exemplo de como criar uma função no MATLAB. A primeira linha é function f = fibonacci(n) A primeira palavra da primeira linha diz que o arquivo fibonacci.m é uma função e não um script. O restante da primeira linha diz que essa função produz um resultado de saída, f, e recebe um argumento, n. O nome da função, especificado na primeira linha, não é utilizado, porque o MATLAB, porque o MATLAB procura pelo nome do arquivo.m onde a função está armazenada, de forma que é recomável que ambos os nomes sejam iguais; As duas linhas seguintes são comentários que são mostradas como ajuda quando você chama help. help fibonacci produz FIBONACCI Fibonacci sequence

números de fibonacci 25 f = FIBONACCI(n) generates the first n Fibonacci numbers. O nome da função aparece em letras maiúsculas porque, historicamente, o MATLAB foi case insensitive 3 porque rodava em terminais com apenas uma fonte. A linha seguinte f = zeros(n,1); 3 Uma linguagem case sensitive é uma linguagem que diferencia letras maiúsculas e minúsculas. Em uma linguagem case insensitive as funções fibonacci(n), FIBONACCI(n) ou FiBoNaCcI(n) são exatamente a mesma coisa. Cria uma matriz n 1 conto apenas zeros e a armazena em f. No MATLAB, uma matriz com apenas uma coluna é um vetor coluna e uma matriz com apenas uma linha é um vetor linha. As proximas duas linhas f(1) = 1; f(2) = 2; inserem as condições iniciais. ]As três linhas finais são um loop for que faz o trabalho de calcular a sequência: for k = 3:n f(k) = f(k 1) + f(k 2); Usualmente usamos espaços ou tabulação (Tab) para indentar o corpo de estruturas for e if. A função desenvolvida é similar ao que se faria em qualquer linguagem de programação. Ela produz um vetor, mas não utiliza nenhuma das operações em vetores e matrizes do MATLAB. A sequir está uma outra função fibonacci, fibnum.m, que retorna apenas o n-ésimo número de Fibonacci. function f = fibnum(n) % FIBNUM Fibonacci number. % FIBNUM(n) generates the nth Fibonacci number. if n <= 1 f = 1; else f = fibnum(n 1) + fibnum(n 2); O comando fibnum(12) produz ans = 233

26 experimentos com matlab A função fibnum é recursiva. O termo recursivo é usado tanto em matemática quanto em ciência da computação. Em matemática, a relação f n = f n 1 + f n 2 é uma relação recursiva. Em computação, uma função que chama ela mesma é uma função recursiva. Programas recursivos são elegantes, mas caros computacionalmente. Você pode medir p tempo utilizando tic e toc, tente fazer: tic, fibnum(24), toc Não tente fazer: tic, fibnum(50), toc Fibonacci encontra a Razão Áurea A Razão Áurea pode ser representada como um fração continuada infinita φ = 1 + 1 1 + 1 1+ 1 1+ 1 Para verificar essa afirmação, suponha que não conhecemos o valor dessa fração. Seja x = 1 + 1 1 + 1 1+ 1 1+ 1 Como podemos ver, o primeiro denominador é apenas uma cópia de x. Em outras palavras: Que, imediatamente, leva a: x = 1 + 1 x x 2 x 1 = 0 que é a equação utilizada para definir φ. Podemos definir um script para gerar uma string com os primeiros n termos da fração da Razão Áurea: p = '1'; for k = 2:n p = ['1 + 1/(' p ')']; display(p)

números de fibonacci 27 Começamos com um valor 1, que corresponde a n = 1. Após isso, repetidamente tornamos a string atual o denominador de uma nova string. Para n = 7 temos: 1 + 1/(1 + 1/(1 + 1/(1 + 1/(1 + 1/(1 + 1/(1)))))) Seja φ n a fração continuada truncada em n temos. Podemos expressar φ n como a razão de dois inteiros φ n = p n q n Podemos calcular p n e q n utilizando o seguinte script: p = 1; q = 0; for k = 2:n t = p; p = p + q; q = t; Podemos comparar o resultado do script para n = 7 com o resultado da função fibonacci(7). O script gera uma fração 21/13 enquanto o resultado da função termina com 13 e 21. Isso não é só uma coincidência, a fração continuada é obtida pela repetição do seguinte comando: p = p + q; enquanto os números de Fibonacci são gerados por: f(k) = f(k 1) + f(k 2); De fato, a fração da Razão Áurea truncada em n termos pode ser representada como: φ n = f n f n 1 Quando temos ao infinito, a razão entre dois números de Fibonacci consecutivos te à Razão Áurea: f n lim n f n 1 Para testar, calcule 40 números de Fibonacci: n = 40; f = fibonacci(n); Então, compute as razões:

28 experimentos com matlab r = f(2:n)./f(1:n 1) Esse comando pega o vetor conto f(2) até f(n) e divide, elemento por elemento, pelo vetor conto f(1) até f(n-1). A saída termina com: 1.61803398874990 1.61803398874989 1.61803398874990 1.61803398874989 1.61803398874989 Podemos notar que a população de coelhos, segundo Fibonacci, não dobra a cada mês, ela é multiplicada pela Razão Áurea a cada mês. Encontrando uma Expressão Analítica É possível encontrar uma solução fechada para a relação de recorrência dos números de Fibonacci. A chave é olhar pra soluções da seguinte forma: f n = cp n para certas constantes c e p, a relação f n = f n 1 + f n 2 se torna cp n = cp n 1 + cp n 2 Dividindo ambos os lados por cp n 2 temos: p 2 = p + 1 A solução dessa equação, já vista quando falamos da Razão Áurea, é φ e 1 φ; A solução geral pra essa recorrência é: f n = c 1 φ n + c 2 (1 φ) n As constantes c 1 e c 2 são determinadas a partir das condições iniciais: f 0 = c 1 + c 2 = 1, f 1 = c 1 φ + c 2 (1 φ) = 1. Resolvo esse sistema à mão temos: c 1 = φ 2φ 1

números de fibonacci 29 c 2 = (1 φ) 2φ 1 Inserindo o resultado na equação temos: f n = 1 2φ 1 (φn+1 (1 φ) n+1 ) O interessante dessa equação é que ela envolve potência e quocientes de números irracionais, mas gera como resultado números inteiros. Podemos verificar no MATLAB fazo: n = (1:40)'; f = (phi.^(n+1) (1 phi).^(n+1))/(2*phi 1) f = round(f) O operador.ˆ realiza uma operação de potenciação elemento por elemento; Não é necessário utilizar./ porque o denominador, (2*phi-1), é uma quantidade escalar. A função round converte números de ponto flutuante nos valores inteiros mais próximos 4. O resultado de f termina com: 5702887 9227465 14930352 24157817 39088169 63245986 102334155 165580141 4 Teoricamente, o resultado deveria ser um número inteiro, porém devido a erros de aproximação o resultado precisa ser aproximado para o valor inteiro mais próximo. Exercícios Os exercícios devem ser enviados por e-mail em um documento pdf com o código utilizado em cada exercício e uma análise escrita de cada solução 1. Quais números de Fibonacci são pares? Porque? 2. Use a função isprime para descobrir quais dos 40 primeiros números de Fibonacci são primos. 3. O comando semilogy(fibonacci(18),' o') gera um gráfico logarítmico dos números de Fibonacci pelo seu índice. O gráfico é aproximadamente linear. Qual é o coeficiente angular da linha? 4. O quanto o tempo de execução de fibnum(n) depe do tempo de execução de fibnum(n-1) e fibnum(n-2)? Obtenha uma função

30 experimentos com matlab que estime o tempo de execução de fibnum(n). Estime o tempo de execução de fibnum(50). 5. O que acontece se os coelhos morrerem após seis meses? A sequência seria: d n = 0, n 0 d 1 = 1 d 2 = 1 e, para n > 2 temos: d n = d n 1 + d n 2 d n 7 (a) Crie uma versão modificada de fibonacci.m e fibnum.m para essa sequência. (b) Quantos pares de coelhos haverão após 12 meses? (c) Aproxime d n por δ n. Quanto vale δ? (d) Estime quanto tempo será gasto para calcular fibnum(50) para essa sequência modificada.