prosty program, obliczenie sumy szeregu, problem

0

mam do napsiania program wyliczający sume szeregu dla x w przedziale [0,2 ; 0,3], krok x=0,01, w którym błąd wynosi 0,000001 ( tzn dla takiego k dla którego wynik będzie mniejszy od błędu program przestaje inkrementować k, sumuje poprzednie wyniki i wysyła do konsoli), myślę ,że popełniłem błąd gdzieś w pętlach, zagnieżdzeniach, prosze o pomoc i z góry dziękuje.

#include<iostream>
#include<cmath>
using namespace std ;
int main ()
{
float x,k,w,e;
for (x=0.2;x<=0.301;x=x+0.01){
for (k=0;w>=0.000001;k++){
w=(12/(7k+1)) pow(x,(7*k+1));
e=e+w;
}
cout<<"suma szeregu dla x= "<<x<<"wynosi : "<<e<<endl;
}

cin.get();
return 0 ;
}

0

Za tego pow() tam powinieneś zginąć w męczarniach.
xk = 12/(7*k+1)x^(7k+1)
x0 = 12x
x1 = 12/8 * x^8
x2 = 12/15 * x^15
x3 = 12/22 * x^22

Co nam z tego wynika? Że każdy kolejny wyraz to jest poprzedni wyraz pomnożony przez: (7k+1)/(7(k+1)+1)*x^7
W związku z tym x^7 warto policzyć na początku i każdy kolejny wyraz uzyskujesz wykonujac proste mnożenie, a nie licząc za każdym razem złożone potęgi.
Poza tym twój warunek
w>=0.000001
jest bez sensu. To RÓŻNICA między dwoma sąsiednimi wyrazami powinna być MNIEJSZA od tej wartości. A nie wyraz większy od niej.
Czyli postępujac tak jak napisałem wyzej: znasz poprzedni wyraz, wyliczasz nowy wyraz, sprawdzasz ile wynosi ich różnica, jeśli jest cały czas za duża to dodajesz nowy wyraz do sumy i zapisujesz nowy wyraz w tej zmiennej gdzie był stary wyraz.

0

dawno temu kończyłem szkołę, ale z tego ca pamiętam, to nawet jest wzór na liczenie sumy w szeregu :)

0

no niby proste, tylko jak to zapisać tak żeby działało ? jak tam jest coś jakby rekurencja, zrobiłem ale wyrzuca jakies śmieci.

0

Rekurencja? o_O Zwykła iteracja tam jest.

0

robię pętle, najpierw tą która dodaje do x a potem wewnętrzną która sprawdza jaka jest różnica między kolejnym a poprzednim wynikiem i jesli jest mniejsza niż granica błędu, kończy, tylko jak zrobić tą drugą pętle? stworzyć kolejną zmienną i przypisać jej wartość wyniku a potem warunek że |w2-w1|> błedu ?

0

Jaką drugą pętlę? Do porównania dwóch zmiennych chcesz robić pętlę? o_O
Przykład dla szeregu S = 1/x^k dla k całkowitych nieujemnych

float x = 3.0; //wartosc argumentu
float x0 = 1; //wartosc pierwszego wyrazu szeregu
float suma = x0;

for(int i=1;;i++)
{
  float x1 = x0/x; //obliczamy nowy wyraz
  suma+=x1; //doliczamy go do sumy
  if(abs(x1-x0) < 0.00001) //jeśli nowy wyraz różni się dostatecznie mało od starego to przerywamy
    break;
  x0=x1;
}

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