legendrepolynome



  • Hey. Ich brauche dringend Hilfe!

    Laut meiner Angabe können die Legendrepolynome folgendermaßen defi niert werden:

    L0(x):=1
    L1(x):=x
    Li(x):= 1/i((2i-1)xLi-1(x)-(i-1)Li-2(x)), wobei i ≥ 2

    Ich sollte eine Funktion mit Prototyp
    "double compLegendreRec(double x, unsigned i);"
    erstellen und anhand der Definition berechnen.

    Mein Anfangsversuche sehen so aus:

    //legendre.h definiert Funktion fuer Legendrepolynome
    #include<iostream>
    
    using namespace std;
    
    double compLegendreRec(double x,unsigned i)
    {
      if(i<=1)
      {
          if (i=1)
          {
              return x;            
          }
          else 
          { 
              return 1;  
          }    
      }
      else
      {  
      return double (2*i-1)*x*compLegendreRec(x,i-1)/i-(i-1)*compLegendreRec(x,i-2)/i;
      }
    }
    //------------------------------------------------------------------------------
    
    int main()
    {
        unsigned i;
        cout << "i= ";
        cin >> i;
    
        double x;
        cout << "x= ";
        cin >> x;
    
        cout << "Der Wert der Legendrefunktion mit L" << i << "(" << x << ") = " << compLegendreRec(x,i)<< endl;
        return 0;
    }
    

    Mein Problem dabei ist, dass bei der Berechnung der Zeile

    return double (2*i-1)*x*compLegendreRec(x,i-1)/i-(i-1)*compLegendreRec(x,i-2)/i;
    

    auch wieder mitenfließen soll, dass für i=1 und i≤1 die Bedingungen laut obiger Definition(Angabe) gelten.

    Denn wenn ich mir händisch für die Wert i=2 und x=3. das Ergebnis berechne, müsste ich 13 erhalten, was aber leider nicht der Fall ist.

    Kann mir bitte jemand zeigen, wie ich mein Problem am besten lösen kann?
    lg



  • Ich seh dein Problem eher in der Bedingung in Zeile 10:

    if (i=1)
    

    Das ist eine Zuweisung, einen Vergleich schreibt man in C++ mit ==

    if (i == 1)
    

    Und das double beim return scheint mir auch ziemlich sinnlos zu sein. Ich weiß nicht, was du damit bezweckst, es bewirkt an der Stelle eine Typumwandlung des Ausdrucks (2*i-1) nach double, was nicht viel bringt, da der sowieso schon vom Typ double ist. Edit: Falsch, er ist vom Typ unsigned, ich hatte irgendwie i und x verwechselt. Der Cast bringt trotzdem nichts 🙂

    Das was du als "dein Problem" bezeichnest, ist, wenn ich das richtig verstehe, keins, das erledigt sich durch die Rekursion von selbst.



  • nur kurz rübergeschaut... hier ein fehler:

    if (i=1) -> if (i==1) 😉


  • Mod

    i=1 ist eine Zuweisung, kein Vergleich.

    edit: Mal wieder dar langsamste. 😞



  • DANKE!!!!! Ihr habt mir echt geholfen. Hätte ich eigentlich wissen müssen, dass ich (i==1) schreibe.
    Ich hätte wahrscheinlich noch stundenlang nach einem anderen Fehler gesucht.
    VIELEN DANK



  • Tip: dreh bei deinem Compiler mal die Warnungen voll auf. Der müsste das eigentlich ankreiden...



  • Okay! Danke für den Tipp, werd ich mal versuchen! Auf jeden Fall es funktioniert jetzt alles einwandfrei!


Anmelden zum Antworten