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

Problem mit einer While-Schleife! -Abbruchkriterium falsch??

 

Mikc
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 28.04.15
Wohnort: Heilbronn
Version: R2014b
     Beitrag Verfasst am: 28.04.2015, 14:32     Titel: Problem mit einer While-Schleife! -Abbruchkriterium falsch??
  Antworten mit Zitat      
Hallo Zusammen Smile

Bin soeben auf dieses Forum gestoßen als ich nach Lösungen für mein Problem suchte und dachte dann, das ich es ja einfach mal hier posten könnte!

Code:
i=1;
xp(1)=xd;
yp(1)=xd;
xp(i+1)=1;
y=xd;
while (xp(i+1)>xi),
    xp(i+1)=fzero('GGW',0.5);      %Funktion GGW errechnet die rote Linie
    yp(i+1)=R/(R+1)*xp(i+1)+xd/(R+1);
    y=yp(i+1);
    set(line([xp(i) xp(i+1)],[yp(i) yp(i)]),'Color',[0 0 1]);
    if(xp(i+1)>xi)
        set(line([xp(i+1) xp(i+1)],[yp(i) yp(i+1)]),'Color',[0 0 1]);
    end
        i=i+1;
end    
 


Die Schleife ist eine endlos-Schleife. Ich bin der Meinung das mein Abbruchkriterium das falsche ist, weiß aber nicht welches ich stattdessen nehmen sollte. Mehrere Möglichkeiten bereits ausprobiert. Mad Question

Das angefügte Bild zeigt das Diagramm in dem die Schleife sogenannte "Stufen" einzeichnen soll. Die Stufen sind blau und begonnen wird mit der Schleife oben rechts bis zu dem Punkt wo die rosa Linie abknickt. Für den unteren Teil gibts es eine extra while-Schleife. (btw, xi ist der Punkt wo die rose Linie abknickt)

Jetzt zu meiner Frage: Warum macht die Schleife nur die erste Stufe und kommt dann ins endlose??


Viele Grüße Smile

Stufe_1.PNG
 Beschreibung:

Download
 Dateiname:  Stufe_1.PNG
 Dateigröße:  21.76 KB
 Heruntergeladen:  255 mal
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 28.04.2015, 14:44     Titel:
  Antworten mit Zitat      
dein code ist so nicht lauffähig und darum schwer nachzuvollziehen. außerdem taucht xi in deinem code nicht auf. solche probleme sind normalerweise etwas für den debugger. dann ka man schrittweise druchgehen.
außerdem sollte man i nicht als laufvariable verwenden da es die imaginäre einheit ist. das kann zu problemen führen.
außerdem:
Code:
xp(i+1)=fzero('GGW',0.5)
da ändert sich nichts. also ist doch das bei jedem druchlauf das gleiche oder?
ich versteh auch nicht ganz warum da kein dimmension missmatch kommt aber da das nicht lauffähig ist kann ich das so auch nicht nachvollzihen.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Mikc
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 28.04.15
Wohnort: Heilbronn
Version: R2014b
     Beitrag Verfasst am: 28.04.2015, 15:05     Titel:
  Antworten mit Zitat      
Hey Smile

Danke für die schnelle Rückmeldung. Wink

xi ist in dem geposteten Code vorhanden -> in der Bedingung für die Schleife

Das hier:

Code:
y=yp(i+1);


Wird in der GGW-Funktion verwendet. Das y ist global.

Hier noch die GGW-Funktion(hätte ich vielleicht gleich am Anfang mit dazu schreiben sollen Embarassed )

Code:
function f=GGW(x)

global y
global alpha


f=y-alpha*x/(1+(alpha-1)*x);

end
 


Und ich weiß nicht wie ich ein lauffähiges Programmbeispiel abliefern soll, wenn meim Programm nicht funktioniert. Deshalb frage ich hier ja. So wie es gerade hier steht macht des das was man auf dem Bild sieht. Die Stufen sollten aber weiter gehen.
Hab in der Zwischenzeit jetzt auch das Abbruchkriterium mal getauscht:

Code:
i=1;
xp(1)=xd;
yp(1)=xd;
xp(2)=1;
y=xd;
while (xp(i)>xi),
    xp(i+1)=fzero('GGW',0.5);
    yp(i+1)=R/(R+1)*xp(i+1)+xd/(R+1);
    y=yp(i+1);
    set(line([xp(i) xp(i+1)],[yp(i) yp(i)]),'Color',[0 0 1]);

    if(xp(i+1)>xi)
        set(line([xp(i+1) xp(i+1)],[yp(i) yp(i+1)]),'Color',[0 0 1]);
    end
        i=i+1;
