Program C, problem z funkcją potęgową

JarTSW
Użytkownik
Użytkownik
Posty: 414
Rejestracja: 15 mar 2007, o 15:15
Płeć: Mężczyzna
Lokalizacja: C:/WINDOWS/pulpit
Podziękował: 104 razy
Pomógł: 11 razy

Program C, problem z funkcją potęgową

Post autor: JarTSW »

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+x^2-x^3+...

Oto co udało mi się stworzyć:

Kod: Zaznacz cały

#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 
");
             for(x=xp; x<=xk; x=x+krok) 
             {
              printf("%lf %lf 
",x ,szereg(x));
             }
  printf("

");
  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 znalesc...Domyslam sie, ze pewnie moglem cos zle zapisac w funkcji szereg. Z gory dzieki za pomoc.
Awatar użytkownika
steal
Użytkownik
Użytkownik
Posty: 1043
Rejestracja: 7 lut 2007, o 18:35
Płeć: Mężczyzna
Lokalizacja: Białystok|Warszawa
Podziękował: 6 razy
Pomógł: 160 razy

Program C, problem z funkcją potęgową

Post autor: steal »

Kod: Zaznacz cały

double szereg(double x)
{
  double suma = 1.0;  //w sumie uwzględniamy już wyraz zerowy szeregu
  double w = 1.0;
  
  for(i=1; i<=LWS; i++)
  {
       w *= (-1)*x;
       s = s+w;
  }
  return s;
}
JarTSW
Użytkownik
Użytkownik
Posty: 414
Rejestracja: 15 mar 2007, o 15:15
Płeć: Mężczyzna
Lokalizacja: C:/WINDOWS/pulpit
Podziękował: 104 razy
Pomógł: 11 razy

Program C, problem z funkcją potęgową

Post autor: JarTSW »

Jestes pewny? bo dalej jakies kosmiczne wyniki wychodza a powinny wychodzic raz dodatnie, raz ujemne...
luka52
Użytkownik
Użytkownik
Posty: 8601
Rejestracja: 1 maja 2006, o 20:54
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 47 razy
Pomógł: 1816 razy

Program C, problem z funkcją potęgową

Post autor: luka52 »

A czy we wszystkich punktach \(\displaystyle{ [x_p,x_k]}\) ten szereg jest zbieżny?
JarTSW
Użytkownik
Użytkownik
Posty: 414
Rejestracja: 15 mar 2007, o 15:15
Płeć: Mężczyzna
Lokalizacja: C:/WINDOWS/pulpit
Podziękował: 104 razy
Pomógł: 11 razy

Program C, problem z funkcją potęgową

Post autor: JarTSW »

luka52 pisze:A czy we wszystkich punktach \(\displaystyle{ [x_p,x_k]}\) ten szereg jest zbieżny?
Hmm, tego raczej nie przewidzialem, ale skoro w tresci programu nic o tym, to moze nie trzeba tego sprawdzac? To drobne zadanko, glownie chodzi tutaj mi o funkcje, bo to ona źle liczy...
Awatar użytkownika
steal
Użytkownik
Użytkownik
Posty: 1043
Rejestracja: 7 lut 2007, o 18:35
Płeć: Mężczyzna
Lokalizacja: Białystok|Warszawa
Podziękował: 6 razy
Pomógł: 160 razy

Program C, problem z funkcją potęgową

Post autor: steal »

JarTSW pisze:Hmm, tego raczej nie przewidzialem, ale skoro w tresci programu nic o tym, to moze nie trzeba tego sprawdzac? To drobne zadanko, glownie chodzi tutaj mi o funkcje, bo to ona źle liczy...
Przedstawiłeś funkcję \(\displaystyle{ f(x)=\frac{1}{1+x}}\) w postaci szeregu nieskończonego. Takie przedstawienie jest prawdziwe tylko dla pewnego przedziału zbieżności - poza nim będzie to fałszywa równość - stąd takie wyniki.
Przedział zbieżności w tym wypadku jest łatwy do wyznaczenia
\(\displaystyle{ \frac{1}{1-(-x)}=\sum(-x)^n=\sum(-1)^nx^n}\)
Skorzystaliśmy z sumy szeregu potęgowego, a dla niego promień zbiezności \(\displaystyle{ |-x|<1}\).
JarTSW
Użytkownik
Użytkownik
Posty: 414
Rejestracja: 15 mar 2007, o 15:15
Płeć: Mężczyzna
Lokalizacja: C:/WINDOWS/pulpit
Podziękował: 104 razy
Pomógł: 11 razy

Program C, problem z funkcją potęgową

Post autor: JarTSW »

Czyli wypada dopisać warunek, że xp, xk ma należeć do promienia zbieznosci?
Awatar użytkownika
Zordon
Użytkownik
Użytkownik
Posty: 4977
Rejestracja: 12 lut 2008, o 21:42
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 75 razy
Pomógł: 910 razy

Program C, problem z funkcją potęgową

Post autor: Zordon »

A po co liczyć to z szeregu potęgowego? Tak jest w treści? Numerycznie to to akurat nic nie poprawi.
JarTSW
Użytkownik
Użytkownik
Posty: 414
Rejestracja: 15 mar 2007, o 15:15
Płeć: Mężczyzna
Lokalizacja: C:/WINDOWS/pulpit
Podziękował: 104 razy
Pomógł: 11 razy

Program C, problem z funkcją potęgową

Post autor: JarTSW »

A po co liczyć to z szeregu potęgowego? Tak jest w treści? Numerycznie to to akurat nic nie poprawi.
Tak chyba bylo w tresci, masz jakis wygodniejszy sposob?
Awatar użytkownika
Zordon
Użytkownik
Użytkownik
Posty: 4977
Rejestracja: 12 lut 2008, o 21:42
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 75 razy
Pomógł: 910 razy

Program C, problem z funkcją potęgową

Post autor: Zordon »

JarTSW pisze:masz jakis wygodniejszy sposob?
\(\displaystyle{ \frac{1}{x+1}}\) ;d?
JarTSW
Użytkownik
Użytkownik
Posty: 414
Rejestracja: 15 mar 2007, o 15:15
Płeć: Mężczyzna
Lokalizacja: C:/WINDOWS/pulpit
Podziękował: 104 razy
Pomógł: 11 razy

Program C, problem z funkcją potęgową

Post autor: JarTSW »

Kod: Zaznacz cały

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

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

double szereg(double x)
{
  double suma = 1.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() 
{
 do
  {   
              do
              {
               printf("Podaj poczatek przedzialu, ktory nalezy do (-1;1): ");
               scanf("%lf", &xp);
              } while (xp>=1 || xp<=-1);
              
              do
              {
               printf("Podaj koniec przedzialu, ktory nalezy do (-1;1): ");
               scanf("%lf", &xk);
              } while (xk>=1 || xk<=-1);
  
   printf("Podaj ilosc krokow: ");
   scanf("%d", &n);
   krok = (xk-xp)/(double)n;
   printf("x szereg 
");
  
             for(x=xp; x<=xk; x=x+krok) 
             {
              printf("%lf %lf %lf
", x, 1/(double)(x+1), szereg(x));
             }
  printf("Powtorzyc? (1-powtarza,0-konczy dzialanie programu): ");
  scanf("%d", &odp);
  }
  while (odp==1);
           

  printf("

");
  system("PAUSE");
}
Zrobiłem tak...co myślicie? bo juz sam nie wiem
ODPOWIEDZ