Program C, problem z funkcją potęgową

0

Piszę sobie taki programik, o takiej temacie:
Policz wartości funkcji y=1/(x+1) we wszystkich punktach podziału na n części przedziału <xp; xk>. Funkcja f(x) dana jest w postaci rozwinięciaw szereg potęgowy 1-x+x2-x3+...

Oto co udało mi się stworzyć:

#include<stdio.h>
#include<math.h>
#include<stdio.h>
#define LWS 20

double xp, xk, krok, x;
int n, i;

double szereg(double x) 
{
  double s, w;
  w=x;
  s=x;
      for(i=0; i<=LWS; i++) 
      {
       w=(-w*x);
       s=s+w;
      }
  return s;
}

int main() 
{
    
  printf("Podaj poczatek przedzialu: ");
  scanf("%lf", &xp);
  printf("Podaj koniec przedzialu: ");
  scanf("%lf", &xk);
  printf("Podaj ilosc krokow: ");
  scanf("%d", &n);
  krok=(xk-xp)/(double)n;
  printf("x szereg \n");
             for(x=xp; x<=xk; x=x+krok) 
             {
              printf("%lf %lf \n",x ,szereg(x));
             }
  printf("\n\n");
  system("PAUSE");
}

Jednak nie działa on poprawnie, źle liczy. Mógłby ktoś rzucić okiem i sprawdzić gdzie jest błąd? Siedzę już nad tym godzine i nie moge znaleŹĆ...Domyslam sie, ze pewnie moglem cos zle zapisac w funkcji szereg. Z gory dzieki za pomoc.

0
  1. na początku s=0 i w=1.0
  2. zła kolejność obliczeń w pętli.
  3. debugger w dłoń i sam to zobacz.
0
MarekR22 napisał(a)
  1. na początku s=0 i w=1.0

Hmm, a nie powinno być może s=1.0 i w=1.0? W sumie nie powinien byc juz uwzgledniony wyraz zerowy, jedynka?

Poprawiłem trochę, wyszło mi takie coś:

#include<stdio.h>
#include<math.h>
#include<stdio.h>
#define LWS 9

double xp, xk, krok, x;
int n, i;

double szereg(double x)
{
  double suma = 0;                                                               //w sumie uwzględniamy już wyraz zerowy szeregu
  double w = 1.0;
 
  for(i=1; i<=LWS; ++i)
  {

       w = w*(-1)*x;
       suma = suma+w;
  }
  return suma;
}

int main() 
{
    
  printf("Podaj poczatek przedzialu: ");
  scanf("%lf", &xp);
  printf("Podaj koniec przedzialu: ");
  scanf("%lf", &xk);
  printf("Podaj ilosc krokow: ");
  scanf("%d", &n);
  krok = (xk-xp)/(double)n;
  printf("x szereg \n");
             for(x=xp; x<=xk; x=x+krok) 
             {
              printf("%lf %lf \n",x ,szereg(x));
             }
  printf("\n\n");
  system("PAUSE");
}

Ale dalej to chyba nie jest to...

0

a punkt 2? zła kolejność obliczeń!
Pamiętaj, że pierwszy wyraz szeregu to: 1 następny to -x a potem x^2, a u ciebie jest to pomieszane.

Zdecyduj się może kiedy dodajesz pierwszy element szeregu. Jeśli poza pętlą to s=pierwszy element, jeśli w pętli to s=0.0 (stąd pojawiły się twoje wątpliwości o inicjalizacji s).

0
  1. Dziwny to pomysł by do obliczania wartości funkcji 1/(1+x) stosować szereg potęgowy.
  2. Szereg potęgowy 1-x+x2-x3+... jest zbieżny dla -1<x<1, nie powinieneś oczekiwać, że wyniki dla x spoza przedziału (-1,1) będą poprawne.
0

tak, ale musze to napisac w dwoch postaciach, jako wartosci dla funkcji 1/(1+x), to akurat jest proste, wiec z tym nie widze problemow, gorzej z tym szeregiem, bo skoro maja rozne przedzialy x, to w ogole jest to wykonalne?

Pamiętaj, że pierwszy wyraz szeregu to: 1 następny to -x a potem x^2, a u ciebie jest to pomieszane.

tak, pamietam, ale gdzie widzisz tą złą kolejność? bo skoro pierwszy wyraz mam juz wliczony do sumy, to kolejny nie powinien byc (-1)poprzednix ? Czyli po prostu:

w = w*(-1)*x;

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