Witam. MIalem oto takie zadanie :
Policzenie wartości funkcji we wszystkich punktach podziału na n części przedziału [a,b]. Funkcja f dana jest w postaci rozwinięcia w szereg potęgowy i w postaci wzoru analitycznego. Obliczanie sumy szeregu wykonać mam z dokładnością e (epsilon). Algorytm obliczenia sumy szeregu ma być w oddzielnej funkcji. Uzupełnij funkcję obliczającą sumę szeregu tak, by:
1. sumowanych było co najwyżej M wyrazów szeregu
2. funkcji main znana była dodatkowo liczba sumowanych wyrazów szeregu.
OTO PODANY SZEREG :
(1-x)^1/3
Oraz funkcja 1- (1/3)x - (1*2)x^2/(3*6) - (1*2*5)x^3/(3*6*9) - (1*2*5*8)x^4/(3*6*9*12)- .......
Oto program:
#include<stdio.h> #include<math.h> double szereg(double x,double ilosc_elementow,double dokl,double*k,int*licz) { double wynik=0, p; double s,z,m,n,w,poprzednia; *licz=0; int i=0; z=1; s=0; w=3; m=1; n=1; do { wynik=wynik+z; z=z*((m*n)/w)*x; n=n+1; w=w+3; if(n==2) { poprzednia=s; wynik=wynik+z; z=z*((m*n)/w)*x; n=n+3; w=w+3; } p=fabs(z); i++; }while(p>=dokl&&i<ilosc_elementow); if(i>=ilosc_elementow) *k=1; else *k=0; *licz=i; return wynik; } int main() { double y,x,a,b,krok,dx,max,dokl=0,k=0,sanus=0; int licz=0; char u='x'; const char *tak="TAK"; do { //początek przedziału printf("Podaj poczatek przedzialu : "); scanf("%lf",&a); //koniec przedziału printf("\nPodaj koniec przedzialu : "); scanf("%lf",&b); if(a>=b || fabs(a) > 1 || fabs(b) >1) printf("\nBledne dane, podaj zakres przedzialu jeszcze raz\n"); }while(a>=b); //ilość kroków do { printf("\nPodaj na ile czesci podzielic przedzial : "); scanf("%lf",&krok); if(krok<=0) printf("Bledne dane podaj dane jeszcze raz"); }while(krok<=0); dx=(b-a)/krok; //dokladnosc do { printf("\nPodaj dokladnosc funkcji z zakresu (x miejsc po przecinku): "); scanf("%lf",&dokl); printf("\nDokladnosc wynosi %g\n",dokl); if(dokl<0||dokl>1) printf("Podaj dane jeszcze raz\n"); }while(dokl<=0||dokl>=1); //liczba elemntów szeregu do { printf("\nPodaj maksymalna ilosc elementow szeregu : "); scanf("%lf",&max); }while(max<0); //wypisywanie x=a; printf("\nDANE : a=%-5.4lf \t b=%-5.4lf \t dx=%-5.4lf \t dokladnosc = %-5g \t max liczba el. szer. = %g\n",a,b,dx,dokl,max); printf("---------------------------------------------------------------------------------------------------------------\n"); printf("|%8c \t|Wynik z fukcji:| %8 Wynik ze wzoru | Czy osiagnieto dokladnosc \t| Zsumowanych wyrazow:|\n",u); printf("---------------------------------------------------------------------------------------------------------------\n"); while(x<b+0.1*dx) { y=szereg(x,max,dokl,&k,&licz); double l=1./3.; sanus=pow(1-x, l); if(k==1) tak="NIE"; else tak="TAK"; printf("|%3.4lf \t| %10.7lf\t| %10.7lf \t| \t%10.7s\t |\t %3d |\n",x,y,sanus,tak,licz); x=x+dx; } printf("---------------------------------------------------------------------------------------------------------------\n"); printf("\nTAK - dokladność została osiagnieta\nNIE- dokladnosc nie zostala osiagnieta\n" ); }
Mógłby ktos na niego spojrzeć ? Dokładnośc epsilon jest raczej złaa i nie wiem czy dobrze zrobiona fuknkcja co najwzyej M wyrazow.
Z góry dzieki