Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Program liczący N początkowych wyrazów ciągu

Ostatnio zmodyfikowano 2014-01-06 17:38
Autor Wiadomość
Atexor
Temat założony przez niniejszego użytkownika
Program liczący N początkowych wyrazów ciągu
» 2014-01-06 12:41:36
Witam, mam problem z jednym zadaniem, mianowicie:

Proszę napisać program obliczający N początkowych wyrazów ciągu, począwszy od wyrazu a2 (N wczytane z klawiatury, N<=30):
Ciąg wygląda tak (zdjęcie, bo ciężko to napisać): http://i.imgur.com/FgVT9E6.jpg
gdzie a0=3, a1=2

Problem mam taki, że od siódmego wyrazu ciągu włącznie każdy następny wynosi 0,110462.

Kod wygląda tak. Gdzie jest błąd?
C/C++
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main()
{
    float a0 = 3.0, a1 = 2.0, a;
    int i, n;
   
    while( n > 30 )
    {
        puts( "Podaj liczbe wyrazow ciagu:" );
        scanf( "%d", & n );
        puts( "\nLiczba wyrazow musi byc mniejsza od 30!" );
    }
   
    for( i = 0; i < n; i++ )
    {
        a =( float ) exp( a1 ) /( float )( 10.0 +( float ) sin( a0 ) );
        printf( "%d wyraz ciagu wynosi %f\n", i + 1, a );
        a0 = a1;
        a1 = a;
    }
    system( "PAUSE" );
    return 0;
}

Z góry dziękuję i pozdrawiam ;)
P-101361
pekfos
» 2014-01-06 13:54:57
Kod ma niezdefiniowane zachowanie, bo używasz niezainicjalizowanej zmiennej.
P-101390
Atexor
Temat założony przez niniejszego użytkownika
» 2014-01-06 14:04:34
Chyba nie bardzo rozumiem - przecież wszystkie zmienne mam zdefiniowane, liczba "n" jest wczytywana z klawiatury (jakby było, że n=0 w jej inicjacji to by pętla while nie działała), "a0" i "a1" są podane, "a" jest wynikiem działania, zaś "i" jest tylko do pętli.
P-101395
pekfos
» 2014-01-06 14:21:34
przecież wszystkie zmienne mam zdefiniowane
Czy ja napisałem, że zmienne są niezdefiniowane? Czy składnia zdania tu w ogóle pozwala, na takie znaczenie..?

jakby było, że n=0 w jej inicjacji to by pętla while nie działała
Więc daj taką wartość, dla której będzie działała. Obecnie nic w tym programie nie musi działać.
P-101401
Monika90
» 2014-01-06 14:25:21
Problem mam taki, że od siódmego wyrazu ciągu włącznie każdy następny wynosi 0,110462.
Dlaczego uważasz że to problem? Jak łatwo policzyć ciąg jest zbieżny do liczby
0.110461654595563546894305161983997818927092730457963990271395250
(to tak w przybliżeniu...)
P-101403
docentpp
» 2014-01-06 14:57:35
@ Monika90

Jakiej biblioteki w C (algorytmu/ewen. programu specjalistycznego) użyto do obliczeń
z tak dużą dokładnością ?
P-101420
Monika90
» 2014-01-06 15:03:51
GMP https://gmplib.org/

A ja po prostu użyłam tego
http://www.wolframalpha.com​/input/​?i=solve+x%3Dexp%28x%29%2F%2810%2Bsin%28x%29%29
klikasz w More digits tak długo jak się da :)

Niestety powyższy link nie działa prawidłowo (forum zamienia %2B na +, bug?), należy skopiować poniższy do paska adresu przeglądarki.
http://www.wolframalpha.com/input/?i=solve+x%3Dexp%28x%29%2F%2810%2Bsin%28x%29%29
P-101421
Atexor
Temat założony przez niniejszego użytkownika
» 2014-01-06 15:07:00
Pekfos, chyba wyjątkowo nie rozumiem Twojego toku myślenia. Po co mam inicjalizować wartość zmiennej np. "n" już na początku programu, skoro potem muszę ją wczytywać z klawiatury? Dodatkowo wtedy pętla while nie będzie działać...

Tak samo z "i", które inicjalizuję dopiero w pętli, bo tam jest potrzebna.

Monika90 - racja, wielkie dzięki!
Sprawdziłem używając %.15f i faktycznie to wina przybliżeń. Nie pomyślałem, że ciąg może tak szybko zbiegać do jakiejś liczby.

Poza tym jeśli można wiedzieć, to jak policzyłaś zbieżność tego ciągu aż z taką dokładnością?
P-101423
« 1 » 2
  Strona 1 z 2 Następna strona