legendrepolynome
-
Hey. Ich brauche dringend Hilfe!
Laut meiner Angabe können die Legendrepolynome folgendermaßen definiert werden:
L0(x):=1
L1(x):=x
Li(x):= 1/i((2i-1)xLi-1(x)-(i-1)Li-2(x)), wobei i ≥ 2Ich 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
doublebeim 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)

-
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!