WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Einfache Gleichung iterieren

 

Schmankerl
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 77
Anmeldedatum: 05.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.02.2013, 15:01     Titel: Einfache Gleichung iterieren
  Antworten mit Zitat      
Hallo,

ich möchte eine Gleichung in Matlab iterieren und denke, dass dazu die Fixpunktiteration ausreichend ist.
Dazu habe ich die ganze Gleichung nach der gesuchten Größe "p19" umgestellt, wobei links weiterhin Terme mit p19 stehen bleiben: p19=p19(p19,k,R,t0,....) .

Dazu habe ich mir nun einen kleinen Code geschrieben welches mir für bestimmte Bedingungen (Machzahl Ma19 >1) diese Iteration ausführen soll:


Code:


eps=1e-6;         %Abbruchkriterium

c0=220;             %Geschwindigkeit als Konstante
p0=30000;          %Ausgangsdruck
R=287;               %Gaskonstante
cp=1004.5;          %Waermekapazitaet
k=1.4;                %Isentropenexponent
t0=233;              %Ausgangstemperatur


Ma19=[0.5 3 2 ; 1 0.3 4 ; 0.2 0.1 10];                   %Definition der Machzahl Ma19
Ers=[359 360 361 ; 350 320 260 ; 350 300 340];         % Eine weitere Konstante


L=Ma19>1;      %Bedingung: Machzahl Ma19 >1
Ma19(L)=1;       % alle Einträge von Ma19 die größer 1 sind mit dem Wert 1 belegen

p19=p0*ones(size(Ma19));       %Vektor p19 definieren
p19alt=p19;                           %Vektor p19alt definieren




%Beginn der Iteration
while sum(L)>1            %solange die Summe der logischen Matrix L größer als 1
    p19alt(L)=p19(L);

%nur für die Einträge mit Ma19>1 soll iteriert werden

    p19(L)=((((c0-(p19alt(L)-p0)*(R*t0*(p19alt(L)./p0).^(R/cp))./(p19alt(L).*sqrt(k*R*t0*(p19alt(L)./p0).^(R/cp)))+Ers(L))^2)./(k*R*t0)).^(cp/R)).*p0;      %Fixpunktgleichung

    L=abs(p19alt(L)-p19(L))>eps;       %Abbruchkriterium

end


Ich weiß nicht recht wieso ich nun für p19 immer p0=30000 erhalte, normalerweise müsste es mir doch p19 iterieren, sodass ich für p19 unterschiedliche Werte, je nach Ers(L) erhalte?

Hat jemand eine Idee?
Private Nachricht senden Benutzer-Profile anzeigen


Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 13.02.2013, 03:31     Titel:
  Antworten mit Zitat      
Moin,

Du durchläufst nicht die while-Schleife, da sum(L)>1 = [0, 0, 1] ist.


http://www.mathworks.de/de/help/mat.....process-and-features.html


Grüße,
Seban
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
Schmankerl
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 77
Anmeldedatum: 05.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.02.2013, 17:48     Titel:
  Antworten mit Zitat      
Aha!
Wie müsste ich das dann machen?

Habe dann
Code:
gemacht.

Ist das logisch korrekt?

2) Nun erhalte ich die Fehlermeldung:

Zitat:
Error using *
Inner matrix dimensions must agree.

Error in Untitled (line 30)
p19(L)=((((c0-(p19alt(L)-p0)*(R*t0*(p19alt(L)./p0).^(R/cp))./...


Meiner Meinung nach sind die Matrizen doch gleich groß die ich nutze?

Danke für die späte Hilfe, brauche es nämlich immer noch!
Private Nachricht senden Benutzer-Profile anzeigen
 
Schmankerl
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 77
Anmeldedatum: 05.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.02.2013, 18:16     Titel:
  Antworten mit Zitat      
Ok ich habe meinen Fehler gefunden, mein Code lautet nun:

Code:
eps=1e-6;         %Abbruchkriterium

c0=220;             %Geschwindigkeit als Konstante
p0=30000;          %Ausgangsdruck
R=287;               %Gaskonstante
cp=1004.5;          %Waermekapazitaet
k=1.4;                %Isentropenexponent
t0=233;              %Ausgangstemperatur


Ma19=[0.5 3 2 ; 1 0.3 4 ; 0.2 0.1 10];                   %Definition der Machzahl Ma19
Ers=[359 360 361 ; 350 320 260 ; 350 300 340];         % Eine weitere Konstante


L=Ma19>1;      %Bedingung: Machzahl Ma19 >1
Ma19(L)=1;       % alle Einträge von Ma19 die größer 1 sind mit dem Wert 1 belegen

p19=p0*ones(size(Ma19));       %Vektor p19 definieren
p19alt=p19;                           %Vektor p19alt definieren




%Beginn der Iteration
while sum(sum(L))>=1            
    p19alt(L)=p19(L);
    p19(L)=((((c0-(p19alt(L)-p0).*(R*t0*(p19alt(L)./p0).^(R/cp))./(p19alt(L).*sqrt(k*R*t0*(p19alt(L)./p0).^(R/cp)))+Ers(L)).^2)./(k*R*t0)).^(cp/R)).*p0;
    L=abs(p19alt(L)-p19(L))>eps;       %Abbruchkriterium

end


Weiß jemand wieso der Computer solange rechnet?
Ich glaube irgendwas stimmt an der Logik meines Codes noch nicht, hat mir jemand vielleicht einen Tipp?
Ich denke es ist klar was ich machen möchte oder?
Ich glaube es hapert mit der logischen Indizierung?
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 13.02.2013, 20:42     Titel:
  Antworten mit Zitat      
Hi,

Ein paar Anregungen:

Dein L ist erst eine 3x3 Matrix, wird dann aber in der while-Schleife zu einem logischen Vektor. Ist das Absicht?
L ist zunächst abhängig von der Machzahl Ma19>1 und in der Schleife dann abh. von p19. Ist das gewollt? (Ich kenn mich mit Iterationen nicht so sehr aus.)

Ich hab die Berechnung jetzt nach 3166662 Schleifendurchläufen abgebrochen. L ist nach dem ersten Schleifendurchlauf ein 4x1 logical und jetzt eine logische 1. Vielleicht wird das iwann 0 und die while-Schleife wird verlassen. Dann musst du entscheiden, ob die Iteration so viele Schritte durchlaufen sollte. Wenn es nie 0 wird, stimmt definitiv etwas nicht.

Das Abbruchkriterium scheint mir nicht "sauber" gewählt zu sein.
2 Vorschläge:
1. Debugge den Code und schau, ob auch wirklich das geschieht, was du dir vorstellst.
2. Poste mal, was die Abbruchbedingung sein soll. In Worten, Pseudocode, ... Zum einen können wir es dann besser nachvollziehen und zum anderen kann es dir helfen, dein Kriterium noch mal zu überdenken.

Grüße,
Seban
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
Schmankerl
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 77
Anmeldedatum: 05.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.02.2013, 17:30     Titel:
  Antworten mit Zitat      
Zitat:
Dein L ist erst eine 3x3 Matrix, wird dann aber in der while-Schleife zu einem logischen Vektor. Ist das Absicht?


Ist L nicht bereits am anfang eine logische Matrix, das ist zumindest die Absicht.
Innerhalb der While Schleife soll die logische Matrix Struktur aufrecht erhalten bleiben.

Die Iteration sollte folgendermaßen gehen:

Ich habe eine Matrix Ma19, eine Ers, und eine p19 , die alle gleich groß sind.
An denjenigen Stellen, an denen Ma19 > 1 ist, soll das entsprechende p19 (an der gleichen Stelle in der Matrix wo Ma19>1 ist) neu berechnet werden.

Für diejenigen p19, für die Ma19> 1 , muss iteriert werden.

While Schleife:

Diese wird solange durchlaufen, bis in der Matrix L, die hier nun aus einem Abbruchkriterium gebildet wird, keine 1er mehr auftauchen.

Das Abbruchkriterium lautet:

Wenn die Differenz zwischen altem und neuem p19 größer als ein gewisses Epsiolon ist, DANN soll p19 ( das neue ) wieder verwendet werden und nochmals in die Fixpunktgleichung eingesetzt werden. Dann erhält man wieder ein p19 welches mit dem alten p19 verglichen wird, wenn auch hier die Differenz wieder zu groß ist, wird das nochmal gemacht....

L ist dann quasi eine logische Matrix, die an jeder Stelle, wo das p19alt - p19(aktuell) > eps ist, eine 1 hat, somit weiß die Schleife, dass noch 1er drin sind und nochmal iterriert werden muss.

Ist das verständlich?

Bitte um verspätete Hilfe
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 19.02.2013, 20:04     Titel:
  Antworten mit Zitat      
Hallo,

Ja, jetzt ist es verständlicher Smile

Schmankerl hat Folgendes geschrieben:
Zitat:
Dein L ist erst eine 3x3 Matrix, wird dann aber in der while-Schleife zu einem logischen Vektor. Ist das Absicht?


Ist L nicht bereits am anfang eine logische Matrix, das ist zumindest die Absicht.
Innerhalb der While Schleife soll die logische Matrix Struktur aufrecht erhalten bleiben.

Doch, da habe ich mich unglücklich ausgedrückt, es ist erst ein logisches 3x3 und wird dann in der while-Schleife zu einem log 4x1 usw.
Wenn du in der 3. Zeile in der while-Schleife
Code:
(p19alt(L)-p19(L))

durch
Code:
(p19alt.*L-p19.*L)

ersetzt, erhältst du immer ein 3x3 log. Ersteres gibt ja nur die Werte zurück, für die die Bedingung erfüllt ist (also in einer logischen Matrix nur die 1er).


Zitat:
Das Abbruchkriterium lautet:

Wenn die Differenz zwischen altem und neuem p19 größer als ein gewisses Epsiolon ist, DANN soll p19 ( das neue ) wieder verwendet werden und nochmals in die Fixpunktgleichung eingesetzt werden. Dann erhält man wieder ein p19 welches mit dem alten p19 verglichen wird, wenn auch hier die Differenz wieder zu groß ist, wird das nochmal gemacht....

L ist dann quasi eine logische Matrix, die an jeder Stelle, wo das p19alt - p19(aktuell) > eps ist, eine 1 hat, somit weiß die Schleife, dass noch 1er drin sind und nochmal iterriert werden muss.

Ich habe jetzt die while -Schleife ~1,8 Mio durchlaufen, L(2, 3) wird nicht 0.
L(1, 2), L(1, 3), L(3, 3) sind jetzt NaN.

Ich hab das
Code:
i=i+1;
differenz(i)={p19alt.*L-p19.*L};

mal in die Schleife eingefügt (vorher noch i=0 setzen) und dann in einem anderen m-file
Code:
for i = 1:size(differenz, 2)
    D23(i) = abs(differenz{i}(2, 3));
    D33(i) = abs(differenz{i}(3, 3));
end

ausgeführt und D32 dann mal geplottet.

zB bei 3.7332*10^5 gibt es eine Erhöhung, die bei 1.7786*10^6 ist ja direkt ersichtlich (für i~1.8Mio). Wenn du die figure entsprechend skalierst, siehst du, dass es immer mal solche Ausreißer gibt. Schau dir das am besten mal an und überlege, ob du deine Bedingung anpassen kannst.

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.