Hallo, wir müssen in der Schule den sin(x) mit Hilfe von C berechnen, wobei der Sinus über ein Taylor-Polynom (Reihe) definiert wird. Man soll am Schluß nur den x-Wert eingeben und das Programm soll dann den errechneten Sinus-Wert ausgeben. Hat irgend jemand eine Ahnung wie das geht, ich als C-Neuling bis jetzt noch nicht. Gruß Martin
also mathematische funktionen sin in C in der math.h definiert Info z.B. hier http://www.fh-fulda.de/~klingebiel/c-stdlib/math.htm oder bei google einfach math.h oder cmath eingeben
@werner ja auf das läufts raus, allerdings nicht mit der e-Funktion und komplex sondern so wie hier http://de.wikipedia.org/wiki/Sinus Weis jetzt nur nicht was genau der Unterschied zum Taylor-Polynom ist
ich würde folgendes vorschlagen: float sin(x, genauigkeit) { float temp; temp = x; for(int n=0;n<genauigkeit;n++) { temp += pow(-1,n) * (pow(x,2*n+1)/fak(2*n + 1)); } return temp; } double fak(x) { double temp; for(int i=1;i<=x;i++) temp*=i; return temp; } nicht getestes...sollt aber hinhaun...
Hallo, hab leider die Aufgabenstellung etwas fehlintepretiert, bei mir muss man den Wert in Grad eingeben, welcher dann ins Bogenmaß umgewandelt wird. Unter Genauigkeit hatte ich eigentlich die Anzahl der Rechenschritte verstanden, wenn man bei mir z.B. 30 eingibt wird 30 mal das x^n ausgerechnet und dann abgebrochen. Die Aufgabenstellung lautet aber: "es soll der sinus einer zahl berechnet werden, wie das geht steht in jeder Formelsammlung!! Also keine Standart c++ funktion benutzen, sondern ein Programm das mit Hilfe von Funktionsaufrufen die Fakultät. die Hochzahl und den Sinus berechnet. Diese 3 Sachen sind auszuprogrammieren!!!! Näheres gibts Montags bzw. Donnerstags während des Praktikums!! Sinnvolles Abruchkriterium für die Genauigkeit der Berechnung 0.000001! Das ganze soll dann auch noch mit der in C++ Standartfunktion verglichen werden!" Vielleicht kann mir jemand weiterhelfen, hab mein Program mal angehängt. Gruß Martin
@tobi, sieht mal nicht schlecht aus, muss man bei dir den x-Wert in Radiant oder in Grad eingeben? weißt du wie das mit der Genauigkeitsabfrage am Anfang gehen könnte, also z.B. Genauigkeit von 0,001 ?
die genauigkeit könnte man evtl dadruch machen, dass man die differenz von 2 aufeinanderfolgenden ergebnissen berechnet und diese mit einer vorgegebenen genauigkeit vergleicht. allerdings solltest du nicht mehr als die benutzten 20 durchläufe machen, da die fakultät sonst zu gross wird und falsche ergebnisse kommen (deswegen hab ich schon __int64 benutzt) das ergebnis ist in rad
Hi du wirst doch hier nicht deine Hausaufgaben vom Forum machen lassen. Wenn das mal dein Tutor erfährt :-) Die Genauigkeit ergibt sich aus dem Term den du immer wieder dazuaddierst/subtrahierst. Also das x^n/n!. Wenn dieser Wert kleiner als die geforderte Ganauigkeit ist hast du die benötigte Genauigkeit erreicht. Matthias
Moin, nur mal so zur Info. In der Praxis wird der sin(x) durch ein Polynom (z.B. ax^2+bx+c)approximiert. Dazu reicht es aus, ein Polynom mit hinreichender Genauigkeit im Bereeich von [0..pi/2] zu finden. Der Rest wird durch Spiegelung und Verschiebung berechnet. Das Polynom wird nach dem Horner-Schema(nur Multiplikationen, keine Potenzen) berechnet. Hoffentlich wars das Hornerschema?! Ist schon so lange her ;-) Grüße Oliver
"du wirst doch hier nicht deine Hausaufgaben vom Forum machen lassen. Wenn das mal dein Tutor erfährt :-)" ich hab auch nur meine hausaufgaben gepostet ;) "Das Polynom wird nach dem Horner-Schema(nur Multiplikationen, keine Potenzen) berechnet.Hoffentlich wars das Hornerschema?!" jep, war es. hast du irgendwo einen guten link, der dieses verfahren mit den polynomen genauer erklärt?
>jep, war es. hast du irgendwo einen guten link, der dieses verfahren
mit den polynomen genauer erklärt?
Nein.
Hab das Rechnen doch noch nicht ganz verlernt :-) Irgendwie so z.B.: ax^3+bx^2+cx+d = ((ax+b)x+c)x+d
Hi simple Interpolation mittels Polynom. Du legst drei Punkte auf die Sinuskurve von 0 bis pi/2 und interpolierst die mit einem Polynom zweiten Grades. Matthias
"Irgendwie so z.B.: ax^3+bx^2+cx+d = ((ax+b)x+c)x+d" Ja so gehts; einfach die Potenzen sukkesiv ausklammern. Ist nicht nur schneller, sondern bringt auch wesentlich geringere Rundungsfehler.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.