logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

C# - Jak obliczyć wartość szeregu ln(x+1) bez pętli for i funkcji potęgowej?

czytelnik987 19 Paź 2012 15:59 3465 14
REKLAMA
  • #1 11428424
    czytelnik987
    Poziom 9  
    Posty: 41
    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# - Jak obliczyć wartość szeregu ln(x+1) bez pętli for i funkcji potęgowej?

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

    Kod: C#
    Zaloguj się, aby zobaczyć kod


    Uprzedzając głosy, dodam, że mam zabezpieczenie przed zaiweszeniem się programu w postaci:
    Kod: C#
    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.
  • REKLAMA
  • REKLAMA
  • #3 11429116
    czytelnik987
    Poziom 9  
    Posty: 41
    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.
  • #4 11429513
    gaskoin
    Poziom 38  
    Posty: 4159
    Pomógł: 436
    Ocena: 102
    Na jakim przedziale rysujesz wykres, jaki podajesz error ?
  • #5 11429571
    czytelnik987
    Poziom 9  
    Posty: 41
    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.
  • REKLAMA
  • #6 11430003
    robotyka
    Poziom 11  
    Posty: 16
    Pomógł: 3
    czytelnik987 napisał:
    Kod: C#
    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: C#
    Zaloguj się, aby zobaczyć kod


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

    Ale wtedy założenie dotyczące korzystania z poprzedniego wyrazu było by nie spełnione
  • REKLAMA
  • #7 11430054
    czytelnik987
    Poziom 9  
    Posty: 41
    robotyka napisał:

    Powinno być według mnie coś w rodzaju


    Niestety nie działa.
  • #8 11430186
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    Rzeczywiście, ten wzór na kolejne wyrazy dziwnie się skraca...
    Prawidłowy, zdaje się, powinien wyglądać jakoś tak:
    Kod: C#
    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.
  • #9 11432748
    czytelnik987
    Poziom 9  
    Posty: 41
    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ł.
  • #10 11432909
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    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# - Jak obliczyć wartość szeregu ln(x+1) bez pętli for i funkcji potęgowej?
    Zwróciłeś uwagę za przedział argumentów dopuszczony w tym wzorze??
  • #11 11432989
    czytelnik987
    Poziom 9  
    Posty: 41
    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: C#
    Zaloguj się, aby zobaczyć kod
  • #12 11433048
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    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.
  • #13 11433098
    czytelnik987
    Poziom 9  
    Posty: 41
    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.
  • Pomocny post
    #14 11433161
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    A ja nigdzie nie pisałem, żeby poprawiać wszystko na Log(x), tylko żeby zamiast
    Kod: C#
    Zaloguj się, aby zobaczyć kod

    wywołać
    Kod: C#
    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# - Jak obliczyć wartość szeregu ln(x+1) bez pętli for i funkcji potęgowej? - 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.
  • #15 11433218
    czytelnik987
    Poziom 9  
    Posty: 41
    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.

Podsumowanie tematu

✨ Użytkownik miał problem z obliczeniem wartości szeregu ln(x+1) w C# bez użycia pętli for i funkcji potęgowej. W trakcie dyskusji pojawiły się różne podejścia do implementacji funkcji, w tym propozycje dotyczące wzorów na kolejne wyrazy szeregu. Użytkownik zmagał się z błędami w kodzie, które uniemożliwiały poprawne rysowanie wykresu oraz obliczanie wartości. Ostatecznie, po kilku sugestiach dotyczących poprawy wartości początkowych oraz argumentów funkcji, użytkownik zdołał znaleźć błąd i poprawić kod, co pozwoliło na prawidłowe działanie funkcji.
Wygenerowane przez model językowy.
REKLAMA