Cześć,
Mam zadanie o następującej treści:
Policz wartości funkcji y=f(x) 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 wykonaj z dokładnością epsilon. Algorytm obliczania sumy szeregu zapisz w oddzielnej funkcji.
Uzupełnij funkcję obliczającą sumę szeregu tak, by sumowanych było co najwyżej M wyrazów szeregu. Oznacza to, że przerwanie sumowania może nastąpić również wtedy, gdy nie została osiągnięta żądana dokładność. Informacja o tym, czy została osiągnięta dokładność czy też nie winna być znana w funkcji main().
Uzupełnij funkcję obliczającą sumę szeregu tak, by w funkcji main() znana była dodatkowo liczba sumowanych wyrazów szeregu.
Screen mojego szeregu znajdzie się w załączniku
Co do zadania wykonałem chyba wszystko oprócz tego obliczania sumy szeregu. Przyznam się że nie wiedziałem z czego skorzystać i obecne rozwiazanie jest conajmniej błędne, obliczałem to trochę metodą dedukcji, a chciałbym to ładnie zewrzeć w kodzie funkcji, czy mogę prosić o pomoc?
Oto co mi się udało zebrać do tej pory:
//Projekt numer jeden
#pragma warning (disable: 4996)
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
double szereg(double x, double eps, int *m);
int main()
{
double wz1 = 0.0;
double wz2 = 0.0;
double eps = 0.0; //dokladnosc szeregu
double a = 0.0, b = 0.0; //przedzial mieszczacy sie w dziedzinie |x|<=1.
int n = 0.0; //okresla na ile czesci podzielony jest przedzial
int m = 0.0; //okresla ile wyrazow ma zostac zsumowane
printf("Dziedzina funkcji jest przedzial <-1,1>\n");
printf("Podaj poczatek i koniec przedzialu:\n");
scanf("%lf%lf", &a, &b);
if ((fabs(a) <= 1.0) && (fabs(b) <= 1.0) && (a < b)) {
printf("Podaj na ile czesci chcesz podzielic swoj przedzial (liczba N+): ");
scanf("%i", &n);
if (n < 1) {
printf("Niepoprawne dane (n<1), sprobuj jeszcze raz\n");
}
else {
double krok = (fabs(b) + fabs(a)) / (double)n;
printf("Podaj dokladnosc: ");
scanf("%lf", &eps);
printf("Podaj ile wyrazow chcesz zsumowac: ");
scanf("%i", &m);
int l_wyr = m;
if (m <= 0) {
printf("Niepoprawne dane (m<=0), sprobuj jeszcze raz\n");
}
else {
double x = a;
int ile = 0;
int liczba_wyrazow = m;
for (x; x <= b; x = x + krok) {
wz1 = pow(1.0 + x, 1.0 / 3.0);
wz2 = szereg(x, eps, &m);
ile = l_wyr - m;
if (m <= 0) {
printf("%.7lf\tszereg:%lf\t\tfunkcja:%lf\twyrazow:%i\tosiagnieto m wyrazow\n", x, wz2, wz1, ile);
}
else {
printf("%.7lf\tszereg:%lf\t\tfunkcja:%lf\twyrazow:%i\tosiagnieto dokladnosc\n", x, wz2, wz1, ile);
}
m = l_wyr;
}
printf("---------------------");
printf("\nKONIEC PROGRAMU\n");
printf("---------------------");
}
}
}
else {
printf("Niepoprawne dane (a,b<1=0), sprobuj jeszcze raz\n");
}
}
double szereg(double x, double eps, int *m) {
double s = 1.0; //suma
double w = 1.0; //n-ty wyraz
double mian = -3.0; //mianownik
double licz = 1.0; //licznik
do {
w = w * licz / mian;
s = s + w;
mian = mian - 3.0;
licz = mian + 4.0;
*m = *m - 1;
} while (fabs(w) >= eps * fabs(s) && *m > 0);
return s;
}