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 12. 10. 2010 18:47

Docctor
Zelenáč
Příspěvky: 15
Reputace:   
 

Cos nekonečnou řadou

ahoj programátoři,
snažím se spočítat fci Cos nekonečnou řadou ( samozžejmě někde končí :) ). Na papíře mi to funguje dobře, ale program pořád ne....můžete mi někdo říct proč ne ?? ( upozornění : do mých kodů programátoři většinou zvrací )


#include <stdio.h>
#include <iostream>

#define PRS 0.01
#define EXPLUS 2

using namespace std;

long double fakt(int a) { /*funkce pro výpočet faktorialu*/
            int e=1,f=1;
            while (e<a) {
                   e=e+1;
                   f=f*e;
                   }
            return f;
}     


long double mocnina_na(int zakl, int exponent) { /*funkce pro výpočet mocniny*/
    int pocet=2,vysledek=0;
    vysledek=zakl*zakl;
    while (pocet!=exponent) {
           vysledek=vysledek*zakl;
           pocet++;
           }   
    return vysledek;
}
   
   

int main() {
  long z,expo=2,pozice=1;
  float vypocet=1;
  long double dilci_vypocet=1;
 

  cout << "zadej cele cislo" << endl;
  cin >> z;
  while (dilci_vypocet>=PRS) {
        dilci_vypocet=(mocnina_na(z,expo)/fakt(expo));
        if ((pozice%2)==1) vypocet=vypocet-dilci_vypocet; /*podle definice když je pořadí prvku liché tak odčítám*/
        if ((pozice%2)==0) vypocet=vypocet+dilci_vypocet; /*když sudé tak přičítám*/
        pozice++;
        expo=expo+EXPLUS;         
        }
  cout << "COS " << z << "=" << vypocet << "\n";     
  system("PAUSE");
  return 0;
}


co myslíte ??

Offline

 

#2 12. 10. 2010 19:09 — Editoval LukasM (12. 10. 2010 20:01)

LukasM
Příspěvky: 3274
Reputace:   193 
 

Re: Cos nekonečnou řadou

↑ Docctor:
Ahoj. Sice se divím, že odpovídám v téhle sekci, ale někdo mně kdyžtak opraví.

Dalo by se vytknout, že z proměnných expo a pozice je jedna navíc, a možná by šlo vymyslet lepší podmínku ukončení cyklu (vypočítat nějaký ten zbytek nebo tak), ale jinak myslím že to celkem funguje. Co se ti na tom nezdá?

Pozor, ať si nepleteš stupně a radiány.


Edit: teď jsem si to ještě vyzkoušel, a vidím že jsem kecal, tak úplně v pořádku to není. Ačkoli funkce fakt a mocnina_na vrací long double, při výpočtu se používají proměnné typu int, takže pokud obsahuje řada více členů, může tam dojít k překročení rozsahu (což se ale nakonec, pokud počítáme hodnotu dostatečné vzdálenou od nuly, stane stejně).

Offline

 

#3 13. 10. 2010 08:11

Docctor
Zelenáč
Příspěvky: 15
Reputace:   
 

Re: Cos nekonečnou řadou

To LukasM :

Ono asi takhle, má to být s přesností na 6 desetiných míst. Jenže abych se k tomu dostal ak už při výpočtu x^18 / 18! pamět přeteče a je po výpočtu.
Snažil jsem se ten cyklus udělat podle vzorce z wiki  ( http://cs.wikipedia.org/wiki/Cosinus ) což se myslím asi i povedlo.
Proměnou počet si počítám pozici v řadě abych věděl když odčítat a kdy přičítat a expo si navyšuju exponent ( jestli to jde něak líp, asi ano...to je otázka optimalizace )

fce fakt by teoreticky mělo stacit aby vracela tyo long - předpokládám že to bude vždy celé číslo
fce mocnina_na ta je long double - do mocniny bych mel mít možnost nacpat jakýkoliv číslo.....

Bohužel však překladači se to nelíbí, kolidují si typy ( zlatý php :) )

Fakt nevím kde je zakopanej pes, asi to celý smažu a začnu znova... :(

Offline

 

#4 13. 10. 2010 17:26

LukasM
Příspěvky: 3274
Reputace:   193 
 

Re: Cos nekonečnou řadou

↑ Docctor:
Trochu jsem doufal, že se zapojí někdo kdo se v Cčku trochu vyzná, ale vzhledem k tomu že se tak nestalo, tak odpovím zas já.

Nevím kde kolidují typy, já jsem si rychle stáhnul DevC++ a přeložit se mi to povedlo. Problém vidím hlavně v tom, že proměnná vysledek ve funkci mocnina a proměnná f ve funkci fakt jsou typu int (vadí to ne až tak kvůli celočíselnosti, ale kvůli rozsahu).

K té optimalizaci expo a pozice - je snad jasné, že když expo zvyšuješ v každém cyklu o 2 a pozici o 1, tak platí expo=pozice*2, ale to je detail.

Jinak ale pokud budeš počítat hodnotu té funkce třeba v bodě z=1000 rad, nebo prostě někde daleko od nuly, tak by ta řada musela obsahovat ohromné množství členů, protože takhle daleko od nuly bude konvergovat strašně pomalu, a jejich výpočet pak bude problematický. Řešením by snad mohlo být odečíst si od zadané hodnoty z takový násobek $2\pi$, abychom se nule co možná nejvíc přiblížili, ale nezkoušel jsem to (resp. matematicky to jde určitě, ale naprogramovat jsem to nezkoušel, ani tu ten překladač teď nemám). Šlo by využít i jenom ten první interval od nuly do $\pi$.

Bylo by ale fajn, kdyby sem přispěl i nějaký opravdový programátor.

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson