endlose sinus-Berechnung
-
Hallo,
will gerade die Sinusberechnung bzw. eine Annäherung mit C schreiben und anschließend mit dem Ergebnis von sin() aus math.h vergleichen.
Die Formel zur Annäherung habe ich im Kommentar im Code noch dazugeschrieben.
Jedenfalls handelt es sich eigentlich um eine Summe bis unendlich. Jedoch soll bei der Annäherung die Schleife dann beendet werden, wenn sich der neue Wert der Summe sum nicht um mehr als 10^-6 unterscheidet. Da bei jedem Durchlauf des Rumpfes sum+=s_n; ausgeführt wird, is der Betrag von s_n genau der Unterschied zur zuvor berechneten Summe.#include <stdio.h> #include <math.h> int main() { double sum=0,sum_0=0; double k=0; double s_n=0; double differenz=0; //0)Transformation von x in [0,2pi] double x=1.6; //1.1) sin x= Summe von k=0 zu unendlich: (-1)^k*x^(2*k+1)/(2k+1) //1.2)mind. Differenz zweier Approximationen: 10^(-6) => Abbruch do { sum_0=sum; s_n=pow((-1),k)*pow(x,(2*k+1))/(2*k+1); sum+=s_n; k++; differenz=((s_n<0)?-s_n:s_n); printf("%le => %le\n",s_n,differenz); if(k>1000)//durchbricht meine Endlosschleife... break; } while(differenz>pow(10,(-6))); printf("\napproximative Summe [k=%le]: %le",k,sum); printf("\n\nexakter Sinuswert: %le",sin(x)); //2) Vgl mit sin() aus math.h printf("\n\nUnterschied: %le",(sum-sin(x))); getchar(); }
Irgendwann wird die Differenz immer gleich 1 sein, was eigentlich nicht passieren dürfte, da es somit endlos ausgeführt würde ohne break
Seht Ihr den semantischen Fehler?
Danke!
-
Hi,
du hast bei der Berechnung vergessen, dass der Nenner eines jeden Summanden
nicht 2k+1 sondern die Fakultät davon ist. Hier mal die verbesserte Version.#include <stdio.h> #include <math.h> int main() { double sum = 0.; double s_n = 0., approx = pow(10., -6.); int k = 0; /*0)Transformation von x in [0,2pi] */ double x = 1.6; /* 1.1) sin x= Summe von k=0 zu unendlich: (-1)^k*x^(2*k+1)/(2k+1)! */ /* <-- Fakultaet vergessen */ /* 1.2) mind. Differenz zweier Approximationen: 10^(-6) => Abbruch */ do { s_n = k>0 ? s_n * (x*x / (double)((2*k+1)*(2*k))) : x; sum = k%2 ? sum - s_n : sum + s_n; printf("k: %2d %c s_n = %.9f sum: %12.9f\n", k, k%2 ? '-' : '+', s_n, sum); k++; if(k>1000)/*durchbricht meine Endlosschleife... */ break; } while(s_n>approx); printf("Abbruch bei: %.9f\n", approx); printf("\napproximative Summe [k=%2d]: %.9f\n", k, sum); printf("exakter Sinuswert: sin(%.2f) = %.9f\n", x, sin(x)); /*2) Vgl mit sin() aus math.h*/ printf("Unterschied: %.2e\n", (sum-sin(x))); getchar(); return 0; }
Eigentlich wollte ich das hier nicht posten, da es einige gibt, die
dieselbe Aufgabe machen, dabei aber bei weitem nicht so weit sind und
jetzt schon nach der Lösung fragen. Aber du hast es ja schon ziemlich
weit und gut geschafft.Viel Spaß damit.
Gruß mcr
-
Meld dich, solltest du noch Fragen haben.
Verstehst du, was in den Zeilen 13+14 mathematisch passiert?
Diese beiden Zeilen sind auf jeden Fall der Knackpunkt.Gruß mcr
-
Danke, ja, habs verstanden.
War ein dummer Fehler, da ich bei der Aufgabenstellung als endendes Satzzeichen interpretiert habe und nicht als Fakultät
Wenn es nicht im Sinne der Allgemeinheit ist, dass dieses Bsp. hier im Forum steht, löscht es einfach. Hätte nichts dagegen.
Schönes Wochenende