end    


Das verrückte ist, wenn ich nun zuerst mit dem bereits genannten Abbruchkriterium laufen lasse kommt nur diese eine Stufe, dann ändere ich das Abbruchkriterium zu dem grad genannten und lass nochmals in der GUI laufen und es funktioniert. Aber nur für den Moment.

Falls noch mehr Erläuterungen o.Ä. gewünscht sind einfach fragen Smile
Bin auch grad am Lesen des "Richtig fragen"-Threads.
Bemühe mich alles zu berücksichtigen.

Vielen Dank Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 28.04.2015, 15:14     Titel:
  Antworten mit Zitat      
Zitat:
Und ich weiß nicht wie ich ein lauffähiges Programmbeispiel abliefern soll, wenn meim Programm nicht funktioniert.

es geht nicht darum das das programm funktioniert. nur das es so läuft das es deinene fehler reproduziert. das ist bei deinem programm nicht der fall da weder xd noch xi bekannt sind oder alpha aus ggw.
Code:
Wird in der GGW-Funktion verwendet. Das y ist global.

das ist eines der nachteile wenn man globle variablen verwendet. das ist so nicht ersichtlich auf den ersten blick.
ich kann von globalen variablen nur abraten.
http://de.mathworks.com/help/optim/.....ghlight=pass%20additional
ist da besser also so glaube ich
Code:
function f=GGW(x,y,alpha)

f=y-alpha*x/(1+(alpha-1)*x);

end


 

und dann
Code:
xp(i+1)=fzero(@(x) GGW(x,y,alpha),0.5);

_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Mikc
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 28.04.15
Wohnort: Heilbronn
Version: R2014b
     Beitrag Verfasst am: 28.04.2015, 15:24     Titel:
  Antworten mit Zitat      
xd ist bekannt, xi wurde weiter oben bereits berechnet.

xd=0.9 und xi (in dem Fall) =0.5

Ich poste am besten auf deine nächste den ganzen Quellcode, dann müsste der Fehler auftreten. Wollte das nur gleich am Anfang vermeiden, da es sich um eine GUI handelt, und somit viel von dem Code meines Wissens nach garnichts mit dem Problem zu tun hat.
Aber wenns hilft Smile

Alpha wird übrigens mittels eines Schiebereglers in der GUI selbst vom jeweiligen Benutzer dann eingestellt. Deshalb alpha auch variabel. Im Moment leider nur bis zu dem Punkt wo dann die rote Kurve den Knickpunkt der rosanen erreicht.
Geht das dann trotzdem0 so wie du beschrieben hast wenn der Wert von einem Slider aus der GUI abgegriffen werden soll und dann in einer anderen Funktion Verwendung findet?? Surprised


PS: was bedeutet dann das @(x)

-->
Code:

xp(i+1)=fzero(@(x) GGW(x,y,alpha),0.5);
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 28.04.2015, 15:33     Titel:
  Antworten mit Zitat      
so jetzt weis ich schonmal was xi und xd ist... jetzt fehlt noch alpha und R... wir nähern uns langsam.
Zitat:
PS: was bedeutet dann das @(x)

sihe dazu den link den ich oben gepostet habe.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Mikc
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 28.04.15
Wohnort: Heilbronn
Version: R2014b
     Beitrag Verfasst am: 28.04.2015, 15:45     Titel:
  Antworten mit Zitat      
Ok. Danke Smile

Alpha bewegt sich zwischen 1 und 5.

Momentan geht es nicht kleiner als 1.96.

Und R=1.5.

Ich seh schon...hätte das von Anfang an alles reinschreiben müssen -.-"

Entschuldige/Entschuldigt bitte. Embarassed Embarassed Embarassed

Hier mal der ganze Code.

