Programik z szeregiem nie dziala [C]

maestro00
Użytkownik
Użytkownik
Posty: 2
Rejestracja: 10 lis 2008, o 21:57
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 1 raz

Programik z szeregiem nie dziala [C]

Post autor: maestro00 »

Napisałem program do podanego w linku zadania.
... 131138.jpg
Niestety w teorii działa, w praktyce - nie, wyświetla wynik bardzo dużego rzędu.
Siedzę już nad tym 3-cią noc i nie mam zielonego pojęcia gdzie leży błąd.
Możecie jakoś pomóc ?

Kod: Zaznacz cały

#include <stdio.h>
#include <math.h>
#include <iostream>
#define MAX 1000               //Przyda sie aby w razie czego program nie krecil sie w nieksonczonosc
int main()
{
    double suma=0;
    double x=1;
    double ep=0;
    double a=0;
    double c=1;
    int n=1;
    printf("Podaj wartosc argumentu x:
");
    scanf("%lf",&x);
    printf("Podaj wartosc epsilon:
");
    scanf("%lf",&ep);
    if (fabs(x)<1 || ep<=0)
                  {
                   printf("NIEPOPRAWNE DANE
");
                   system ("pause");
                   return 1;          
                   }
    suma=a=x;
    do
             {
             n=n+1;                          //Licznik krokow
                printf("
 KROK: %d
",n);
                c=(2*n-1)/(2*n-3);           //Nowa nieparzysta liczba mianownika podzielona przez poprzednia nieparzysta
             a=-(a*x*x*(2*n-3)/((2*n-2)*c)); //Tworzenie nowego elementu przez domnozenie poprzedniego
             suma=suma+a;                    //Dodawanie do puli sumy kolejnego elementu
                printf("SUMA: %lf
",suma);
             }
    while (abs(a)>2*ep && n<MAX);
           printf("
Suma: %lf 
",suma);
    system ("pause");
    if (n>MAX)
           printf("Osiągnieto max obliczen
");
    system ("pause");
    return 0;
}
matshadow
Użytkownik
Użytkownik
Posty: 941
Rejestracja: 17 gru 2007, o 21:48
Płeć: Mężczyzna
Lokalizacja: Kingdom Hearts
Podziękował: 6 razy
Pomógł: 222 razy

Programik z szeregiem nie dziala [C]

Post autor: matshadow »

a spróbowałeś zmniejszyć liczbę kroków? Może nie wyrabia przez małe wartości
maestro00
Użytkownik
Użytkownik
Posty: 2
Rejestracja: 10 lis 2008, o 21:57
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 1 raz

Programik z szeregiem nie dziala [C]

Post autor: maestro00 »

Mam identyczny program z ćwiczeń, tyle że bez mnożnika licznika i bez dzielenia przez poprzedni nieprzysty element mianownika - działa idealnie.
smiechowiec
Użytkownik
Użytkownik
Posty: 374
Rejestracja: 21 cze 2007, o 11:28
Płeć: Mężczyzna
Lokalizacja: Łostowice
Pomógł: 146 razy

Programik z szeregiem nie dziala [C]

Post autor: smiechowiec »

Wyliczona wartość c jest niezgodna z intencją gdyż wyniki w nawiasach są typu int , operacja dzielenia będzie typu int, ostatecznie działanie da niezamierzony wynik.
Można wymusić typ korzystając z (double) przed liczbą 2 lub podając ją bezpośrednio jako 2.0
c = (2.0 * n - 1) / (2.0 * n - 3);-- 9 listopada 2010, 23:17 --Program działa prawidłowo.
Niestety dla |x| > 1 szereg potęgowy jest prawdopodobnie rozbieżny.

Kod: Zaznacz cały

#include  <stdio.h> 
#include  <math.h> 
#include  <iostream> 
#define MAX 1000      // Przyda sie aby w razie czego program nie krecil sie w nieksonczonosc
int main() {
    double suma  =  0;
    double x = 1, x2 = 1;
    double ep = 0;
    double a = 0;
    double c = 1, d = 1;
    int n = 1;
    printf("Podaj wartosc argumentu x: ");
    scanf("%lf", &x);
    printf("
Podaj wartosc epsilon: ");
    scanf("%lf", &ep);
    if (fabs(x) < 1 || ep <= 0) {
        printf("NIEPOPRAWNE DANE
");
        return 1;          
	}
    suma = a = x;
    x2 = x * x;
    do {
        n = n + 1;                           // Licznik krokow
        printf("
 KROK: %d
", n);		
        c = (2.0 * n - 3) / (2.0 * n - 1);   // Nowa nieparzysta liczba mianownika podzielona przez poprzednia nieparzysta
        d = (2.0 * n - 3) / (2.0 * n - 2);
        a =  -(a * x2 * d * c);  // Tworzenie nowego elementu przez domnozenie poprzedniego
        printf("%g/%g=%g  %g  %g
", 2.0 * n - 3, 2.0 * n - 1, c, d, a);
        suma = suma + a;                     // Dodawanie do puli sumy kolejnego elementu
        printf("SUMA: %g
", suma);
	}
    while ((fabs(a) > (2 * ep)) && (n < MAX) && (fabs(a) < 1e500) );
		printf("
Suma: %g 
", suma);
    if (n > MAX)
       printf("Osiągnieto max obliczen
");
    //system ("pause");
    return 0;
}
ODPOWIEDZ