Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C++ (auch C++0x und C++11) ::  Numerische Integral- und Differentialberechnung     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
priesn
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.05.2012
Beiträge: 9
Beitrag 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





Beitrag 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
Beitrag SeppJ Moderator 12:07:32 13.05.2012   Titel:              Zitieren

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?

_________________
Du brauchst Hilfe?, Buchempfehlungen für C++,
Wie man in Fragen den richtigen Code postet,
The Definitive C++ Book Guide and List
priesn
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.05.2012
Beiträge: 9
Beitrag 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
Beitrag 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
Beitrag SeppJ Moderator 14:00:20 13.05.2012   Titel:              Zitieren

Nochmal: Beschreib bitte dein Problem genauer! "Kommt falsch raus" ist keine brauchbare Fehlerbeschreibung.

_________________
Du brauchst Hilfe?, Buchempfehlungen für C++,
Wie man in Fragen den richtigen Code postet,
The Definitive C++ Book Guide and List
priesn
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.05.2012
Beiträge: 9
Beitrag 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
Beitrag 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
Beitrag 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
c++.de :: C++ (auch C++0x und C++11) ::  Numerische Integral- und Differentialberechnung   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.