C Quadratwurzelfunktion durch Reihenentwicklung berechnen

C3Tn1K

Cadet 4th Year
Registriert
Apr. 2005
Beiträge
111
Hallo Zusammen,
ich komme bei folgendem Programm nicht weiter.
Wir sollen die Quadratwurzel von x+1 errechnen mit Hilfe der Reihentwicklung.
Hierbei soll der Wertebereich x <= 1 betrachtet werden.

Für diesen Fall gilt folgende Summenregel:
Summenregel

Die Aufgabenstellung sieht dann wie folgt aus :
Ihr Programm soll einen Wert für x als Benutzereingabe einlesen (Datentyp double). Danach soll mit einer for–Schleife die Reihe der Quadratwurzelfunktion von k=0 bis k=Ihre_Matrikel_Nummer%100 (mindestens jedoch bis k=10) berechnet werden. Die Reihe soll also abgebrochen werden, wenn k den Wert erreicht, der sich als Rest der Integer- Division Ihrer Matrikelnummer durch 100 ergibt. Wenn dieser Wert kleiner als 10 ist, soll bis k=10 gelaufen werden (if Anweisung verwenden!). Bei jedem Schleifendurchlauf sollen der Wert für k und der aktuelle Summenwert der Reihe mit printf ausgegeben werden.

Mein Programm sieht bisher so aus:
Code:
int main (void) 
{ 
  
int Matrikelnr= 609161; 
double k=Matrikelnr%100; 
double var=1; 
double x; 
int i; 
double pot = 1; 
double wurzel = 1; 
int hochzahl= 1; 
int divi=2; 
  
scanf("%lf", &x); // Einlesen 
 printf("x:%f\n", x+1); /*Ausgabe von x*/ 
  
if (k <10) 
k=10; 
  
for(i = 1; i <= k; i++) { 
hochzahl = (x*i)+1; 
printf("hochzahl:%d\n", hochzahl);    
divi= (x*i)+2; 
printf("div:%d\n", divi); 
pot = pot*x; // potenz 
printf("pot:%f\n", pot); 
wurzel =wurzel+(hochzahl/divi); // Wurzel 
  
printf("k:%f\n", k); 
printf("ex:%f\n......\n",expo); 
  }}

Ich weiß, da fällt noch einiges. Jedoch kann ich dieses noch leicht einbauen Probleme habe ich mit der Summenregel.
Wie kann ich im Nenner nur ungerade Zahlen multiplizieren und im Zähler gerade?
Und vor allem wie schaffe ich es bei jedem Durchlauf der Schleife abwechselnd zu addieren bzw. subtrahieren?

Hoffe ihr habt ein paar Tipps für mich.

Vielen Dank im voraus,
c3tn1k
 
Wie kann ich im Nenner nur ungerade Zahlen multiplizieren und im Zähler gerade?
Zwei Schleifen. Die eine beginnt bei 0 und die andere bei 1. Mit jeder Iteration zählst du zwei zur Zählervariablen (i = i +2) dazu.

Und vor allem wie schaffe ich es bei jedem Durchlauf der Schleife abwechselnd zu addieren bzw. subtrahieren?
Einfach -1^i rechnen. Damit oszilliert das Ergebnis zwischen -1 und 1.

Integer-Division Ihrer Matrikelnummer durch 100
Das ist aber was anderes als Modulo. Denn:
609161 % 100 = 61
(int) (609161 / 100) = 6091
 
Danke für die schnelle Antwort.
Ja mit dem modulo war von ner Aufgabe vorher :)
Ok versuche es jz mal mit zwei Schleifen.
Danke
Ergänzung ()

Update:
Habe jetzt die Schleifen.
Funktioniert auch soweit so gut aber der Ansatz mit -1^x ist mir noch unklar.
 
Zuletzt bearbeitet:
Irgendwie komme ich trotzdem nicht weiter.
Meine Schleife soll ja für den Nenner immer eine Zahl mehr multiplizieren.
Also bei k=4 soll im Zähler 1*3*5 und im Nenner 2*4*6*8.
Dies funktioniert auch prima doch sobald k ungerade ist, sind die Zahlen im Nenner bzw. Zähler identisch zu der nächst kleineren geradem k.

Wo liegt mein Fehler?
 
hier mal ein konkretes Code-Beispiel für die Sin-Reihenentwicklung. Die Variable 'term' wird in jeden Schleifendurchgang aus dem Vorgänger errechnet. Hier wird auch die alternierende Folge (-1^n) verwendet. Eine vllt. einfacher Darstellung ist die Folge a1 = 1; a_i+1 = -a_i. Dann ist a1 = 1, a2 = -a1=-1, a3 = -a2 = 1 also die Folge 1, -1, 1, -1, 1, ....

Code:
#include <cstdio>
#include <cmath>

using namespace std;

double sinus(double x, int n = 5) {
    // taylorreihe sin(x) um x=0
    // x - x**3/3! + x**5/5! - x**7/7! + x**9/9! + ..
    // = summe(i=0, .., (-1)**i  x**(2i+1) /(2i+1)!

    double res = x;
    double term = x;
    for(int i = 0; i < n; ++i) {
        term *= -x*x/(2*i+2)/(2*i+3);
        res += term;
    }
    return res;
}


int main() {
    const int N = 20;

    for(int i = 0; i < N; ++i) {
        double x = i*3.1415/N;
        printf("delta : x:%lf delta:%lf\n", x, fabs(sin(x)-sinus(x)));
    }

}
 
Zuletzt bearbeitet: (Ausdruck + Bildungsgesetz sin())
Danke für das Beispiel.
Habe jetzt die Bildung des Produkts auch hinbekommen und auch das x^k.
Da ich zwei Schleifen nutze kann ich die einzelnen Durchläufe nicht dividieren.
Hat jmd. da ne Idee?

Gruß
 
Zuletzt bearbeitet:
Zurück
Oben