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
#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 |
|
ison |
» 2010-12-29 15:51:31 if( x <=- 0.7 ) y = pow( 3.5 + log( x ), 2 ); |
logarytm dla liczb ujemnych? |
|
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 |
|
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ć na while( x < b + 0.00001 );
|
|
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ć ?? |
|
ison |
» 2010-12-29 16:36:26 #include <fstream> #include <cmath>
const double a =- 0.9, b =- 0.4, step = 0.05; double x, y;
int main() { std::fstream file; file.open( "kruk03.txt", std::ios::trunc | std::ios::out ); x = a; while( x < b + 0.00001 ) { if( x <=- 0.7 ) y = pow( 3.5 + log( fabs( x ) ), 2 ); else if( x >- 0.7 && x >=- 0.6 ) y = tan( x + log( fabs( x ) ) ); else if( x >=- 0.6 ) y = log2( fabs( x ) + 0.5 ); file << x << ", " << y << std::endl; x += step; } file.close(); 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 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ą |
|
Elaine |
» 2010-12-29 18:50:58 Toteż przecież to robił, destruktor std::fstream zamyka plik, jeśli jakiś jest otwarty. |
|
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 |
|
« 1 » 2 |