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

Obliczyć wartość funkcji z wyborem formuły

Ostatnio zmodyfikowano 2011-01-06 16:35
Autor Wiadomość
krajku
Temat założony przez niniejszego użytkownika
Obliczyć wartość funkcji z wyborem formuły
» 2010-12-29 15:19:43
Witam Proszę o sprawdzenie kodu programu który ma: Obliczyć wartość funkcji z wyborem formuły

C/C++
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <math.h>

using namespace std;

long double
a =- 0.9,
b =- 0.4,
step = 0.05,
x, y;

int main()
{
    fstream file;
    file.open( "kruk03.txt", ios::trunc | ios::out );
    x = a;
    while( x <= b )
    {
        if( x <=- 0.7 ) y = pow( 3.5 + log( x ), 2 );
        else if( x >- 0.7 and x >=- 0.6 ) y = tan( x + log( fabs( x ) ) );
        else if( x >=- 0.6 ) y = pow( log( x + 0.5 ), 2 );
       
        file << x << "," << y << "\n";
        x += step;
       
    }
    return( 0 );
}

wszystko niby ładnie się kompiluje ale z racji ze jestem początkujący zaniepokojony jestem wynikami :
-0.9,-1.#IND
-0.85,-1.#IND
-0.8,-1.#IND
-0.75,-1.#IND
-0.7,-1.#IND
-0.65,-1.#IND
-0.6,-1.#IND
-0.55,-2.2216
-0.5,-2.52086
-0.45,-2.99463
Prosze o pomoc
Pozdrawiam
P-25859
ison
» 2010-12-29 15:51:31
if( x <=- 0.7 ) y = pow( 3.5 + log( x ), 2 );

logarytm dla liczb ujemnych?
P-25862
krajku
Temat założony przez niniejszego użytkownika
» 2010-12-29 16:03:34
No w sumie ale mam taki przykład:
http://img714.imageshack.us/i/przykladx.jpg
P-25863
ison
» 2010-12-29 16:15:55
w cmath funkcja log to logarytm naturalny (o podstawie e)
ln - logarytm naturalny
lg - logarytm zwykły
w 3 linijce Twojego przykładu, który mi podałeś masz logarytm zwykły a ty go traktujesz jako logarytm naturalny (korzystasz z funkcji log)
W ogóle nie podano podstawy tego logarytmu - mam rozumieć że jest to wtedy logarytm o podstawie dziesiętnej, tak?

logarytm naturalny z liczby ujemnej to liczba zespolona, rozwiązań takiego równania jest wtedy więcej niż 1

moim zdaniem tam jest błąd i powinna być brana wartość bezwzględna z x, ale już sam nie wiem

wyniki dla wartości bezwzględnej z x:
-0.9 11.5236
-0.85 11.1388
-0.8 10.7378
-0.75 10.319
-0.7 9.88049
-0.65 9.88049
-0.6 9.88049
-0.55 -2.2216
-0.5 -2.52086
-0.45 -2.99463
-0.4 -3.84398

po drugie przedział w przykładzie, który mi podałeś jest domknięty z obu stron, a Twój program się tak nie zachowuje ze względu na operator = dla liczb zmiennoprzecinkowych
musisz skorzystać z epsilonu i uwzględnić margines błędu, gdyż program może uznać że 1.00 nie jest równe 1.00.

w Twoim przypadku możesz zwyczajnie zamienić
C/C++
while( x <= b );

na
C/C++
while( x < b + 0.00001 );

P-25868
krajku
Temat założony przez niniejszego użytkownika
» 2010-12-29 16:23:35
no nie powiedziano nam niestety ale jak tylko skończy się czas wolny to się zapytam dziękuje za pomoc
pozdrawiam

Edit: Ison mógłbyś mi wysłać kod po twojej modyfikacji taki jak uważasz że powinien być ??
P-25872
ison
» 2010-12-29 16:36:26
C/C++
#include <fstream>
#include <cmath> //cmath jest z C++, math.h z C
//żadnej innej biblioteki nie potrzebujesz w tym programie, więc po co dołączać więcej bez potrzeby?

const double a =- 0.9, b =- 0.4, step = 0.05; //te zmienne są stałe, nie modyfikujesz ich nigdzie w programie
double x, y;

int main()
{
    std::fstream file; //lepiej używać pojedynczo std::, nie ma wtedy szans na konflikt nazw
    file.open( "kruk03.txt", std::ios::trunc | std::ios::out );
    x = a;
    while( x < b + 0.00001 ) //precyzja wg Twojego uznania
    {
        if( x <=- 0.7 ) y = pow( 3.5 + log( fabs( x ) ), 2 ); //wartość bezwzględna z x
        else if( x >- 0.7 && x >=- 0.6 ) y = tan( x + log( fabs( x ) ) ); //&& oznacza to samo co and
        else if( x >=- 0.6 ) y = log2( fabs( x ) + 0.5 ); //logarytm o podstawie 2, a nie naturalny. wartość bezwzględna z x
       
        file << x << ", " << y << std::endl;
        x += step;
    }
    file.close(); //warto po sobie posprzątać :)
    return 0;
}

//edit teraz dopiero zauważyłem że ta dwójka w trzeciej linijce (szczerze mówiąc dziwny zapis) miała chyba symbolizować podstawę logarytmu a nie kwadrat, takie małe przeoczenie :) - poprawiony kod

zamiast while'a możesz użyc fora - będzie to trochę lepiej wyglądało i skróci kod
C/C++
for( x = a; x < b + 0.00001; x += step )
nie musisz wtedy w bloku dodawać nic do x ani podstawiać pod niego 'a' przed pętlą
P-25878
Elaine
» 2010-12-29 18:50:58
C/C++
file.close(); //warto po sobie posprzątać :)
Toteż przecież to robił, destruktor std::fstream zamyka plik, jeśli jakiś jest otwarty.
P-25899
krajku
Temat założony przez niniejszego użytkownika
» 2011-01-06 15:10:22
Okazało Się że w pierwszej i trzeciej linijce ma być wartość bezwzględna dla całego argumentu a 2 przy logarytmie nie mówi że jest drugiego stopnia tylko logarytm do kwadratu.
Coś takiego:
http://img696.imageshack.us/i/beztytuuztm.jpg/

Mój kod:
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <math.h>

using namespace std;

const double
   a=-0.9,
   b=-0.4,
   step=0.05;
double
   x,y;

int main()
{
    fstream file;
    file.open("kruk03.txt",ios::trunc|ios::out);
    x=a;
    while(x <= b)
    {
               if(x<=-0.7) y=pow((3.5+log(fabs(x))),2);
               else if (x>-0.7 and x<=-0.6) y=tan(x+log(fabs(x)));
               else if (x>=-0.6) y=pow(log10(fabs((x)+0.5)),2);
               file <<x<<","<<y<<"\n";
               x+=step;
   
    }
    file.close();
    return 0;
}
jak ktoś widzi jakieś błędy suggestje to prosze o pomoc ponieważ jestem początkującym w tym i nie do końca wiem co i jak
Pozdrawiam
P-26247
« 1 » 2
  Strona 1 z 2 Następna strona