piotrek424 Temat założony przez niniejszego użytkownika |
[C++] Obliczyć przybliżoną wartość funkcji - POMOCY » 2017-06-06 12:46:32 Witajcie. Studiuję chemię i mam jeden przedmiot o nazwie metody obliczeniowe na którym programujemy. Niestety to nie jest moja bajka. Mam takie zadanie Obliczyć przybliżoną wartość funkcji Sprawdzić wpływ liczby wyrazów szeregu (wielkości obcięcia wyrazów szeregu ɛ) oraz typu zmiennych na wynik przybliżenia Wstępnie napisałem coś takiego ale nie wiem czy o to właśnie chodzi. Bardzo proszę o pomoc #include <iostream> #include <cstdlib> #include <cmath> using namespace std; float potega( float podstawa, float wykladnik ) { int wynik = 1; for( int i = 0; i < wykladnik; i++ ) wynik *= podstawa; return wynik; }
double silnia( int n ) { if( n == 0 ) return 1; else return silnia( n - 1 ) * n; }
int main() { float x; float k; float lewa, prawa; cout << "Podaj x < 1: "; cin >> x; while( x >= 1 ) { cout << "Podaj ponownie prawidlowa wartosc: x < 1: "; cin >> x; } cout << "Podaj k <= 0: "; cin >> k; while( k > 0 ) { cout << "Podaj ponownie prawidlowa wartosc: k <= 0: "; cin >> k; } lewa = sqrt( x + 1 ); prawa =( potega( - 1, k ) * silnia( 2 * k ) ) /(( 1 - 2 * k ) * potega( silnia( k ), 2 ) * potega( 4, k ) ) * potega( x, k ); cout << "Wynik lewej strony wyrazenia:" << lewa << endl; cout << "Wynik prawej strony wyrazenia:" << prawa; getchar(); return 0; }
|
|
darko202 |
» 2017-06-06 13:12:20 1. obliczasz wartość przez szereg zbieżny, czyli liczysz dla jakiegoś k ale musisz wiedzieć, że k! szybko przekroczy wartość typu int dlatego zaprezentowane obliczenia nie zadziałają prawidłowo chyba że wystarczą małe k
2 ? lewa = sqrt( x + 1 ); wartość nikogo nie zainteresuje :(
bo to masz obliczyć, przez szereg zbieżny czyli to co zawarłeś w prawa = ... |
|
piotrek424 Temat założony przez niniejszego użytkownika |
» 2017-06-06 13:21:54 Czyli teraz będzie dobrze? #include <iostream> #include <cstdlib> #include <cmath> using namespace std; float potega( float podstawa, float wykladnik ) { int wynik = 1; for( int i = 0; i < wykladnik; i++ ) wynik *= podstawa; return wynik; }
double silnia( float n ) { if( n == 0 ) return 1; else return silnia( n - 1 ) * n; }
int main() { float x; float k; float lewa, prawa; cout << "Podaj x < 1: "; cin >> x; while( x >= 1 ) { cout << "Podaj ponownie prawidlowa wartosc: x < 1: "; cin >> x; } cout << "Podaj k <= 0: "; cin >> k; while( k > 0 ) { cout << "Podaj ponownie prawidlowa wartosc: k <= 0: "; cin >> k; } wynik =( potega( - 1, k ) * silnia( 2 * k ) ) /(( 1 - 2 * k ) * potega( silnia( k ), 2 ) * potega( 4, k ) ) * potega( x, k ); cout << "Wynik funkcji:" << wynik; getchar(); return 0; }
|
|
hit |
» 2017-06-06 13:28:33 A próbowałeś to w ogóle skompilować? Nie będzie dobrze. 'wynik' was not declared in this scope Poza tym wykorzystujesz bibilotekę cmath, która zawiera funkcje służące potęgowaniu m.in. więc nie musiałeś pisać własnej funkcji. Edit: Ten wzór jest sumą, czyli powinieneś użyć pętli i sumować wyniki wzoru, który obliczasz podając prawidłowe k. Edit2: cout << "Podaj ponownie prawidlowa wartosc: k <= 0: "; Wg mnie k powinno być większe od 0. |
|
piotrek424 Temat założony przez niniejszego użytkownika |
» 2017-06-06 14:05:42 Ok rzeczywiście nie było jeszcze zadeklarowanej zmiennej wynik, k powinno być większe oraz jest funkcja potęgowania. Wprowadziłem poprawki i teraz kod wygląda następująco. Czy samo działanie jest poprawnie zapisane? #include <iostream> #include <cstdlib> #include <cmath> using namespace std; double silnia( int n ) { if( n == 0 ) return 1; else return silnia( n - 1 ) * n; }
int main() { float x; float k; float wynik; cout << "Podaj x < 1: "; cin >> x; while( x >= 1 ) { cout << "Podaj ponownie prawidlowa wartosc: x < 1: "; cin >> x; } cout << "Podaj k >= 0: "; cin >> k; while( k < 0 ) { cout << "Podaj ponownie prawidlowa wartosc: k >= 0: "; cin >> k; } wynik =( pow( - 1, k ) * silnia( 2 * k ) ) /(( 1 - 2 * k ) * pow( silnia( k ), 2 ) * pow( 4, k ) ) * pow( x, k ); cout << "Wynik funkcji:" << wynik; getchar(); return 0; }
|
|
hit |
» 2017-06-06 14:14:28 Wg mnie nie do końca. Zgodnie z tym co napisałem "Ten wzór jest sumą, czyli powinieneś użyć pętli i sumować wyniki wzoru, który obliczasz podając prawidłowe k." Czyli abstrahując od poprawności samego wzoru: float wynik = 0;
for( int i = 0; i < k; i++ ) wynik +=( pow( - 1, i ) * silnia( 2 * i ) ) /(( 1 - 2 * i ) * pow( silnia( i ), 2 ) * pow( 4, i ) ) * pow( x, i );
chyba coś takiego. Edit: Sprawdziłem i liczy ok : ) |
|
piotrek424 Temat założony przez niniejszego użytkownika |
» 2017-06-06 14:25:25 Przy takim działaniu wartości które otrzymuje przy tych samych parametrach są zupełnie inne. Reasumując podałem 1 i -3. W mojej wersji programu wynik był -0.0625 W twojej wersji 0.375
I teraz, który zapis jest poprawny? |
|
hit |
» 2017-06-06 14:28:37 Nie rozumiem, przecież x powinien być z przedziału 0 - 0.9, a k>0. Dlaczego zatem 1 i -3 ?
A co do różnych wartości to nic dziwnego, w końcu Ty wyświetlasz tylko jeden wyraz, a ja ich sumę.
Edit:
Poza tym wg mnie dobrze, że wyświetlałeś lewą stronę wyrażenia bo od razu mogłeś widzieć różnicę w wyniku w zależności od podanego k. |
|
« 1 » 2 |