Problem mit C++ Programm zur Berechnung tan(x)



  • Hallo liebe Leute, ... ich hab ein kleines grosses Problem und hoffe hier nun auf Hilfe zu stossen, ... eines vorne weg, ich erwarte von niemanden das er mir Hilft, schliesslich geht es um eure "Freizeit" ... wäre aber schön wenn einer Zeit hätte mir das Programm zu schreiben.

    Ich habe inzwischen schon viele versuche hinter mir aber ich komme zu keinem wirklichen Ergebnis. Irgendwie ist das für mich ein Buch mit mehr als 7 Siegeln. Zu mir, ich studiere an einer TU und musste Informatik belegen, ... nun müssen wir einen Beleg machen ... wo ich einfach nicht durch sehe.

    Folgende Aufgabe:

    Entwerfen und implementieren Sie ein C++-Programm, welches Funktionswerte der hyperbolischen Funktion

    y = f(x) = tan(x)

    berechnet.

    Verwenden Sie dazu die folgende Summenformel:

    http://img136.imageshack.us/img136/3826/beleg107htmlm5fe3f732jq0.gif
    Die Berechnung soll abbrechen, wenn die Differenz zweier aufeinanderfolger Glieder z i und z i+1 kleiner als ein zudefinierender Abbruchwert epsilon wird oder aber wenn maximal 11 Summenglieder berechnet wurden.

    Testen Sie zunächst, ob der Nutzer ein x eingeben hat, welches dem Definitionsbereich der Summenformel entspricht.

    Hinweis:
    Die Bernoulischen Zahlen Bn für die n = 1..11 sind in folgender Tabelle enthalten :
    n Bn
    1 1/6
    2 1/30
    3 1/42
    4 1/30
    5 5/66
    6 691/2739
    7 7/6
    8 3617/510
    9 43867/510
    10 174611/330
    11 854513/138

    Verwenden Sie zur Berechnung von mindestens drei Funktionswerten die o.g. Summenformel und vergleichen das dort berechnete Ergebnis mit dem Ergebnis der Verwendung der Standardfunktion tan(x). Diskutieren Sie kurz im Kommentar die Ergebnisse.

    Jo, ... das ist die Aufgabe. Glaubt mir, das ich froh wäre, die Aufgabe selbst lösen zu können 😞 bis zur richtigen Prüfung muss ich es dann zwar können ... aber bis dahin würdet ihr mir wirklich sehr helfen.

    Wer also Lust hätte sich an die Aufgabe heran zu wagen, ... wäre ich sehr Dankbar...Irgendwie muss ich aber auch sagen, das ich es für etwas übertrieben finde eine solche Aufgabe, einen ... naja C++ n00b vorzulegen 😞



  • vielleicht könnte mir auch jmd. nur den Berechnungsteil geben und ich versuche dann das drum herum noch zu bauen ... !?



  • Was hast du denn bis jetzt geschafft? Du brauchst eine Schleife, die nacheinander die einzelnen Summanden ermittelt und zusammenfasst:

    double sum = x, potenz = x*x*x, factor;
    for(int i=0;i<10;++i)
    {
      factor = ...;//irgendwas muß ich ja auch für dich aufheben
      sum+=factor*potenz;
      if(factor*potenz<epsilon)break;
      factor*=x*x;
    }
    


  • ich verstehe erstmal gar ne wie ich halt an die Aufgabe heran gehen muss ... die Summen Formel die er mir gegeben hat, ... ich muss also zuerst den Wert für x, dann 1/3x³ usw. nacheinander ausrechnen?
    Hab noch nie was Programmiert und dann kommt so´n Aufgabenklotz 😕

    An Quellcode habe ich nur gesabber ... wie gesagt ich steige einfach nich dahinter 😞



  • Die benötigten Werte für die Bn in der Formel hast du doch in der Aufgabe gegeben - da würde ich vermutlich die Faktoren von Hand ausrechnen und in ein Array reinpacken 😉 (das im Nenner ist eine "Fakultät", falls du damit Probleme haben solltest :D)



  • das mit der Fakultät ist schon klar 😉 ... und wie pack ich das in ein Arry !?

    meinst sowas in der Art?

    float fBernouli[11] = {0.166667f,0.0333333f,0.0238095f,0.0333333f,0.757576f,0.253114f,1.16667f,7.092167f,54.9712f,529.124f,6192.12f};
    

    PS: Hab das wo raus kopiert, ... wofür steht das f hinter den Zahlen?



  • Das f steht dafür das diese Zahlen als float und nicht als double (doppelte Präzision) gehandelt werden.



  • und da double groessere Genauigkeit hat und Speicherplatz nicht das Problem sein sollte kannst du das f weglassen und lieber noch ein paar Nachkommastellen dranhaengen 😉



  • Was natürlich nur was bringt wenn du aus float fBernouli[11] folgendes machst: double fBernouli[11]



  • McKofFly schrieb:

    Zu mir, ich studiere an einer TU und musste Informatik belegen, ...

    was studierst Du denn im Hauptfach?

    McKofFly schrieb:

    Hinweis:
    Die Bernoulischen Zahlen Bn für die n = 1..11 sind in folgender Tabelle enthalten :
    n Bn
    1 1/6
    2 1/30
    3 1/42
    4 1/30
    5 5/66
    6 691/2739
    7 7/6
    8 3617/510
    9 43867/510
    10 174611/330
    11 854513/138

    Die Zahlen Bn[6] und Bn[9] sind falsch - korrekt ist:

    n Bn
    6 691/2730
    9 43867/798

    Im Zweifel bei MathWorld nachschauen.

    McKofFly schrieb:

    vielleicht könnte mir auch jmd. nur den Berechnungsteil geben und ich versuche dann das drum herum noch zu bauen ... !?

    Machen wir's doch umgekehrt. Präsentiere Du uns Dein Programm - z.B. mit einer leeren Funktion

    double tan_( double x )
    

    die diese Berechnung enthalten müsste und lass die Funktion leer, wenn Du nicht weißt wie es geht.
    CStoll hat ja schon einen Hinweis gegeben.

    McKofFly schrieb:

    meinst sowas in der Art?

    float fBernouli[11] = {0.166667f,0.0333333f,0.0238095f,0.0333333f,0.757576f,0.253114f,1.16667f,7.092167f,54.9712f,529.124f,6192.12f};
    

    Besser ist es, die Brüche so hinzuschreiben, wie sie angegeben sind. Dann minimierst Du die Rundungsfehler - also:

    // Bernoulli-Zahlen
    const double Bn[] = {
        1./6,
        1./30,
        1./42,
        1./30,
        5./66,
        691./2730, // 691/2739 ist falsch
        7./6,
        3617./510,
        43867./798, // 43867/510 ist falsch
        174611./330,
        854513./138
    };
    

    Gruß
    Werner


Anmelden zum Antworten