Abbruchbedingung in der Schleife funktioniert nicht!!!



  • Hallo Leute,

    kurz, ich schreibe gerade an einem Programm (Einzelschrittverfahren).
    Ohne jetzt näher auf den Algorithmus einzugehen:

    double rechn (double a[][N],double m[][N], double b[], double x[], double xst[],double xo[])
    {
    int i;
    int j;
    int k;
    double rest;
    double r=1;
    
    for(i=0;i<N;i++)
        {
        rest=0.0;
    
        for(j=0;j<N;j++)
            {
    
            m[i][j]=a[i][j];
            if(j==i)
                    {
                    m[i][j]=0;
                    }
            xo[i]=x[i];        
            rest=rest+(m[i][j]*xst[j]);
            x[i]=(b[i]-(rest/a[i][i]));
            xst[i]=x[i];
            r=xo[i]-xst[i];
            }
        }      
    }
    

    Bis hierhin stimmt alles, x[i] wird hier richtig gerechnet.Das ganze wird jetzt nur einmal gerechnet, ist klar.
    Jetzt bringe ich eine Schleife mit Abbruchbedingung rein und das ganze sieht folgender maßen aus:

    double rechn (double a[][N],double m[][N], double b[], double x[], double xst[],double xo[])
    {
    int i;
    int j;
    int k;
    double rest;
    double r=1;
    
    for(i=0;i<N;i++)
        {
        rest=0.0;
    
        for(j=0;j<N;j++)
            {
    
            m[i][j]=a[i][j];
            if(j==i)
                    {
                    m[i][j]=0;
                    }
            do
            {
            xo[i]=x[i];        
            rest=rest+(m[i][j]*xst[j]);
            x[i]=(b[i]-(rest/a[i][i]));
            xst[i]=x[i];
            r=xo[i]-xst[i];
            }while(fabs(r)<eps);
            }
        }      
    }
    

    Schwarzer Bildschirm, weiß vieleicht jemand warum??? wäre echt cool wenn mir jemand hilft.



  • würdest du lieber erklären, was dein Algorithmus tun muss? Vielleicht so findet man den Fehler.



  • Gauß-Seidel Verfahren (Einzelschrittverfahren).
    Gleichungssystem gegeben, Startlösungen vorgeben.
    Gleichung 0 nach x[0] umgestellt, Gleichung 1 nach x[1], ....
    In Gleichung 0 werden nun die Startlösungen eingegeben. Das errechnete x[0] ist dann Startlösung in Gleichung 1 und die restlichen Startlösungen sind die alten(die zu Beginn vorgegebenen).In Gleichung 2 werden nun die errechneten x[0] und x[1] als neue Start werte geholt....
    Ist man bei der letzten Gleichung, wird das ganze solange wiederholt, bis die Differenz zwischen der alten und neuen Lösung kleiner als ein eps (Makro) ist.



  • Kurz:
    x\_i^{(k+1)}=- \frac 1 {a\_{ii}} \left[ \sum_{j=1}^{i-1} a_{ij} x\_j^{(k+1)} + \sum \_{j=i+1} ^ n a_{ij} x\_j^{(k)} - b\_i \right], i=1..n



  • @Salute
    Wenn etwas nicht funktioniert, wie es funktionieren soll, dann schmeißt man am besten den Debugger an; deinen besten Freund 😃 .

    Aja, weil du von Abbruchbedingung schreibst. In C(++) gibt es keine abbruchbedingten Schleifen. Jede Schleife (ob nun anfangsbedingt oder endbedingt) wird solange ausgeführt, solange die Bedingung wahr ist. Möglicherweise liegts auch einfach daran :).



  • Salute schrieb:

    Kurz:
    x\_i^{(k+1)}=- \frac 1 {a\_{ii}} \left[ \sum_{j=1}^{i-1} a_{ij} x\_j^{(k+1)} + \sum \_{j=i+1} ^ n a_{ij} x\_j^{(k)} - b\_i \right], i=1..n

    Alles klar 👍 😉



  • Hi!

    Was ist eps und wo ist es definiert?

    Code-Hacker



  • @code hacker:
    eps ist ein Makro, ist ganz oben definiert.

    @interpreter:
    Der Debugger hat mir leider auch nicht geholfen.
    Das mit der Schleife habe ich eigentlich so gemeint, wie du es geschrieben hast. Daran lag es leider nicht.

    Das Unterprogramm funktioniert so lange, bis ich die do-while Schleife mit ihrer Ausführungsbedingung einbringe.

    Noch Ideen???



  • @salute
    Das mit dem Debugger und so, hab übrigens ich geschrieben, nicht interpreter.

    Wenn dir nicht mal der Debugger weiterhilft, dann kannst du das Problem nicht lösen. Allerdings glaube ich eher, dass es an fehlender Erfahrung liegt mit dem Debugger ;).

    Du hast beschrieben, dass dein Programm nichts ausgibt. Aus der Funktion schließe ich jetzt mal, dass du die Ausgabedaten in einem oder mehreren Arrays speicherst. So und da kannst du schon mal mit dem Debugger ansetzen. Sind die Arrays korrekt gefüllt nach dem Aufruf der Funktion (das kann man nämlich im Debugger wunderbar nachschauen). Wenn ja, dann stimmt was bei deiner Ausgabe nicht. Wenn nicht, dann musst in deine Funktion reindebuggen und herausfinden, warum die Arrays nicht gefüllt werden.



  • @AJ: Sorry, sorry.

    Hab mich mit mal etwas länger mit dem Debugger auseinandergesetzt und konnte, glaube ich mal, das Problem einschränken:

    rest=rest+(m[i][j]*xst[j]);
    

    rest bleibt immer 0, nach jedem Schritt. Habe aber leider keine Ahnung wieso.

    Sieht jemand den Fehler???



  • m[i][j] == 0 || xst[j] == 0

    😃

    Das kannst du dir im Debugger übrigens auch anschauen. Dann weißt du zumindest schon mal welcher der beiden Ausdrücke den Wert 0 hat.



  • @AJ
    Boah, du hattest recht, danke für den Tip mit dem Debugger. Jetzt bekomme ich zwar ein FALSCHES Ergebnis heraus, aber das ist ein numerisches Problem, das kriege ich schon noch in den Griff.

    Vielen Dank.....


Anmelden zum Antworten