function varargout = MarkovTool(varargin) % Last Modified by GUIDE v2.5 23-Aug-2006 12:06:54 % Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @MarkovTool_OpeningFcn, ... 'gui_OutputFcn', @MarkovTool_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 MarkovTool is made visible. function MarkovTool_OpeningFcn(hObject, eventdata, handles, varargin) global prob_a prob_b prob_state; global precision n; %No more than 3 digits n = 3; precision = 10^n; prob_a = 0.5; prob_b = 0.5; prob_state = 0.5; % Choose default command line output for MarkovTool handles.output = hObject; % Update handles structure guidata(hObject, handles); % UIWAIT makes MarkovTool wait for user response (see UIRESUME) % uiwait(handles.figure1); % --- Outputs from this function are returned to the command line. function varargout = MarkovTool_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output; % --- Executes on slider movement. function ProbASlider_Callback(hObject, eventdata, handles) global prob_a; global precision; prob_a = round(precision*get(handles.ProbASlider,'Value'))/precision; set(handles.CondProbA,'String',num2str(prob_a)); set(handles.warningA, 'String', strcat('Updated value of P(A|A):', num2str(prob_a))); % --- Executes during object creation, after setting all properties. function ProbASlider_CreateFcn(hObject, eventdata, handles) global prob_a; % Hint: slider controls usually have a light gray background. if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 .9 .9]); end set(hObject,'Value',prob_a) % --- Executes on slider movement. function ProbBSlider_Callback(hObject, eventdata, handles) global prob_b; global precision; prob_b = round(precision*get(handles.ProbBSlider,'Value'))/precision; set(handles.CondProbB,'String',num2str(prob_b)); set(handles.warningB, 'String', strcat('Updated value of P(B|B):', num2str(prob_b))); % --- Executes during object creation, after setting all properties. function ProbBSlider_CreateFcn(hObject, eventdata, handles) global prob_b; % Hint: slider controls usually have a light gray background. if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 .9 .9]); end set(hObject,'Value',prob_b); % --- Executes on slider movement. function StateSlider_Callback(hObject, eventdata, handles) global prob_state; global precision; prob_state = round(precision*get(handles.StateSlider,'Value'))/precision; set(handles.StateInitial,'String',num2str(prob_state)); set(handles.warningState, 'String', strcat('Updated value of StateInit:', num2str(prob_state))); % --- Executes during object creation, after setting all properties. function StateSlider_CreateFcn(hObject, eventdata, handles) global prob_state; if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 .9 .9]); end set(hObject,'Value',prob_state); function CondProbA_Callback(hObject, eventdata, handles) global prob_a precision; temp_str = get(handles.CondProbA,'String'); temp = str2double(temp_str); if (isempty(temp) || (temp < 0) || isnan(temp) || (temp > 1) || ~isreal(temp)) % the input is invalid set(handles.warningA, 'String', ... strcat('INVALID INPUT for P(A|A):',temp_str, '. Current value: ',... num2str(prob_a))); else prob_a = round(precision*temp)/precision; set(handles.warningA, 'String', strcat('Updated value of P(A|A):', num2str(prob_a))); set(handles.CondProbA, 'String', num2str(prob_a)); set(handles.ProbASlider, 'Value', prob_a); end % --- Executes during object creation, after setting all properties. function CondProbA_CreateFcn(hObject, eventdata, handles) global prob_a; if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end set(hObject, 'String', num2str(prob_a)); function CondProbB_Callback(hObject, eventdata, handles) global prob_b precision; temp_str = get(handles.CondProbB,'String'); temp = str2double(temp_str); if (isempty(temp) || (temp < 0) || isnan(temp) || (temp > 1) || ~isreal(temp)) % the input is invalid set(handles.warningB, 'String', ... strcat('INVALID INPUT for P(B|B):',temp_str, '. Current value: ',... num2str(prob_b))); else prob_b = round(precision*temp)/precision; set(handles.warningB, 'String', strcat('Updated value of P(B|B):', num2str(prob_b))); set(handles.CondProbB, 'String', num2str(prob_b)); set(handles.ProbBSlider, 'Value', prob_b); end % --- Executes during object creation, after setting all properties. function CondProbB_CreateFcn(hObject, eventdata, handles) global prob_b; if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end set(hObject, 'String', num2str(prob_b)); function StateInitial_Callback(hObject, eventdata, handles) global prob_state precision; temp_str = get(handles.StateInitial,'String'); temp = str2double(temp_str); if (isempty(temp) || (temp < 0) || isnan(temp) || (temp > 1) || ~isreal(temp)) % the input is invalid set(handles.warningState, 'String', ... strcat('INVALID INPUT for StateInit:',temp_str, '. Current value: ',... num2str(prob_state))); else prob_state = round(precision*temp)/precision; set(handles.warningState, 'String', strcat('Updated value of StateInit:', num2str(prob_state))); set(handles.StateInitial, 'String', num2str(prob_state)); set(handles.StateSlider, 'Value', prob_state); end % --- Executes during object creation, after setting all properties. function StateInitial_CreateFcn(hObject, eventdata, handles) global prob_state; if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end set(hObject, 'String', num2str(prob_state)); % --- Executes on button press in StartButton. function StartButton_Callback(hObject, eventdata, handles) disp('Markov Chain simulation started') set(handles.warningA, 'String', ' '); set(handles.warningB, 'String', ' '); set(handles.warningState, 'String', ' '); markov2f(handles.StateAxes); function markov2f(hAxes); global prob_a prob_b prob_state; %To do a simple 2x2 Markov chain and plot the change in the state x=zeros(1,25); y=zeros(1,25); x(1)=prob_state; y(1)=1-x(1); p=prob_a; q=prob_b; T=[p,1-q;1-p,q]; for n=1:24 axes(hAxes); axis on; x(n+1)=T(1,1)*x(n)+T(1,2)*y(n); y(n+1)=T(2,1)*x(n)+T(2,2)*y(n); plot(hAxes, x(1:n));grid on; hold on plot(hAxes,y(1:n)); axis([0,25,0,1]); drawnow; end hold off; disp(x(25));