Code:
function varargout = untitled1(varargin)
% UNTITLED1 MATLAB code for untitled1.fig
%      UNTITLED1, by itself, creates a new UNTITLED1 or raises the existing
%      singleton*.
%
%      H = UNTITLED1 returns the handle to a new UNTITLED1 or the handle to
%      the existing singleton*.
%
%      UNTITLED1('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in UNTITLED1.M with the given input arguments.
%
%      UNTITLED1('Property','Value',...) creates a new UNTITLED1 or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before untitled1_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to untitled1_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help untitled1

% Last Modified by GUIDE v2.5 30-Mar-2015 15:53:43

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @untitled1_OpeningFcn, ...
                   'gui_OutputFcn',  @untitled1_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before untitled1 is made visible.
function untitled1_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to untitled1 (see VARARGIN)

% Choose default command line output for untitled1
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes untitled1 wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = untitled1_OutputFcn(hObject, eventdata, handles)
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;


% --- Executes on slider movement.
function slider2_Callback(hObject, eventdata, handles)
% hObject    handle to slider2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

global y
global alpha

alpha = get(handles.slider2,'Value')

set(handles.text6,'String',alpha)

% Ausrechnen der Gleichgewichtskurve mit GGW-Funktion
% und relativer Flüchtigkeit alpha

for i=1:11
    y=0.1*(i-1);
    ye(i)=0.1*(i-1);
    xe(i)=fzero('GGW',0.5);
end

% Die Molenbrüche von Kopf, Sumpf und Feed betragen 90 %-mol, 10 %-mol
% und 50 %-mol

xd=0.9;
xb=0.1;
zf=0.5;

% Rücklaufverhältnis

R=1.5;

if(R==inf)
    R=1000;
end

% Feed ist ein zweiteiliges Stoffgemisch mit angenommenem kalorischem
% Faktor 1

k=1;    % Kalorischer Faktor - wie Feed zugeführt wird, kochend oder unterkühlt usw.
        % 1 = flüssig siedend

% Schnittpunkt der Abtriebs- und Verstärkungsgeraden

yi=(zf+xd*k/R)/(1+k/R);
xi=(-(k-1)*(1-R/(R+1))*xd-zf)/((k-1)*R/(R+1)-k);

%figure(1);
%hold on;
%axis([0 1 0 1]);

% Plotten der GGW-Kurve, Bilanzlinie, Verstärkungs- und Abtriebsgeraden

plot(xe,ye,'r');                                        % GGW-Kurve
axis([0 1 0 1]);
set(line([0  1],[0  1]),'Color',[0 1 0]);               % Bilanzlinie
set(line([xd xi],[xd yi]),'Color',[1 0 1]);             % Verstärkungsgerade

% set(line([zf xi],[zf yi]),'Color',[1 0 1]);  VERBINDUNG ZWISCHEN S1 und S

set(line([xb xi],[xb yi]),'Color',[1 0 1]);             % Abtriebsgerade

% Einzeichnen der einzelnen Stufen

% Verstärkungsteil (obere Hälfte)

i=1;
xp(1)=xd;
yp(1)=xd;
xp(2)=1;
y=xd;
while (xp(i)>xi),
    xp(i+1)=fzero('GGW',0.5);
    yp(i+1)=R/(R+1)*xp(i+1)+xd/(R+1);
    y=yp(i+1);
    set(line([xp(i) xp(i+1)],[yp(i) yp(i)]),'Color',[0 0 1]);

    if(xp(i+1)>xi)
        set(line([xp(i+1) xp(i+1)],[yp(i) yp(i+1)]),'Color',[0 0 1]);
    end
        i=i+1;
end    

% Abtriebsteil (untere Hälfte)

% Berechnen des ersten senkrechten Strichs (hier direkt über Feed-Zulauf)
% und einzeichnen sowie zweiten y-Wert als Startwert für weitere Berechnung

SS=(yi-xb)/(xi-xb);
yp(i)=SS*(xp(i)-xb)+xb;
y=yp(i);
set(line([xp(i) xp(i)],[yp(i-1) yp(i)]),'Color',[0 0 1]);

while (xp(i)>=xb),
    xp(i+1)=fzero('GGW',0.5);
    yp(i+1)=SS*(xp(i+1)-xb)+xb;
    y=yp(i+1);
   
   %if(xp(i+1)<xb),   Schleife für letzte Stufe links unten, zum abbrechen
   %     break;
   %end
   
    set(line([xp(i) xp(i+1)],[yp(i) yp(i)]),'Color',[0 0 1]);
    if(xp(i+1)>xb)
        set(line([xp(i+1) xp(i+1)],[yp(i) yp(i+1)]),'Color',[0 0 1]);
    end
       
    i=i+1;
end  


% Hints: get(hObject,'Value') returns position of slider
%        get(hObject,'Min') and get(hObject,'Max') to determine range of slider


% --- Executes during object creation, after setting all properties.
function slider2_CreateFcn(hObject, eventdata, handles)
% hObject    handle to slider2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: slider controls usually have a light gray background.
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor',[.9 .9 .9]);
end
 



Edit: Das grüne am Anfang hätte ich eigentlich weglassen können, aber der Vollständigkeit halber...ich hoffe es stört sich all zu sehr.
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 28.04.2015, 15:59     Titel:
  Antworten mit Zitat      
der von dir gepostete code ist so auch nicht lauffäig aber naja.
ich kann dir nur empfehlen ein problem erstmal als skript zu lösen und dann in die gui zu implementieren.

Code:
clear
xd=0.9;
xi=0.5;
R=1.5;
jj=1;
for alpha=linspace(1.96,5,1000)
xp(1)=xd;
yp(1)=xd;
xp(2)=1;
y=xd;
i=1;
while (xp(i)>xi),
    xp(i+1)=fzero(@(x) GGW(x,y,alpha),0.5);
    yp(i+1)=R/(R+1)*xp(i+1)+xd/(R+1);
    y=yp(i+1);
    set(line([xp(i) xp(i+1)],[yp(i) yp(i)]),'Color',[0 0 1]);

    if(xp(i+1)>xi)
        set(line([xp(i+1) xp(i+1)],[yp(i) yp(i+1)]),'Color',[0 0 1]);
    end
        i=i+1;
end  
test{jj}=xp;
jj=jj+1;
end  
 

Code:
function f=GGW(x,y,alpha)

f=y-alpha*x/(1+(alpha-1)*x);

end

ich hab das mal für 1000 alpha zwischen 1.96 und 5 durchprobiert und keines davon führ zu einer endlosschleife. es ist immer nach 13 durchläufen schluss.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Mikc
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 28.04.15
Wohnort: Heilbronn
Version: R2014b
     Beitrag Verfasst am: 28.04.2015, 16:11     Titel:
  Antworten mit Zitat      
Habe den Code auch erst ohne GUI geschrieben.
Dann das Bewegen des Sliders mit dem kompletten Code verknüpft,
da jedesmal wenn man alpha verändert sich das Diagramm direkt anpassen soll. So das man die Änderung sofort beobachten kann. Kann dann der Fehler darin liegen das alpha im Moment nicht kleiner als 1.96 werden kann da sonst die andere Kurzve geschnitten wird??

Was macht das denn genau??

Code:
test{jj}=xp;


Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 28.04.2015, 16:18     Titel:
  Antworten mit Zitat      
das war nur um alle ergebnisse zu speichern.
ob das eine endlosschleife wird ist so garnicht zu sehen. aber es werden sehr viele berechnungen wenn das alpha unter 1.96 gerät.
ich würde dir empfehlen einfach ein weiteres abbruchkritärium einzubaun.
Code:
while (xp(i)>xi)
    xp(i+1)=fzero(@(x) GGW(x,y,alpha),0.5);
    if abs(xp(i)-xp(i+1))<0.0000001
        break
    end
       
    yp(i+1)=R/(R+1)*xp(i+1)+xd/(R+1);
    y=yp(i+1);
    set(line([xp(i) xp(i+1)],[yp(i) yp(i)]),'Color',[0 0 1]);

    if(xp(i+1)>xi)
        set(line([xp(i+1) xp(i+1)],[yp(i) yp(i+1)]),'Color',[0 0 1]);
    end
        i=i+1;
end  

das sorgt dafür das die schleife nicht ewig läuft. sie läuft nur so lange wie sich die berechneten werte um mehr als 0,0000001 unterscheiden. das kannst du natürlich einstellen wie du willst.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Mikc
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 28.04.15
Wohnort: Heilbronn
Version: R2014b
     Beitrag Verfasst am: 28.04.2015, 16:21     Titel:
  Antworten mit Zitat      
Cool danke Very Happy

Ich werd mich jetzt mal damit befassen...mal schauen wie weit ich komm.

Ansonsten frag ich einfach nochmal Smile

Hab gesehen es gibt auch nen Thread für Projekte...
Wenns fertig ist pack ichs da mal rein Smile
Weil mitten drin ist das vielleicht nicht so gut^^

Danke schonmal. Ich versuch mich mal damit Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 28.04.2015, 16:26     Titel:
  Antworten mit Zitat      
allgemein kann ich nur empfehlen bei while schleifen immer auch mit reinzubaun wie lange sie maximal laufen soll. das kann entweder so passieren wie ich oben geschrieben ab oder du könntest auch in der while bedinungen machen
Code:
while (xp(i)>xi)  && i<1000
damit nur 1000 durchläufe stattfinden. ich hatte sogar schonmal eine zeitabfrage eingebaut das die schleife nach 30 min ihren letzten druchlauf anfängt.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Mikc
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 28.04.15
Wohnort: Heilbronn
Version: R2014b
     Beitrag Verfasst am: 28.04.2015, 16:32     Titel:
  Antworten mit Zitat      
Das ist natürlich auch ein interessanter Weg die Schleife zu begrenzen... Idea
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.