Numerische Integral- und Differentialberechnung
-
Hallo Leute! Ich hoffe ich schreib in den richtigen Thread. Sorry wenn nicht.
Ich hab 2 Probleme. Eines mit meiner Integralfunktion und eines mit meiner Differentialfunktion. Ich hab 3 Funktionen f,g,h für die ich die y-Werte berechnen soll. Das funktioniert noch ganz gut. Aber wenn ich die y-Werte für die erste Ableitung und für die Stammfunktion berechne funktioniert das nur mehr für meine f Funktion. g und h werden mit falsch berechnet. Hat jemand eine Lösung für meine Anliegen?
Hier mein Code:
double f(const double x) { return 4.0*pow(x,3.0)+3.0*(x*x); } double g(const double x) { return (exp(-x))*(sin(40*x)); } double h(const double x) { return x*(sin(40.0/x)); } vector<double> fvonx(double (* const func)(double), const vector<double> x) { vector<double> res; for(unsigned int i=0; i<x.size(); i++) { double tmp=0; tmp=func(x.at(i)); res.push_back(tmp); } return res; } vector<double> integrate(double (* const func)(double), const double a, const vector<double> b, const int N) { vector<double> res; for (unsigned int i=0; i<b.size();i++) { double h = (b.at(i) - a)/N; double sum = 0.5* h * (func(a) + func(b.at(i))); for (unsigned int j = 0; j < N; j++) { sum += h * func(a + h*j); } res.push_back(sum); } return res; } vector<double> different(double (* const func)(double), const vector<double> x, const double eps) { vector<double> res; for(unsigned int i=0; i<x.size(); i++) { double h=0.1; double f1,f2; do { f2=f1; f1=(func(x.at(i)+h)-func(x.at(i)-h))/(2.0*h); h-=0.0001; }while((fabs(f1-f2))>eps); res.push_back(f1); } return res; }
-
Versuchst du, die Funktionen in der Laufzeit abzuleiten??
Leite sie doch einfach ab und mach dann die Ableitungsfunktionen als separate Funktionen.z. B. f(x) = 4x³ + 3x² -> f'(x) = 12x² + 6x
double fAbleit(double x) { return 12 * x * x + 6 * x; }Ich hoffe du weißt, dass die Ableitung der Sinus-Funktion die Kosinus-Funktion ist.
-
Kannst du genauer sagen, was du mit 'falsch' meinst? Jedenfalls kommt mir
sin(40*x)verdächtig vor. Sieht so aus, als würdest du in Grad (oder gar Neugrad?) denken, anstatt im Bogenmaß. Ist es das, was du meinst?
-
Das würde schon funktionieren, denk ich, aber ich weiß nicht ob ich das darf. In der Uni haben wir diese beiden Formeln vorgegeben bekommen. Für meine f Funktion gehts ja auch...
-
Das mit Radiant und Grad hab ich mir schon gedacht aber es sind beide Werte anders als in meinem Code.
-
Nochmal: Beschreib bitte dein Problem genauer! "Kommt falsch raus" ist keine brauchbare Fehlerbeschreibung.
-
SeppJ schrieb:
Nochmal: Beschreib bitte dein Problem genauer! "Kommt falsch raus" ist keine brauchbare Fehlerbeschreibung.
also die beiden funktionen g und h liefern mir für g'(x) und G(x) und h'(x) und H(x) falsche Ergebnisse. Ich habe die Ergebnisse mit einem Taschenrechner überprüft und sie sind falsch. Beispielsweise erhalte ich für H(x) bei jedem Wert den ich integriere NAN.
Das was mich verwirrt ist, dass ich für f(x), f'(x) und F(x) die richtigen Ergebnisse bekomme.
-
In
integratesollte diefor (unsigned int j = 0; j < N; j++)Schleife besser bei 1 anfangen, sonst gehtf(a)1.5 mal statt 0.5 mal in die Summe ein.In
differentrechnest du mitf2, ohne jemals einen definierten Wert zugewiesen zu haben (d.h. du rechnest mit einer komplett zufälligen Zahl).Und schliesslich das
h-=0.0001ist einigermassen fragwürdig, wieso nicht einfachh = h / 2?Beispielsweise erhalte ich für H(x) bei jedem Wert den ich integriere NAN.
Probier mal ein Intervall ala [1, 2] - irgendwas wo die Null nicht drinnen liegt.
-
hustbaer schrieb:
In
integratesollte diefor (unsigned int j = 0; j < N; j++)Schleife besser bei 1 anfangen, sonst gehtf(a)1.5 mal statt 0.5 mal in die Summe ein.In
differentrechnest du mitf2, ohne jemals einen definierten Wert zugewiesen zu haben (d.h. du rechnest mit einer komplett zufälligen Zahl).Und schliesslich das
h-=0.0001ist einigermassen fragwürdig, wieso nicht einfachh = h / 2?Beispielsweise erhalte ich für H(x) bei jedem Wert den ich integriere NAN.
Probier mal ein Intervall ala [1, 2] - irgendwas wo die Null nicht drinnen liegt.
Vielen Dank. Das behebt mein Problem!