Quadratwurzelfunktion mit Hilfe einer Reihenentwicklung berechnen



  • 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:
    http://imageshack.us/photo/my-images/528/informatik.jpg/

    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:

    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,

    bettdecke


  • Mod

    Da gibt es viele Ansätze. Ein vielversprechender ist dieser:
    http://en.wikipedia.org/wiki/Binomial_coefficient#Binomial_coefficient_with_n.3D1.2F2

    Zu deinem eigenen Ansatz:
    1. Du brauchst in Schleifen nicht immer in Einserschritten zählen.
    2. Du brauchst in Schleifen nicht immer bei 1 oder 0 anfangen.
    3. A - B = A + (-1)*B
    -1 = -1
    -1 * -1 = 1
    -1 * -1 * -1 = -1
    Erkennst du ein Muster?



  • Danke für die schnelle Antwort und auch den Link. Das Muster im dritten Schritt erkenne ich wie jedoch helfen mir die ersten beiden?


  • Mod

    Das war der Hinweis (eher Wink mit dem Zaunpfahl) für die Frage "Wie kann ich im Nenner nur ungerade Zahlen multiplizieren und im Zähler gerade? "



  • Ich benötige dann aber zwei Schleifen.
    Eine für ungerade und eine für gerade Zahlen oder?


  • Mod

    Kann man. Muss man aber nicht. Es gibt einen mathematischen Zusammenhang zwischen einer ungeraden Zahl und der nächst größeren geraden Zahl, den du benutzen kannst.

    Du bist der Programmierer! Denke nach, wie man es wohl am einfachsten machen könnte und tu es!



  • Wenn x eine ungerade Zahl ist, dann ist k+1 die nächst größere gerade Zahl.
    Wie kann ich denn eine Schleife um sagen wir 2 jeweils erhöhen?
    i+2 ergibt eine Endlosschleife


  • Mod

    i+2 ist ja auch der Wert, der um 2 größer ist als i. Das ändert doch an i nichts. Du machst ja auch nicht i+1, wenn du i um 1 erhöhen möchtest.

    Und bitte lies ein gutes Lehrbuch. Das sind absolut grundlegendste Grundlagen, die dir fehlen.



  • Ich weiß, dass ich mich in das Thema noch einlesen muss.
    Mir ist es nur wichtig diese Aufgabe zulösen.


  • Mod

    Hilft dir denn das, was ich gesagt habe? Wenn du i+2 ausrechnest, dann bekommst du den Wert, der um 2 größer ist als i. Wenn es doch nur eine Möglichkeit gäbe, diesen i zuzuweisen...

    Ich weiß, dass ich mich in das Thema noch einlesen muss.
    Mir ist es nur wichtig diese Aufgabe zulösen.

    Du solltest dich vorher einlesen, dann könntest du auch die Aufgabe lösen! Die Aufgabe verlangt viel mehr als nur Zwei und Zwei zusammenzählen zu können. Wie willst du die Aufgabe schaffen, wenn du damit schon strauchelst?



  • Habe jetzt folgendes:

    for(i = 0; i <= k; i=i+2) {
    	divi = (x*i);
    	printf("hochzahl:%d\n", divi);}
    	for(j = 1;j<=k;j=j+2){
    		hochzahl= (x*j);
    		printf("div:%d\n", hochzahl);
    	}
    

    Damit habe ich jeweils den Dividenden bzw Quotienten.
    Um jeweils ein + bzw - zubekommen kann ich ja mit -1^i rechnen.
    Wie ich das genau implementiere muss ich noch herausfinden.



  • bettdecke schrieb:

    Um jeweils ein + bzw - zubekommen kann ich ja mit -1^i rechnen.
    Wie ich das genau implementiere muss ich noch herausfinden.

    🙄
    Es reicht auch aus das Vorzeichen in jedem Durchlauf mal -1 zu nehmen.

    int vorzeichen = -1; // oder 1, was du brauchst
    ...
    for(...)
    {  
      irgend etwas berechnen mit vorzeichen;
    
      printf("Vorzeichen=%d\n", vorzeichen);
      vorzeichen*=-1;
    }
    


  • Ich habe immer noch Probleme mit den Schleifen.
    Bei k=3 soll im Zähler 1*3 und im Nenner 2*4*6 berechnet werden und mit x^k multipliziert werden.
    Doch wie kann ich das lösen wenn ich ne verschachtelte Funktion habe?


  • Mod

    Indem du es tust?

    Drück dich doch mal klar aus! Fast alle deine Beiträge sind nur mit fortgeschrittener Wahrsagerei verständlich. Sag, was du tun willst, warum du damit Schwierigkeiten hast und wie dein Code aussieht. Wenn du Fachworte benutzt, dann sei dir sicher, dass sie richtig sind. Was soll eine verschachtelte Funktion sein? Mein Wahrsagegerät sagt mir, dass du entweder Rekursion meinst oder Schleifen verschachtelt hast. Da beides sehr unterschiedlich ist und dann auch noch jeweils auf tausende unterschiedliche Arten umgesetzt werden kann, kann man dir einfach nicht helfen!



  • Ok ich werde mich in nächster Zeit ausführlicher zu meinen Problemen äußern.

    Habe also ne geschachtelte For-Schleife.

    for(i = 2; i <= k; i=i+2) {
    	nenner = (x*i);
    	printf("Nenner:%d\n", nenner);}
    	for(j = 1;j<k;j=j+2){
    		zaehler= (x*j);
    		printf("Zaehler:%d\n", zaehler);
    	}
    

    Diese geben mir jeweils den Nenner bzw den Zähler an.
    Als nächstes soll vom Zähler bzw. Nenner das Produkt gebildet werden und der Zähler durch den Nenner dividiert werden.
    Und hier liegt man Problem.

    Wie kann ich es realisieren, dass er mir das Produkt des Nenner und der Zählers bildet und diese dann dividiert.
    "zaehler*=zaehler" kann ich ja nicht nutzen, da er mir nur das Quadrat bildet.

    Hoffe ich habe dieses mal mein Problem etwas ausführlicher beschrieben. 🙂



  • In einer Schleife kann auch mehr als eine Variable geändert werden.

    j = 1;
    for(i = 2; i <= k; i=i+2) {
        nenner = (x*i);
        printf("Nenner:%d\n", nenner);}
        zaehler= (x*j);
        printf("Zaehler:%d\n", zaehler);
    
        j = j+2;
    }
    

    oder etwas übersichtlier/anders

    for(i = 2,j = 1; i <= k; i=i+2,j=j+2) {
        nenner = (x*i);
        printf("Nenner:%d\n", nenner);}
        zaehler= (x*j);
        printf("Zaehler:%d\n", zaehler);
    }
    

    Ob das auch das berechnet was du willst, musst du wissen. :xmas2:



  • Musste bei deiner Schleife nur ne Klammer anders setzen 🙂
    Wie kann ich jedoch das Produkt der einzelnen Durchläufe bilden?



  • bettdecke schrieb:

    Musste bei deiner Schleife nur ne Klammer anders setzen 🙂

    Da wo die Klammer war gehört sie auch nicht hin, weil man sie dort nicht sieht.
    Dann waren die Schleifen auch nicht verschachtelt sondern nacheinander und die Einrückung dazu völlig daneben.

    j = 1;
    zaehler = 1;
    nenner = 1;
    for(i = 2,j = 1; i <= k; i=i+2,j=j+2) {
        nenner *= i;
        printf("Nenner:%d\n", nenner);
        zaehler *= j;
        printf("Zaehler:%d\n", zaehler);
    }
    

    so in etwa ?



  • Danke!
    Jetzt bildet er das Produkt!
    Habe jetzt nen weiteres Problem mit dem Bilden von x^k.
    Als ich eine for-Schleife mit der Erhöhung um jeweils 1 hatte ($i++) konnte ich x^k durch wiederholtes multiplizieren von x mit einer Variable mit dem Anfangswert 1 realisieren.
    Wie ist das jetzt denn möglich?



  • Überleg mal selber wie du von k auf i und j kommst.
    ungefähr:
    i = 2 * k;
    j = i + 1; // oder - 1,
    genauer mag ich das jetzt nicht überlegen.

    Du musst mal deine Erkenntisse einsetzen.

    bettdecke schrieb:

    konnte ich x^k durch wiederholtes multiplizieren von x mit einer Variable mit dem Anfangswert 1 realisieren.

    Etwas anderes habi ich doch bei nenner und zaehler auch nicht gemacht.


Anmelden zum Antworten