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

Program do obliczania logarytmu naturalnego.

Ostatnio zmodyfikowano 2014-11-16 02:48
Autor Wiadomość
Atexor
» 2014-11-04 01:25:20
Ciężko mi tu dostrzec wzór Maclaurina, chyba że "i" nie oznacza liczby zespolonej, ale konkretną liczbę (głupie oznaczenie).
W sumie chyba zgadzałoby się z tym na wiki (na samej dole strony): http://pl.wikipedia.org/wiki/Logarytm_naturalny

Ja bym do tego zadania podszedł tak jak poniżej zrobiłem. Dla sprawdzenia, czy w ogóle działa, skompilowałem to i jak się okazało to nie chce poprawnie sumować kolejnych liczb (w kółko oscyluje wokół tych samych). Znając mnie to pewnie coś przeoczyłem, tym bardziej że jest dość późno. Mam nadzieję, że mimo wszystko naświetlę Ci sposób rozwiązania zadania i będziesz w stanie wykryć błąd u mnie/u siebie zrobić.

Pozdrawiam


C/C++
#include <iostream>
#include <math.h>
#include <windows.h> //do funkcji sleep, aby widziec jak sie zmieniaja liczby
#include <iomanip> //do setprecision(15), tj. wyswietlanej ilosci miejsc po przecinku
using namespace std;

int main()
{
    double epsylon, x, temp = 0, suma = 0.0, n = 1.0; // temp to poprzedni element sumy
   
    cout << "Podaj x z zakresu (-1,1]." << endl;
    cin >> x; // x musi byc z zakresu (-1,1] (patrz na konce przedzialow!)
    cout << "Podaj przyblizenie epsylon" << endl;
    cin >> epsylon;
   
    while( 1 ) //break w srodku ma przerwac
    {
       
        suma +=(( pow( - 1, n + 1 ) ) / n ) * pow( x, n );
        temp = suma;
        n++; //zwiekszam do obliczenia kolejnego elementu szeregu
        cout << "Dla przyblizenia eps=" << epsylon << " ln(1+x)=" << setprecision( 15 ) << suma << endl; //to poza petla, dla testu w srodku
        Sleep( 100 ); //aby bylo widac poszczegolne liczby to spowolnie petle
       
        // if(fabs(suma-temp)<epsylon)    //warunek przerywajacy
        // break;
    }
   
   
    system( "PAUSE" );
    return 0;
}
P-119968
Nedvid
Temat założony przez niniejszego użytkownika
» 2014-11-04 16:07:52
Jest mały błąd w obliczeniach, a mianowicie:
NIE:
suma +=(( pow( - 1, n + 1 ) ) / n ) * pow( x, n );
TAK:
suma +=( pow( - 1, n + 1 ) ) *(( pow( x, n ) ) / n );

Ale coś jest nie tak z tym warunkiem przerywającym, sam nie wiem co :/

Przy takiej pętli:

C/C++
while( 1 )
{
    suma +=( pow( - 1, n + 1 ) ) *(( pow( x, n ) ) / n );
    temp = suma;
    n++; //zwiekszam do obliczenia kolejnego elementu szeregu
   
    if( fabs( suma - temp ) < e )
         break;
   
}
cout << "Dla przyblizenia e=" << e << " ln(1+x)=" << setprecision( 15 ) << suma << endl;

Program podaję na wyjściu to co się wpisuje za x a nie prawidłowy wynik.
P-119984
pekfos
» 2014-11-04 17:27:36
C/C++
temp = suma;
//..
if( fabs( suma - temp ) < e )
     break;

Różnica tak jakby wynosi zero..
P-119986
Nedvid
Temat założony przez niniejszego użytkownika
» 2014-11-04 17:30:36
Faktycznie ale w takim razie jak dobrać te warunki żeby wszystko dobrze działało ?
P-119987
pekfos
» 2014-11-04 17:39:02
C/C++
suma +=( pow( - 1, n + 1 ) ) *(( pow( x, n ) ) / n );
temp = suma;
Na pewno zmienić tu kolejność.
P-119988
Nedvid
Temat założony przez niniejszego użytkownika
» 2014-11-04 17:47:53
Wynik bez zmian.
P-119989
Atexor
» 2014-11-04 23:51:25
temp=suma; ma lecieć na koniec pętli (po warunku if'a)

"Błąd w obliczeniach" to tylko inny zapis. Wychodzi na to samo:
http://i.imgur.com/xh97d4H.gif
http://i.imgur.com/ZrYVJB5.gif

Dla np. x=1 i eps=0.03 już liczy, ale nadal nie wiem czemu nie sumuje tych liczb mimo "suma+=", więc w tym Ci nie pomogę...
P-120028
Osa
» 2014-11-05 01:15:13
Witam,

również rozwiązuję to zadanie, ale jestem na trochę wcześniejszym etapie. Otóż po zlokalizowaniu błędu zostawiłem tylko działający kod + linijkę, która zwraca niepoprawną wartość:




#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
printf("Podaj liczbe z zakresu -1<x<=1.\n");
float x, przyblizenie;
scanf_s("%f", &x);
if (x <= -1 || x > 1)
{
printf("Ta liczba nie jest z przedzialu (-1;1>!!!\n");
}
else
{
printf("Podaj przyblizenie\n");
scanf_s("%f", &przyblizenie);
printf("%f", &przyblizenie);
}

return 0;
}


Otóż przebieg pracy programu wygląda tak:

Podaj liczbe z zakresu -1<x<=1.
<podaję prawidłową liczbę, nieprawidłowe program prawidłowo odrzuca>
Podaj przyblizenie
<podaję jakąkolwiek liczbę, powinna ona być typu float, więc na razie nie zaprzątam sobie głowy tym, czy ma to sens w zadaniu, ale czy jest typu float, na przykład 0.1>
<konsola zwraca mi to: 0.000000 , nie mam pojęcia dla czego>

Co tu jest źle?



P-120029
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona