Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Problem mit coth(x) Funktion

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
12.01.2012, 18:09 Uhr
~beamham92
Gast


Ich möchte ein Programm schreiben, das mithilfe einer Folge den Cotangens Hyperbolicus berechnet. Habe das Programm soweit fertig bekomme aber verrückte Werte als Ergebnis:

"Bitte geben sie einen Wert fuer x ein: 1

Bitte geben sie einen Wert fuer Epsilon ein: 0.0000001

f(x)=coth(x)= 3.95673e+306
Vergleichswert= 1.31304
Process returned 0 (0x0) execution time : 7.086 s
Press any key to continue.



C++:
#include <iostream>
#include <cmath>
using namespace std;

// Das Programm berechnet den Kotangens Hyperbolicus einer Zahl x, für 0<|x|<pi;
// Zur Berechnung wird die Summenformel in der Form      (((-1)^(n+1)*2^(2*n))/((2*n)!))*B[n]*x^(2*n-1) benutzt;
// Die Berechnung wird solagne durchgeführt bis der Betrag der Differenz zweier;
// aufeinanderfolger Glieder kleiner als ein zudefinierender Abruchwert epsilon            ist;
// oder n den Wert 12 erreicht hat;


    // Funktion zur Potenzberechnung

    float potenz (float basis, float expo)
    {
        if (expo==0){
                    return 1;
                    }

    float pot=basis;

    for(int i=1; i<expo; i++){
            pot=pot*basis;
            }

    return pot;

    }

    // Funktion zur Fakultätsberechnung

    int fakultaet (int f)
{
    if (f==0)
    {
        return 1;
    }

    int fak = 1;

    for (int i=1;i<=f;i++)
    {
        fak = i*fak;
    }
        return fak;
}

int main()
{
    // Variabeldeklination

    double pote1, pote2, pote3, exp1, exp2, exp3, x, B[12], pi, epsilon,  ergebnis, zaehler, nenner, z1, z2;
    int faku, n;

    pi = 3.14159265;
    B[1] = 1.0/6;
    B[2] = 1.0/30;
    B[3] = 1.0/42;
    B[4] = 1.0/30;
    B[5] = 5.0/66;
    B[6] = 691.0/2730;
    B[7] = 7.0/6;
    B[8] = 3617.0/510;
    B[9] = 43867.0/798;
    B[10] = 174611.0/330;
    B[11] = 854513.0/138;
    B[12] = 236364091/2730;
    ergebnis = 1/x;
    z1 = 0;
    n = 1;
    zaehler = 0;
    nenner = 1;

    //Abfrage von x

    cout << "Bitte geben sie einen Wert fuer x ein: ";
    cin >> x;
    cout << '\n';

    if (fabs(x)<=0 || fabs(x)>=pi)
    {
        cout << "Ihr Wert liegt nicht im Definitionsbereich!" << '\n';
        cout << "Bitte geben sie einen neuen Wert fuer x ein: ";
        cin >> x;
        cout << '\n';
    }

    // Abfrage von Epsilon
    // Je kleiner Epsilon gewählt wird, desto genauer ist das Ergebnis

    cout << "Bitte geben sie einen Wert fuer Epsilon ein: ";
    cin >> epsilon;
    cout << '\n';

    if (epsilon<=0)
    {
        cout << "Ihr Wert liegt nicht im Definitionsbereich!" << '\n';
        cout << "Bitte geben sie einen neuen Wert fuer Epsilon ein: ";
        cin >> epsilon;
        cout << '\n';
    }

    do {

        //Berechnung des Zaehlers
        exp1 = n+1;
        exp2 = 2*n;
        exp3 = 2*n-1;
        pote1 = potenz(-1,exp1);
        pote2 = potenz(2,exp2);
        pote3 = potenz(x,exp3);
        zaehler = pote1 * pote2 * pote3 * B[n];

        //Berechnung des Nenners
        faku = 2*n;
        nenner = fakultaet(faku);

        //Summandenberechnung

        z2 = z1;
        z1 = zaehler/nenner;

        //Berechnung des Ergebnisses

        ergebnis = ergebnis + z1;

        //Zählvariable n erhöhen

        n++;
    }

    // Prüfung des Abbruchwertes
    while (fabs(fabs(z2)-fabs(z1)) > epsilon && n<12) ;

    //Ausgabe des Ergbenisses

    cout << "f(x)=coth(x)= " << ergebnis << '\n';

    //Ausgabe des Vergleichswertes aus Mathebibliothek mit coth(x)=cosh(x)/sinh(x)

    double coth = cosh(x)/sinh(x);
    cout << "Vergleichswert= " << coth ;

    }


Könnt ihr mir vielleicht weiterhelfen, ich finde den Fehler nicht.

Freundliche Grüße

Dieser Post wurde am 13.01.2012 um 11:51 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.01.2012, 22:04 Uhr
ao

(Operator)



C++:
    B[12] = 236364091/2730;
    ergebnis = 1/x;


Das x ist an dieser Stelle nicht initialisiert, hat also einen zufälligen Wert. Der Kehrwert davon wird in ergebnis gespeichert, und dieser anfängliche Fehler setzt sich fort.

Du musst zuerst das x abfragen und dann ergebnis = 1/x bilden.

Und für B12 must du eine Fließkomma-Division machen, wie für die anderen auch. Aber das ist nur ein kleiner Fehler.

Und wenn du ein Array B von Index 1 bis 12 brauchst, musst du float B[13] deklarieren (es geht immer mit 0 los).

Anderer Ansatz: Ich hab die Reihenentwicklung hier gefunden: http://mathworld.wolfram.com/HyperbolicCotangent.html, Gleichung (6). Wenn mich nicht alles täuscht, kannst du auch das 1/x weglassen und stattdessen die Summe von 0 bis unendlich laufenlassen. Das 0-te Reihenglied ist identisch mit 1/x (glaub ich), und die Bernoullizahl B0 ist auch 1.

Dieser Post wurde am 12.01.2012 um 22:06 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: