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.
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??
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:
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.
_________________
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:
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
Bin auch grad am Lesen des "Richtig fragen"-Threads.
Bemühe mich alles zu berücksichtigen.
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.
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
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??
Ich seh schon...hätte das von Anfang an alles reinschreiben müssen -.-"
Entschuldige/Entschuldigt bitte.
Hier mal der ganze Code.
Code:
functionvarargout = 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', []);
ifnargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
% --- 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;
% UIWAIT makes untitled1 wait for user response (see UIRESUME) % uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line. functionvarargout = 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)
% 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. ifisequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 .9 .9]);
end
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.
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.
_________________
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??
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);
ifabs(xp(i)-xp(i+1))<0.0000001 break 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.
_________________
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
damit nur 1000 durchläufe stattfinden. ich hatte sogar schonmal eine zeitabfrage eingebaut das die schleife nach 30 min ihren letzten druchlauf anfängt.
_________________
Das ist natürlich auch ein interessanter Weg die Schleife zu begrenzen...
Einstellungen und Berechtigungen
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
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.