Forum: Mikrocontroller und Digitale Elektronik Sinus mit Reihenentwicklung in C


von Reihe (Gast)


Lesenswert?

Guten Morgen,

sieht jemand den Fehler in dem unten stehenden Übungsprogramm?
Bei 180° sollte ja eigentlich ein Sinus von 0 rauskommen... tut es aber 
nicht.

Gruß
1
#include <stdio.h>
2
3
#define PI (3.14159f)
4
#define DEG2RAD(x) (PI * (x) / 180.f)
5
#define RAD2DEG(a) (180.f * (a) / PI)
6
7
float power( float base, int exp ) {
8
    
9
    float result = 1.f;
10
    int n = 0;
11
12
    for( n=0; n<exp; ++n ) {
13
       result *= base; 
14
    }
15
16
    return result;
17
}
18
19
float sine( float a ) {
20
    return (a - power(a, 3) / 6.f + power(a, 5) / 120.f );
21
}
22
23
int main( void ) {
24
25
    float angleDegree = 0.f;
26
    float angleRadian = 0.f;
27
28
    puts( "Sinus mit Reihenentwicklung" );
29
30
    printf( "Winkel eingeben: " );
31
    scanf( "%f", &angleDegree );
32
    angleRadian = DEG2RAD( angleDegree );
33
34
    printf("Sinus: %f\n", RAD2DEG( sine(angleRadian) ) );
35
36
return 0;
37
}

: Verschoben durch Moderator
von Max H. (hartl192)


Lesenswert?

Reihe schrieb:
> sieht jemand den Fehler in dem unten stehenden Übungsprogramm?
Du hast zu wenig Reihenglieder verwendet:
http://www.wolframalpha.com/input/?i=plot+x-x^3%2F6%2Bx^5%2F120+and+sin%28x%29+from+-pi+to+pi
Wenn du das mit x^7 noch dazu nimmst wird's besser:
http://www.wolframalpha.com/input/?i=plot+x-x^3%2F6%2Bx^5%2F120-x^7%2F7!+and+sin%28x%29+from+-pi+to+pi

P.S.: Ich sehe jetzt nicht, was die Frage in "Ausbildung, Studium & 
Beruf" zu suchen hat. Je nach Zielplattform wäre sie in µC & Elektronik 
oder PC-Programmierung besser aufgehoben.

: Bearbeitet durch User
von Dumdi D. (dumdidum)


Lesenswert?

Und schmeiss mal das RAD2DEG raus. Das Ergebnis vom Sinus ist ein 
Seitenverhältnis und kein Winkel.

von Sven B. (scummos)


Lesenswert?

Die Reihenentwicklung vom Sinus konvergiert sehr sehr langsam, wenn du 
weit vom Entwicklungspunkt weg bist. Du entwickelst um 0, wenn du damit 
den Sinus von pi ausrechnen willst bist du eine Weile beschäftigt. Mit 3 
Reihengliedern kommst du jedenfalls nicht weit.

In der Praxis ist die Methode mit der Reihenentwicklung ziemlich 
untauglich, außer du willst nur Werte die nahe bei einem bekannten 
Entwicklungspunkt liegen (a ist zum Beispiel eine gute Nährung für 
sin(a) für a < 5°)

von Reihe (Gast)


Lesenswert?

Vielen Dank für eure Antworten. Da ist dann leider doch vieles aus dem 
Studium verschütt gegangen... Immerhin war es "nur" ein logischer 
Fehler.

Gruß

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.