Zum Inhalt springen

Potenzreihenentwicklung


IltisvdT

Empfohlene Beiträge

Hallo,

wir sollen folgendes machen:

Es gilt Sin(x)=x-(x^3/3!)+(x^5/5!)... wir sollen ein Programm erstellen, dass einen x Wert ausliest und die Berechnung abbricht, wenn das nächste Glied kleiner als eine einzulesende Genauigkeitsschranke ist.

Das Programm soll eigentlich auch Cos(x) und e^x berechnen, hängen aber schon bei sin(x)...

Dies ist bisher unser Programm:

#include <stdio.h>

#include <math.h>

int main(){

int a;

float x, fak, b, genau, glied, erg, n;

printf("Fuer Sin(x) druecke 1, fuer Cos(x) druecke 2 und fuer e^x 3\n");

scanf("%d", &a);

printf("Bitte x-Wert eingeben!\n");

scanf("%f", &x);

printf("Bitte geben Sie die Genauigkeitsschranke ein!\n");

scanf("%f", &genau);

switch(a)

case 1:

b=3;

erg=x;

glied=x;

for(erg=x; glied>genau; b+2)

{

fak=b;

for(b!=0; b>1; b--)

{

fak=fak*(b-1);

}

printf("%f\n", fak);

glied=pow(x, b)/fak;

erg=erg+glied;

}

printf("%f\n", erg);

return(0);

}

Die erste for-Schleife scheint nicht richtig zu laufen.. irgendwelche Tipps?

Link zu diesem Kommentar
Auf anderen Seiten teilen

So haben nun nochmal etwas verändert. Zum Einen sollte jetzt abwechselnd addiert und subtrahiert werden und zum Anderen haben wir das b+2 geändert. Das Ergebnis ist allerdings immernoch falsch. Die Fakultät scheint er richtig zurechnen, aber dann weiter stimmt es nicht. Tipps?

#include <stdio.h>

#include <math.h>


int main(){

    int a;

    float x, fak, b, genau, glied, erg, n;

    printf("Fuer Sin(x) druecke 1, fuer Cos(x) druecke 2 und fuer e^x 3\n");

    scanf("%d", &a);

    printf("Bitte x-Wert eingeben!\n");

    scanf("%f", &x);

    printf("Bitte geben Sie die Genauigkeitsschranke ein!\n");

    scanf("%f", &genau);

    switch(a)

        case 1:

            b=3;

            erg=x;

            glied=x;

            for(erg=x; glied>genau; b+=2, b=0-

            {

                fak=b;

                for(b!=0; b>1; b--)

                {

                    fak=fak*(b-1);

                }

                    printf("%f\n", fak);


                glied=pow(x, b)/fak;

                erg=erg+glied;

            }

    printf("%f\n", erg);

return(0);

}[/code]

Link zu diesem Kommentar
Auf anderen Seiten teilen

b+=2, b=0-b

Damit wechselst du immer nur zwischen 3 und -5 hin und her.

-5 + 2 = -3

0 - (-3) = 3

Auch bei der Prüfung der Genauigkeit und bei der Fakultätsberechnung hast du nicht beachtet, was passiert, wenn b bzw. glied negativ ist.

Ich würde hier einfach eine weitere Variable einführen, die zwischen 1 und -1 wechselt, und b nur für die Reihe 3, 5, 7... benutzen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok, also das mit dem hin und her wechseln sollte ich hinbekommen haben(denk ich). d habe ich zusetzlich eingefügt, weil b ja sonst in der Fakultätsberechnung verändert werden würde und das sollte ja nicht so sein.

Habe die Wurzelfunktion eingefügt, damit überprüft wird, ob der Betrag kleiner als "1" bzw. "genau" ist, wodurch negative Werte für b und glied ja kein Problem mehr bei der Überprüfung sein sollten..

Jetzt habe ich nur das Problem, dass die Fakultät gar nicht mehr berechnet wird, finde allerdings den Fehler nicht:/

#include <stdio.h>

#include <math.h>


int main(){

    int a, c;

    float x, fak, b, d, genau, glied, erg, n, test, test1;

    printf("Fuer Sin(x) druecke 1, fuer Cos(x) druecke 2 und fuer e^x 3\n");

    scanf("%d", &a);

    printf("Bitte x-Wert eingeben!\n");

    scanf("%f", &x);

    printf("Bitte geben Sie die Genauigkeitsschranke ein!\n");

    scanf("%f", &genau);

    switch(a)

        case 1:

            b=3;

            erg=x;

            glied=x;

            for(c=1; test>genau; b+=2, c=-c)

            {

                b=b*c;

                fak=b;

                d=b;

                for(; test1!=1; d--)

                {

                    fak=fak*(d-1);

                    test1=sqrt(d*d);

                }

                    printf("%f\n", fak);


                glied=pow(x, b)/fak;

                erg=erg+glied;

                test=sqrt(glied*glied);

            }

    printf("%f\n", erg);

return(0);

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok, also das mit dem hin und her wechseln sollte ich hinbekommen haben(denk ich).
Nein, hast du nicht. b wechselt immer noch das Vorzeichen. Dadurch, dass du das aus dem Schleifenkopf in den Rumpf verschoben hast, hast du nichts verbessert.

Lass b und glied immer positiv sein, und verwende c als Faktor beim Aufsummieren des Ergebnisses. Dann kannst du dir diese Wurzelzieherei sparen.

Außerdem solltest du dir dringend angewöhnen, alle Variablen zu initialisieren, ansonsten stehen da irgendwelche Werte drin. Du verwendest test und test1, bevor du ihnen irgendetwas zuweist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...