[ANSI C] Funkcja zwraca wartości cosinus x wykraczające poza przedział (-1,1) przy rozwinięciu w szereg.
Jestem w trakcie pisania programu, który rozwija funkcję
y=cos(x+a), gdzie "a" i "x" są rzeczywiste, a pogram ma zliczać rzecz jasna sumę funkcji rozwiniętej w szereg. Zanim wkleję kod, podam tok mojego rozumowania przy podejściu do tematu:
1. Funkcja
cos przy rozwinięciu w szereg przechodzi przy obliczeniu pochodnej kolejno w
-sin,
-cos i
sin, po czym wraca do
cos. Implikuje to cztery przypadki i zastosowanie do każdego z nich pętli "for", a inkrementacja dla każdego
n będzie zwiększana o 4.
2. No dobra, zobaczymy czy pójdzie na elementarnych przypadkach. Najpierw w podanym przykładzie przetestowałem proste przykłady z silnią w fukncji
szereg. Grało wszystko, na różne wariacje, więc do funkcji "silnia" nie ma się (chyba) czego przyczepić.
3. Kłopot zaczął się przy uzupełnianiu funkcji szereg. Po uzupełnieniu funkcji do postaci poniżej zwracała ona nawet kosmiczne wartości przy niskich parametrach. Zacząłem kombinować jak się da, nawet dla potęgi zapisałem osobną funkcję.
Pytanie więc do doświadczonych użytkowników: gdzie popełniłem błąd w pisaniu kodu? Czuję, że pofanzoliłem coś z zasięgiem zmiennej, ale przy double problemów i rzutowaniu nań z inta problemów chyba być nie powinno. Poniżej prezentuję moje zapisy. Funkcję main skróciłem, bo zawiera ona instrukcje ograniczające liczbę punktów, w których ma zliczać, epsilon (nie podany niżej w funkcji
szereg, gdyż wiem jak to zrobić (aż się prosi o while lub do while), dlatego też nie chciałem rozdmuchiwać całego ekranu kodem. Bardzo bym prosił o ewentualne wskazówki. Sam sobie nie odpuszczę, jeżeli tego nie rozgryzę, w końcu to tylko maszyna, goddammit! ;]
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
double
double
double
double silnia( int );
double potega( double, int );
double szereg( double, int, double );
{
}
y = szereg( x, n, aa );
printf( "\n" );
system( "pause" );
return 0;
}
double silnia( int n )
{
int sln = 1;
int i;
if( n == 0 || n == 1 )
return 1;
else
for( i = 2; i <= n; i++ )
{
sln = sln * i;
}
return sln;
}
double potega( double x, int n )
{
return pow( x, double( n ) );
}
double szereg( double x, int nliczba, double a )
{
double sum1 = 0;
int n = 0;
for( n = 0; n <= nliczba; n = n + 4 )
{
sum1 = sum1 + cos( a ) *(( potega( x, n ) ) /( silnia( n ) ) );
}
n = 1;
double sum2 = 0;
for( n = 1; n <= nliczba; n += 4 )
{
sum2 = sum2 +( - 1 ) * sin( a ) *(( potega( x, n ) ) /( silnia( n ) ) );
}
double sum3 = 0;
n = 3;
for( n = 3; n <= nliczba; n += 4 )
{
sum3 = sum3 +( - 1 ) * cos( a ) *(( potega( x, n ) ) /( silnia( n ) ) );
}
double sum4 = 0;
n = 4;
for( n = 4; n <= nliczba; n += 4 )
{
sum4 = sum4 + sin( a )(( potega( x, n ) ) /( silnia( n ) ) );
}
return sum1 + sum2 + sum3 + sum4;
}