Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 22. 10. 2010 23:09

lander
Příspěvky: 54
Reputace:   
 

Matlab - Fibonacciho postupnost

Napište program, který nalezne 83 člen Fibonacciho posloupnosti $(f_n)^\infty_n_=_1$, která
je de nována vztahem $f_n_+_2 = f_n_+_1 + f_n; f_1 = 1; f_2 = 1$.
Nemate niekto skusenosti ako riesit taketo pripady?
Dakujem za kazdu pomoc..

Offline

  • (téma jako vyřešené označil(a) gladiator01)

#2 22. 10. 2010 23:25 — Editoval piiity (22. 10. 2010 23:33)

piiity
Příspěvky: 43
Reputace:   
 

Re: Matlab - Fibonacciho postupnost

↑ lander:
Toto jsem pred davnem resil. Existuji 2 zpusoby jak to naprogramovat (1) rekurzivne - docela slozite pro tenhle pripad nebo (2) smyckami
Umim jen c++, tak ti to napisu v tom
#include <iostream>
int pocitej(int pozice);
using namespace std;
int main()
{
       int vysledek,pozice = 83;
       vysledek = pocitej(pozice);
       cout <<"Fibonacciho cislo je" << vysledek;
       return 0;
}
int pocitej(int x)
{
        int minusDruhy = 1, minusPrvni = 1, vysledek = 1;
        if ( x < 3)
         return 1;
        for ( x -= 3; x; x--;)
        {       
        minusDruhy = minusPrvni;
        minusPrvni = vysledek;
        vysledek = minusPrvni + minusDruhy;
        }
        return vysledek;
}

Offline

 

#3 23. 10. 2010 17:21

lander
Příspěvky: 54
Reputace:   
 

Re: Matlab - Fibonacciho postupnost

Fuha,snazil som sa to pochopit ale C++ som ani nevidel,moc tomu nerozumiem.Ale dakujem za ochotu;-)

Offline

 

#4 23. 10. 2010 18:51

gladiator01
Místo: Jindřichův Hradec
Příspěvky: 1587
Škola: ZČU FAV - SWI
Pozice: absolvent
Reputace:   53 
Web
 

Re: Matlab - Fibonacciho postupnost

↑ piiity:
Jseš si jistý, že ti to funguje správně?


Naděje jako svíce jas, potěší srdce štvané, čím temnější je noční čas, tím zářivěji plane.
VIVERE - MILITARE EST (Seneca)
Vím, že nic nevím. - Sokrates

Offline

 

#5 23. 10. 2010 19:36

vojta01
Příspěvky: 63
Reputace:   
 

Re: Matlab - Fibonacciho postupnost

Existují 3 způsoby výpočtu:

1) rekurzivně - pomalé

int Fib(int cislo)
{
    if(cislo < 3) // 1 a 2
       return 1;
    else
       return Fib(cislo-1)+Fib(cislo-2); // rekurzivně spočítá předchozí dvě fib. čísla, která se také spočítají rekurzivně atd...
}

2) pamatuji si vždy 2 předchozí Fibonaciho čísla, pomocí nich vytvořím třetí

int c1=1, c2=1, c3;

for(int i=3; i<=hledane_cislo; i++)
{
     c3 = c1+c2; // výpočet dalšího fib. čísla
     c1 = c2;
     c2 = c3;      // tyto 2 řádky zajišťují přesun hodnot proměnných, ve kterých jsou hodnoty posledních 2 fib. čísel
}

po výpočtu bude v c2 i c3 hledaná hodnota fib. čísla


3) nejrychlejší je použít vzorec na výpočet n-tého fib. čísla, který se dá získat diferenčními rovnicemi, nelekněte se těch odmocnin (sqrt):

int Fib = (((1+sqrt(5))/2)^N-((1-sqrt(5))/2)^N)/sqrt(5)

odkaz na vzorec: http://sustek.wz.cz/vzorce/004.png

Offline

 

#6 24. 10. 2010 13:15 — Editoval piiity (24. 10. 2010 13:30)

piiity
Příspěvky: 43
Reputace:   
 

Re: Matlab - Fibonacciho postupnost

↑ gladiator01:
Omlouvám se skutečně tam byly chyby.

Code:

#include <iostream>
double pocitej(int pozice);
using namespace std;
int main()
{
       double vysledek;
       int pozice;
       cout << "Zadejte pozici: ";
       cin >> pozice;  //zadani pozice
       vysledek = pocitej(pozice); //tato hodnota se preda funkci pocitej
       cout <<"Fibonacciho cislo je" << vysledek; //vypise vysledek
       system("PAUSE");
       return 0;
}
double pocitej(int x)
{
        double minusDruhy = 1, minusPrvni = 1, vysledek = 2;  //nastaveni pocatecnich hodnot
        if ( x < 3)  // testovani jestli je x mensi jak 3, tak vrati vysledek 1
         return 1;
        for ( x -= 3; x; x--)
        {       
        minusDruhy = minusPrvni;
        minusPrvni = vysledek;
        vysledek = minusPrvni + minusDruhy;
        }
        return vysledek;
}

pocatecni pozice: minusDruhy a minusPrvni = 1 a jako odpoved je logicky 2, potom ve for smycce snizime hodnotu x o "-3", protoze prvni dve cisla uz zname z pocatecni pozice. Pro kazde cislo pak postupuje tak, ze vlozime hodnotu minusPrvni do minusDruhy a hodnotu vysledeku do minusPrvni. Novy vysledek je pak soucet techto cisel a zaroven se snizi x o "1". Takhle pokracujeme dokud nedosahne x "0". Potom zobrazi odpoved.
Vyuzival jsem vzorec na http://www.math.rutgers.edu/~erowland/fibonacci.html   , kde si take muzete zkontrolovat spravnost odpovedi.

Edit: zmena int na double

Offline

 

#7 24. 10. 2010 14:17 — Editoval gladiator01 (24. 10. 2010 16:09)

gladiator01
Místo: Jindřichův Hradec
Příspěvky: 1587
Škola: ZČU FAV - SWI
Pozice: absolvent
Reputace:   53 
Web
 

Re: Matlab - Fibonacciho postupnost

Nejjednoduší bude tedy asi použít ten vzorec: Zadáš toto:

Code:

N=83
vysledek=((1+sqrt(5))^N-((1-sqrt(5))^N))/((2^N)*sqrt(5))

Zkus to, já teď nemam k dispozici matlab, ale je to tak primitivní, že by to mnělo fungovat.

Nebo zkusím přepsat některý z předchozích postupů.


Naděje jako svíce jas, potěší srdce štvané, čím temnější je noční čas, tím zářivěji plane.
VIVERE - MILITARE EST (Seneca)
Vím, že nic nevím. - Sokrates

Offline

 

#8 24. 10. 2010 15:21

Stýv
Vrchní cenzor
Příspěvky: 5710
Reputace:   215 
Web
 

Re: Matlab - Fibonacciho postupnost

já bych se trochu obával zaokrouhlování při práci s desetinnými čísly... v octave jsem podle vzorečku dostal nepřesný výsledek

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson