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

[C++] Obliczyć przybliżoną wartość funkcji - POMOCY

Ostatnio zmodyfikowano 2017-06-06 15:15
Autor Wiadomość
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
C/C++
#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;
}
P-162130
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 = ... 
P-162134
piotrek424
Temat założony przez niniejszego użytkownika
» 2017-06-06 13:21:54
Czyli teraz będzie dobrze?
C/C++
#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;
}
P-162135
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.
P-162136
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?
C/C++
#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;
}
P-162138
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:

C/C++
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 : )
P-162139
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?
P-162140
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.
P-162141
« 1 » 2
  Strona 1 z 2 Następna strona