| Autor |
Nachricht |
priesn
Mitglied
Benutzerprofil
Anmeldungsdatum: 13.05.2012
Beiträge: 9
|
priesn Mitglied
11:47:42 13.05.2012 Titel: |
Numerische Integral- und Differentialberechnung |
Zitieren |
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:
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | 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;
} | | |
|
|
|
 |
Unregistrierter
|
Unregistrierter
12:01:35 13.05.2012 Titel: |
|
Zitieren |
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
| C++: | 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. |
Zuletzt bearbeitet von Unregistrierter am 12:03:36 13.05.2012, insgesamt 1-mal bearbeitet |
|
 |
SeppJ
Moderator
Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 17924
|
SeppJ Moderator
12:07:32 13.05.2012 Titel: |
|
Zitieren |
|
 |
priesn
Mitglied
Benutzerprofil
Anmeldungsdatum: 13.05.2012
Beiträge: 9
|
priesn Mitglied
12:10:00 13.05.2012 Titel: |
|
Zitieren |
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... |
|
|
|
 |
priesn
Mitglied
Benutzerprofil
Anmeldungsdatum: 13.05.2012
Beiträge: 9
|
priesn Mitglied
12:13:04 13.05.2012 Titel: |
|
Zitieren |
Das mit Radiant und Grad hab ich mir schon gedacht aber es sind beide Werte anders als in meinem Code. |
|
|
|
 |
SeppJ
Moderator
Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 17924
|
SeppJ Moderator
14:00:20 13.05.2012 Titel: |
|
Zitieren |
|
 |
priesn
Mitglied
Benutzerprofil
Anmeldungsdatum: 13.05.2012
Beiträge: 9
|
priesn Mitglied
15:06:40 13.05.2012 Titel: |
|
Zitieren |
| 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. |
|
|
|
 |
hustbaer
Mitglied
Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 16032
|
hustbaer Mitglied
17:08:50 13.05.2012 Titel: |
|
Zitieren |
In integrate sollte die for (unsigned int j = 0; j < N; j++) Schleife besser bei 1 anfangen, sonst geht f(a) 1.5 mal statt 0.5 mal in die Summe ein.
In different rechnest du mit f2, ohne jemals einen definierten Wert zugewiesen zu haben (d.h. du rechnest mit einer komplett zufälligen Zahl).
Und schliesslich das h-=0.0001 ist einigermassen fragwürdig, wieso nicht einfach h = h / 2?
| Zitat: | | 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. |
_________________ "Let there be Licht..." http://lichttools.sourceforge.net/
Sehr cooles ASCII Spiel (leider nicht von mir): ASCII-Scramble - http://www.roskakori.at/ascii/
|
|
 |
priesn
Mitglied
Benutzerprofil
Anmeldungsdatum: 13.05.2012
Beiträge: 9
|
priesn Mitglied
17:41:05 13.05.2012 Titel: |
|
Zitieren |
| hustbaer schrieb: | In integrate sollte die for (unsigned int j = 0; j < N; j++) Schleife besser bei 1 anfangen, sonst geht f(a) 1.5 mal statt 0.5 mal in die Summe ein.
In different rechnest du mit f2, ohne jemals einen definierten Wert zugewiesen zu haben (d.h. du rechnest mit einer komplett zufälligen Zahl).
Und schliesslich das h-=0.0001 ist einigermassen fragwürdig, wieso nicht einfach h = h / 2?
| Zitat: | | 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! |
Zuletzt bearbeitet von priesn am 17:42:32 13.05.2012, insgesamt 1-mal bearbeitet |
|
 |