Hilfe gesucht!



  • Hallo Leute

    ich bin gerade an einem Thema das ich mit dem Runge Kutta Verfahren lösen möchte, 2 und 4 Ordnung siehe Quelltext. mein Problem ist die definition der Funktion die mit void RK2().... sowie void Rk4 ()... beginnt. beim kompilieren kommen immer die Fehlermeldung,
    , error: expected constructor, destructor, or type conversion before ‘=’ token
    , error: expected constructor, destructor, or type conversion before ‘=’ token
    , error: variable or field ‘RK2’ declared void
    , error: expected primary-expression before ‘double’
    , error: expected primary-expression before ‘double’
    , error: expected primary-expression before ‘double’.

    bin relativ neu im C++ programmieren und benötige einmal ein bischen Hilfe 😕
    🙄

    Für Hilfe oder Hinweise bin sehr dankbar

    Grüße Knoffel

    [code]#include <stdio.h>
    #include <iostream.h>
    //#include <conio.h>
    #include<math.h>
    #include<cpgplot.h>
    #include<stdlib.h>
    #include<fstream.h>

    using namespace std;

    // Lotka-Volterra-Modell

    // Parameter des Räuber-Beute-modells (Volterragleichung)

    double x2Diff=1.0;
    double x1Diff=1.0;
    double x2 = 7.0 ; // Anzahl Räuber
    double x1 = 15.0; // Anzahl Beute
    double s1 = 0.1 ; // Sterberate Räuber, nicht Abhängig
    double b2 = 0.05 ; // Sterberate Beute, abhängig von Anzahl R
    double s2 = 0.01 ; // Wachstumsrate Räuber
    double b1 = 0.5 ; // Vermehrungsrate Beute

    // Laufvariablen
    double h = 0.1;
    int n=100;
    int p = 10;

    // Veränderung der Räuber-Population Dimensionslos

    x2Diff = x1*(1-x2);

    // Veränderung der Beute-population Dimensionslos

    x1Diff = s1/b1*x2*(x1-1);

    //Runge Kutta 2 Ordnung

    void RK2( x1Diff, x2Diff, double &x1, double &x2, double h)
    {

    double s=x1, t=x2;
    double K1 = x1Diff, L1= x2Diff;
    s=x1+h*K1; t=y+h*L1;
    double K2 = x1Diff, L2= x2Diff;
    s=x1+h*K1; t=y+h*L1
    x1=x1+h*(k1+K2)/2;
    x2=x2+h*(k1+K2)/2;

    //Runge Kutta 4 Ordnung

    void RK4( x1Diff, x2Diff, double &x1, double &x2, double h)
    {

    double s=x1, t=x2;
    double K1 = x1Diff, L1= x2Diff;
    s=x1+(h/2)*K1; t=y+(h/2)*L1;

    double K2 = x1Diff, L2= x2Diff;
    s=x1+(h/2)*K2; t=y+(h/2)*L2;

    double K3 = x1Diff, L3= x2Diff;
    s=x1+h*K3; t=y+h*L3;

    double K4 = x1Diff, L4= x2Diff;
    x1=x1+h*(K1+2.0*(K2+K3)+K4)/6;
    x2=x2+h*(K1+2.0*(K2+K3)+K4)/6;
    }

    Für Hilfe oder Hinweise bin sehr dankbar

    Grüße Knoffel



  • RK2 haste nicht zugemacht.
    Falls Du Microsoft-Compiler benutzt, drücke mal
    Strg+A (alles markieren)
    Alt+F8 (Markierung automagisch einrücken)

    Dann siehste, daß geschweifte Klammern nicht passen.

    Und wenn das geschafft ist,
    ich kopiere mir bei so einer Frage den ganzen Code in den Compiler und schaue mal, was ich machen kann.
    Für weitere Fragen wäre es für uns einfacher, Du würdest das gesamte Programm in einer großen compilerfähigen Datei posten und dazu die Frage stellen mit Beschreibung wo was schief geht.



  • Hallo die Klammer hab ich zugemacht und es ändert sich leider nix.

    ist irgendwie ein deklarierungsproblem der Funktion glaube ich.

    ps. programmiere unter linux aber bin da auch erst neu



  • So Zuweisungen klappen erst im eigentlichen Code.
    Innerhalb von Funktionen.
    Du musst erst in Funktionen reinkommen.
    Das Betriebssytem ruft die Funktion main() auf.
    Dort kannste erst richtig losrechnen und Schleifen machen und all das.
    Die main() kann dann auch RK2 und RK4 und noch mehr aufrufen; du bleibst in Funktionen.
    Du hast keine main(). So wird das nix.
    Es ist einiges im Argen.
    Vielleicht solltest Du Dir ein C++-Tutorial in den Kopf hauen, bevor hier Fehler zu suchen, ich denke, die Gesamtzeit sinkt bei diesem "Umweg".



  • Ja das ist richtig! Habe mir mal das tutorial zu den Funktionen und explizit zu void angeschaut und den Fehler "error: expected constructor, destructor, or type conversion before ‘=’ token " beheben können nur wenn ich die Funktion in der main()-Funktion Aufrufe kommt leider immer noch der gleiche Fehler.

    🙂 Danke für die Hinweise 🙂



  • Ich meinte das ganze Tutorial von vorne bis hinten.



  • Wie wäre es damit ?

    void RK2(double x1Diff, double x2Diff, double &x1, double &x2, double h)
    {
      double s=x1, t=x2;
      double K1 = x1Diff, L1= x2Diff;
    
      s=x1+h*K1; t=y+h*L1;
      double K2 = x1Diff, L2= x2Diff;
      s=x1+h*K1; t=y+h*L1
      x1=x1+h*(k1+K2)/2;
      x2=x2+h*(k1+K2)/2;
    }
    
    //Runge Kutta 4 Ordnung
    
    void RK4(double x1Diff, double x2Diff, double &x1, double &x2, double h)
    {
      double s=x1, t=x2;
      double K1 = x1Diff, L1= x2Diff;
    
      s=x1+(h/2)*K1; t=y+(h/2)*L1;
      double K2 = x1Diff, L2= x2Diff;
      s=x1+(h/2)*K2; t=y+(h/2)*L2;
    
      double K3 = x1Diff, L3= x2Diff;
      s=x1+h*K3; t=y+h*L3;
    
      double K4 = x1Diff, L4= x2Diff;
      x1=x1+h*(K1+2.0*(K2+K3)+K4)/6;
      x2=x2+h*(K1+2.0*(K2+K3)+K4)/6;
    }
    

    Du hast nämlich den Parametern x1Diff und x2Diff keinen Typ zugeordnet und dann mecksert der Compiler zurecht das er die Zuweisung nicht machen kann.

    Ansonsten kann ich mich dem Tip von volkard nur anschliessen.


Anmelden zum Antworten