Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C# - Obliczanie wartości szeregu

czytelnik987 19 Paź 2012 15:59 2472 14
  • #1 19 Paź 2012 15:59
    czytelnik987
    Poziom 9  

    Witam, mam pewien problem. Zacznę od treści zadania:
    "Obliczyć wartość danego szeregu potęgowanego w dowolnym punkcie zbieżności. Obliczenia wykonać dokonując sumowania wyrazów tylko z wykorzystaniem wartości wyrazu poprzedzającego w szeregu ( nie wolno stosować funkcji potęgowej i/lub pętli for). Wyraz następny w szeregu ma być wynikiem mnożenia wyrazu poprzedzającego przez stosowny czynnik. Obliczanie wartości szeregu zrealizować budując funkcję zwracającą wartości typu double."

    Mam trzy funkcje:
    C# - Obliczanie wartości szeregu

    Dla dwóch pierwszych już napisałem i działa. Problem mam z kodem z funkcji ln(x+1). Nie działa mi.

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Uprzedzając głosy, dodam, że mam zabezpieczenie przed zaiweszeniem się programu w postaci:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    Pisze w MS Visual Studio 2010. x zadaje użytkownik programu - zgodnie z treścią zadania.
    Z góry dziękuję za pomoc.

    0 14
  • #3 19 Paź 2012 19:33
    czytelnik987
    Poziom 9  

    W Visual Studio jest taki komponent do wykreślania graficznego o nazwie chart.
    Dwie pierwsze funkcje wykreśla poprawnie, oblicza zgodnie z instrukcjami, wyrzuca poprawne wartości. Natomiast przy tej trzeciej nie rysuje funkcji, nie zwraca wartości i pokazuje się zabezpieczenie które ustawiłem.

    0
  • #4 19 Paź 2012 20:59
    gaskoin
    Poziom 38  

    Na jakim przedziale rysujesz wykres, jaki podajesz error ?

    0
  • #5 19 Paź 2012 21:13
    czytelnik987
    Poziom 9  

    Przedział narysowanego wykresu jest zależny od wartości zadanych: argumentu x i dokładności (błędu bezwzględnego). Zmienia się przedział wraz ze zmianą tych wartości.
    Jak wyżej - error jest zadany przez użytkownika, ma do wyboru: 0,1; 0,01 i 0,001.

    0
  • #6 19 Paź 2012 22:57
    robotyka
    Poziom 10  

    czytelnik987 napisał:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod



    Twój wzór na kolejne jest dość dziwny bo po skróceniu licznika z mianownikiem mamy (1/n)

    Powinno być według mnie coś w rodzaju

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Oczywiście ładniej by było gdyby
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    Ale wtedy założenie dotyczące korzystania z poprzedniego wyrazu było by nie spełnione

    0
  • #7 19 Paź 2012 23:17
    czytelnik987
    Poziom 9  

    robotyka napisał:

    Powinno być według mnie coś w rodzaju


    Niestety nie działa.

    0
  • #8 20 Paź 2012 00:00
    marcinj12
    Poziom 40  

    Rzeczywiście, ten wzór na kolejne wyrazy dziwnie się skraca...
    Prawidłowy, zdaje się, powinien wyglądać jakoś tak:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod
    Zwróć uwagę, że w tym trzecim wzorze nie masz na początku 1 jak w dwóch poprzednich tylko x. A że startujesz od drugiego elementu, to domyślnie wartość początkowa zmiennych wynik oraz licznik musi być równa x, a nie 1.

    PS. To zabezpieczenie na miliard iteracji to żadne zabezpieczenie. Zmienna double ma mniej więcej zakres od -1,79e308 do 1,79e308. Niby dużo, ale jak popatrzysz jak np. w pierwszej funkcji zmienia się wartość czy to licznika czy mianownika (silnia i potęgowanie bardzo szybko rosną) to okaże się, że np.dla liczby x = 1000 są to 3 rzędy wielkości po każdej iteracji - czyli wyjdziesz poza zakres już po nieco ponad 100 iteracjach... Albo poeksperymentuj z dopuszczalnymi zakresami liczb i na nie nałóż zabezpieczenie, albo zrób całość w bloku try {} catch () żeby wychwycić wyjątek przy przekroczeniu zakresu.

    0
  • #9 20 Paź 2012 21:52
    czytelnik987
    Poziom 9  

    Cytat:
    Prawidłowy, zdaje się, powinien wyglądać jakoś tak:

    Niestety ten też nie działa, ale teoria o wartościach początkowych ma sens. Pozostanę przy niej i będę kombinował.

    0
  • #10 20 Paź 2012 22:38
    marcinj12
    Poziom 40  

    czytelnik987 napisał:
    Niestety ten też nie działa
    Według mnie działa, czego dowodem poniższy screen (po lewej wynik obliczony funkcją matematyczną, po prawej wyliczony z rozwinięcia szeregu przy błędzie = 0.001):
    C# - Obliczanie wartości szeregu
    Zwróciłeś uwagę za przedział argumentów dopuszczony w tym wzorze??

    0
  • #11 20 Paź 2012 22:56
    czytelnik987
    Poziom 9  

    To znaczy,że będę miał błąd gdzieś w kodzie. Tylko pozostałe funkcje oblicza i rysuje mi dobrze. Proszę zerknąć, może ktoś, gdzieś dostrzeże coś złego:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0
  • #12 20 Paź 2012 23:16
    marcinj12
    Poziom 40  

    Znowu dla tego trzeciego wzoru: nam masz Log(x+1) = ..., a do delegata przypisujesz funkcję Math.Log, więc rysując wykres albo wywołać ją musisz jako funkcja (x+1), a nie funkcja (x), albo - co widzę próbowałeś robić - wywołać lub przypisać do delegata tą funkcję f_log_x.

    0
  • #13 20 Paź 2012 23:30
    czytelnik987
    Poziom 9  

    marcinj12 napisał:
    Znowu dla tego trzeciego wzoru: nam masz Log(x+1) = ...,

    Poprawiłem na Log(x), żeby wszędzie było zgodne. Dalej nic.

    0
  • Pomocny post
    #14 20 Paź 2012 23:52
    marcinj12
    Poziom 40  

    A ja nigdzie nie pisałem, żeby poprawiać wszystko na Log(x), tylko żeby zamiast

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    wywołać
    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Samo w ogóle ten kod piszesz czy przerabiasz czyjegoś gotowca?? Bo mam wrażenie że jednak się średnio w temacie orientujesz co on robi i dlaczego, i bardziej niż pomoc z C# to się robi rozwiązywanie zadania domowego...

    Masz wyraźnie podany jak funkcja ma wyglądać:
    C# - Obliczanie wartości szeregu - logarytm naturalny z x + 1, dodatkowo dla argumentów z przedziału od -1 < x <=1
    To x + 1 oraz niebranie -1 do argumentów jest po to, żeby uniknąć funkcji ln(0) i niższych, dla których logarytmu nie można obliczyć (kalkulator w windowsie!). Ty, rysując wykres, zaczynasz od punktu x = 0 i przepuszczając go przez Math.Log(0) dostajesz wynik - nieskończoności, której to nie przedstawisz na wykresie - i na tym cały problem polega.

    0
  • #15 21 Paź 2012 00:12
    czytelnik987
    Poziom 9  

    Zmieniałem już wcześniej ten fragment kodu z wykreślaniem w komponencie chart.
    Pisze sam, ale posiłkowałem się internetem, stąd nie wszystko było zrozumiałe.
    Pewnie średnio to i tak za dużo napisane bo nie siedzę w tym długo. Robię to dla przyjemności.
    Już znalazłem błąd. Działa: poprawnie liczy i rysuje funkcje.
    Dziękuję za pomoc.

    0