Rozwinięcie funkcji cos x w szereg.

0

Witam. Mam problem z pewnym programem w C, który potrzebuję napisać na zaliczenie. Otóż, program ma za zadanie obliczyć rozwinięcie funkcji cos x w dany szereg. Sporą część kodu już napisałem, lecz ciągle borykam się z problemami, z których największym jest samo zakodowanie szeregu. Będę wdzięczny za rady i wskazówki.
Wzór szeregu znajduje się pod tym adresem: https://www.dropbox.com/s/wvqis2r29idjkts/szereg.jpg

#include <stdio.h>
#include <math.h>
     
    int main()
    {
            double a, b, x, y, eps, n, dx, fun() ;
            unsigned long silnia(int) ;
            FILE *plik;
            do
            {
     
                    printf ("Program oblicza rozwiniecie wzoru cos x\nPodaj poczatek przedzialu: ");
                    scanf ("%lf", &a); //wprowadzamy poczatek przedzialu
                    if (a < 0)
                    {
                            printf ("Wartosc spoza dziedziny\n Podaj inna wartosc: ");
                    }
                    printf ("Podaj koniec przedzialu: "); //wprowadzamy koniec przedzialu
                    scanf ("%lf", &b);
                    if (b < 0)
                    {
                            printf ("Wartosc spoza dziedziny\n Podaj inna wartosc: ");
                            scanf ("%lf", &b);
                    }
                    if (a == b)
                    {
                            printf ("Poczatek przedzialu nie moze byc taki sam jak jego koniec\n");
                    }
                    if (a > b)
                    {
                            printf ("Poczatek przedzialu nie moze byc wiekszy od jego konca\n");
                    }
            }while (a >= b);
     
            printf ("Podaj ilosc podzialow: "); //podajemy ilosc podzialow
            scanf ("%lf", &n);
            while (n <= 0)
            {
                    printf ("Ilosc podzialow musi byc wieksza od zera\nPodaj nowa ilosc podzialow: ");
                    scanf ("%lf", &n);
            }
     
            printf ("Podaj dokladnosc: ");
            scanf ("%lf", &eps);
     
                    dx = (b-a)/n;
                    plik = fopen ("wynik", "w"); //otwarcie pliku
                    for (x=a; x<=b; x=x+dx)
                    {
                            y = fun(x, eps); //wywolanie funkcji
                            printf ("x=%.3lf f(x)=cosx szereg: f(x)=%lf funkcja: %lf\n", x, y, cos(x));
                            fprintf (plik, "x=%.3lf f(x)=cosx szereg: f(x)=%lf funkcja: %lf\n", x, y, cos(x));
                    }
                    fclose (plik); //zamkniecie pliku
     
     
          return 0 ;
    }
     
    /****************FUNKCJA***************/
    unsigned long silnia (int k)//definicja funkcji silnia
    {
            if(k<=1) return(1);
           
            else return(k*silnia(k-1));
           
    }
     
    double fun(double x, double eps)
    {
            double s, a;
            long n, licznik;
            a = 1;
            s = 1;
            n = 2;
            licznik = 1 ;
     
            do
            {
                    a = (pow(x, n))/(silnia(n));
                    if (licznik % 2 == 0)
                    s = s + a ;
                    else s = s - a ;
                    n = n + 2;
                    
            }while (fabs(a) > fabs(s)*eps);
            return s;
    }

1
sum=add=1;
for(int i=1;fabs(add)>Epsilon;++i)
  {
   add*=-x*x;
   add/=(2*i-1)*(2*i);
   sum+=add;
  }
0

Czyli jeśli dobrze rozumiem, to zamieniłeś tą rekurencję z mojego kodu na inkrementację w pętli?

0

Nie tylko. Użył mózgu. Nie zauważyłeś czasem że kolejny wyraz tego szeregu jest jakoś powiązany z poprzednim? W efekcie jego kod całkiem szybko i poprawnie będzie się liczył, nawet dla dość sporych wartości. Twój wysypie się już po kilku iteracjach kiedy silnia będzie za duża, a o czasie wykonania nawet nie będę wspominał...

1 użytkowników online, w tym zalogowanych: 0, gości: 1