Forum: PC-Programmierung sin x mit c berechnen


von martin (Gast)


Lesenswert?

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

von bruzzler (Gast)


Lesenswert?

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

von Werner (Gast)


Angehängte Dateien:

Lesenswert?

Ich glaube, er meint eher sowas...

von martin (Gast)


Angehängte Dateien:

Lesenswert?

@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

von waquner (Gast)


Lesenswert?

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...

von martin (Gast)


Angehängte Dateien:

Lesenswert?

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

von Tobi (Gast)


Angehängte Dateien:

Lesenswert?

ist glaub ich was ähnliches, musst du nur noch entprechend erweitern

von martin (Gast)


Lesenswert?

@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 ?

von Tobi (Gast)


Lesenswert?

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

von Matthias (Gast)


Lesenswert?

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

von Oliver (Gast)


Lesenswert?

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

von Tobi (Gast)


Lesenswert?

"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?

von Oliver (Gast)


Lesenswert?

>jep, war es. hast du irgendwo einen guten link, der dieses verfahren
mit den polynomen genauer erklärt?
Nein.

von Oliver (Gast)


Lesenswert?

Hab das Rechnen doch noch nicht ganz verlernt :-)

Irgendwie so z.B.:

ax^3+bx^2+cx+d = ((ax+b)x+c)x+d

von Matthias (Gast)


Lesenswert?

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

von Sepp (Gast)


Lesenswert?

"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
Noch kein Account? Hier anmelden.