Reihenentwicklung von sin(x)
-
Servus,
muss gerade für eine Hausarbeit ein Prgramm schreiben um den Näherungswert der Reihe
sin(x) = sum(n=0, n=oo) [(-1)^n * (x^(2n+1))/((2n+1)!)] = x/1! -x^3/3! +x^5/5! -...mit einer Genauigkeit von 10^-8 zu berechnen.
Hab ich vorher schonmal für e^x gemacht und wollte jetzt eigentlich den Programmtext kurz umschreiben aber bin auf das Problem gestoßen, dass eben die Potenzen immer ungerade und die Vorzeichen abwechselnd sind und steh gerade irgendwie aufm Schlauch.
Hier auf jeden Fall mal was ich aus vorherigen Aufgabe schon habe...weil Herr Professor natürlich immer gern den selben Ablauf hätte:
/* Programm zur Reihenentwicklung von sin(x) */
#include <iostream>
#include <math.h>
#include <cstdlib>
#include <fstream>
#include <iomanip>
#include "bruch.h"using namespace std;
// Variablendefinitionen
double summe_alt=1;
double summe_neu;
double x;
double eps=10e-08;
int i=1;
double differenz;
double funktionswert;
double differenz_naeherung_funktion;
double Anfangswert;
double Endwert;
double Schrittweite;// Ausgabe auf Datei mit file_raus:
ofstream out("formatierte_Ausgabe.txt", ios::out);// Beginn der Main-Funktion:
int main()
{
bruch term;
term.zaehler_alt=1;
term.nenner_alt=1;
term.zaehler_neu;
term.nenner_neu;cout<<"Die Funktion sin(x) soll durch eine Reihenentwicklung fuer mehrere x \n"<<endl;
cout<<"zwischen einem gegebenen Anfangswert und einem gegebenen Endwert berechnet werden.\n"<<endl;
cout<<"Die Schrittweise zwischen den einzelnen x ist ebenfalls gegeben.\n"<<endl;// Einlesen des Anfangswerts, des Endwerts und der Schrittweite:
cout<<"Geben Sie bitte einen Anfangswert fuer x ein!"<<endl;
cin>>Anfangswert;
cout<<"Geben Sie bitte einen Endwert fuer x ein!"<<endl;
cin>>Endwert;
cout<<"Geben Sie bitte eine Schrittweite an!"<<endl;
cin>>Schrittweite;cout<<"\nAnfangswert = "<<Anfangswert<<endl;
cout<<"Endwert = "<<Endwert<<endl;
cout<<"Schrittweite = "<<Schrittweite<<"\n"<<endl;out<<"\n\nFormatierte Ausgabe:\n"<<endl;
for(x=Anfangswert; x<=Endwert; x=x+Schrittweite)
{
// do-while-Schleife zum Aufsummieren der einzelnen Reihenwerte
do
{ //vor einem "Rechendurchgang":
/* cout<<"\nsumme_alt= "<<summe_alt<<endl;
cout<<"zaehler_alt= "<<term.zaehler_alt<<endl;
cout<<"nenner_alt= "<<term.nenner_alt<<"\n"<<endl;
cout<<"i= "<<i<<endl;
/
//Berechnung der neuen Werte:
term.zaehler_neu=term.zaehler_alt(XXXX);
term.nenner_neu=term.nenner_alt*(XXXX)
summe_neu=summe_alt+term.zaehler_neu/term.nenner_neu;//nach dem "Rechendurchgang":
/* cout<<"\nzaehler_neu= "<<term.zaehler_neu<<endl;
cout<<"nenner_neu= "<<term.nenner_neu<<endl;
cout<<"summe_neu= "<<summe_neu<<"\n"<<endl;
*///Erhöhung von i (je Rechendurchgang um 1):
i=i+1;
// cout<<"\ni= "<<i<<endl;//Differenz zwischen neuer und alter Summe
// => muss überhaupt noch weiter gerechnet werden?
differenz=fabs(summe_neu-summe_alt);
// cout<<"differenz= "<<differenz<<endl;//Startwerte fuer einen moeglichen naechsten Rechendurchgang:
term.zaehler_alt=term.zaehler_neu;
term.nenner_alt=term.nenner_neu;
summe_alt=summe_neu;}
while (differenz>eps);//Startwerte fuer eine moegliche Wiederholung der Schleife:
summe_alt=1;
term.zaehler_alt=1;
term.nenner_alt=1;
i=1;//Ausgabe des Naeherungswertes:
// cout<<"\n\nDie neue Summe betraegt: Summe = "<<summe_neu<<endl;//Berechnung und Ausgabe des Funktionswertes:
funktionswert=sin(x);
// cout<<"Der Funktionswert ist: Funktionswert = "<<funktionswert<<endl;//Berechnung der Differenz zwischen Naeherungswert und Funktionswert:
differenz_naeherung_funktion=fabs(summe_neu-funktionswert);
// cout<<"Die Differenz zwischen dem Naeherungswert und dem Funktionswert betraegt:\nDifferenz = "<<differenz_naeherung_funktion<<endl;//Formatierte Ausgabe:
out<<setw(16)<<"Naeherungswert"<<setw(16)<<"Funktionswert"<<setw(16)<<"Differenz"<<endl;
out<<setw(16)<<setprecision(9)<<summe_neu<<setw(16)<<setprecision(9)<<funktionswert<<setw(16)<<setprecision(9)<<differenz_naeherung_funktion<<"\n"<<endl;
}system("PAUSE");
return(0);
}Ist jetzt auch schon wieder ne Weilde her, dass ich das letzte Mal ein Programm geschrieben habe aber vielleicht kann mir ja jemand weiterhelfen.
Vielen Dank schonmal.
-
Hi,
int i = 1; term.zaehler_neu=x; term.nenner_neu=1; do { : : i+=2; term.zaehler_neu=term.zaehler_alt * x * x * (-1); term.nenner_neu=term.nenner_alt * i * (i - 1); : : } while(differenz> eps);
So sollte es gehen.
Mfg
-
Beim nächsten Mal bitte Code-Tags benutzen, damit das Lesen ein wenig angenehmer ist.
-
Okay, werd ich machen und merci für die Antwort!