Funkcja obliczająca sin(x)

Awatar użytkownika
Harry Xin
Użytkownik
Użytkownik
Posty: 545
Rejestracja: 9 sie 2007, o 19:15
Płeć: Mężczyzna
Podziękował: 148 razy
Pomógł: 83 razy

Funkcja obliczająca sin(x)

Post autor: Harry Xin »

Opracować funkcję, która oblicza sumę n pierwszych wyrazów szeregu przybliżającego wartość sin(x) dla x typu rzeczywistego. Przyjąć, że x oraz n są argumentami funkcji.

\(\displaystyle{ S(x,n)= \frac{x^{1}}{1!}- \frac{x^{3}}{3!}+ \frac{x^{5}}{5!} - \frac{x^{7}}{7!}+... \frac{x^{(2i-1)}}{(2i-1)!}+...}\)

Wartości zmiennej i są liczbami naturalnymi (i=1, 2, 3, ...). Porównać wartość funkcji S(x,n) dla wybranych x i n (np.x=2; n=8) z wartością standardowej funkcji sin(x). Da dużych n powinno być \(\displaystyle{ sin(x) S(x,n)}\). Prototyp funkcji: double S(double x, int n).

No i cóż. W poleceniu jest x=2 i n=8 jako przykład. A wtedy już wyskakuje się poza zakres zmiennych. Nie wiem jak temu zaradzić. ;/

Kod: Zaznacz cały

#include<iostream.h>
#include<conio.h>
#include<math.h>

double S(double x, int n);

void main()
{
 clrscr();

 double x;
 int n;
 cout << "
Podaj x: ";
 cin >> x;

 pobierz:
  cout << "Podaj n: ";
  cin >> n;

 if(n<0)
  {
   cout << "Blad! Liczba wyrazow nie moze byc ujemna!" << endl;
   goto pobierz;
  }

 cout << "Wartosc sumy wynosi: " << S(x,n) << endl;
 cout << "Wartosc standardowej funkcji sin(x) wynosi: " << sin(x);

 cin.ignore(cin.rdbuf()->in_avail());
 cin.get();
 clrscr();
}

double S(double x, int n)
{
 long double S=0,silnia=1;

 if(x)
  {
   for(int i=1,znak=1;i<=n;i++)
    {
     silnia*=(2*i-1);
     if(silnia>1) silnia*=(2*i-2);

     if(znak)
      {
       S+=pow(x,silnia)/silnia;
       znak=0;
      }
     else
      {
       S-=pow(x,silnia)/silnia;
       znak++;
      }
  }
 }

 return S;
}
ad_min
Użytkownik
Użytkownik
Posty: 1
Rejestracja: 7 gru 2008, o 02:22
Płeć: Mężczyzna
Lokalizacja: Warszawa
Pomógł: 1 raz

Funkcja obliczająca sin(x)

Post autor: ad_min »

zamiast

Kod: Zaznacz cały

S+=pow(x,silnia)/silnia;
powinienes miec

Kod: Zaznacz cały

S+=pow(x,2*i-1)/silnia;
(analogicznie dla S-=...)

a przy okazji, to 'silnia' nie musi być typu long double....dla niej moze byc typ calkowitoliczbowy (np. long int)
Xitami

Funkcja obliczająca sin(x)

Post autor: Xitami »

Kod: Zaznacz cały

a=x;
x2=x*x; 
S=0;
for(i=1; i<=n; i+=2){
	a= -a*x2/(i*i+i);
	s+= a;
}
--------------------------------------- powinno być raczej

Kod: Zaznacz cały

a=x;
x2=x*x;
s=x;
for(k=1; k<n; k++) {
      i=2*k+1;
      a= -a*x2/(i*i-i);
      s+= a;
}
ODPOWIEDZ