Slider in Matlab code

14 views (last 30 days)
Yamina chbak
Yamina chbak on 7 Jan 2024
Commented: Voss on 10 Jan 2024
MATLAB code is a basic interactive application for visualizing a stochastic process :
close all
clc
% Initialize figure
fig = figure('Position', [100, 100, 1000, 600], 'Name', 'Interactive Stochastic Fractional Order Analysis');
% Initial parameters
mu = 0.2;
sigma = 0.2;
s = 100;
dt = 0.01;
N = 1000;
T = N * dt;
% Create sliders and labels for adjusting parameters
uicontrol('Style', 'text', 'Position', [20, 550, 100, 20], 'String', '\mu');
uicontrol('Style', 'slider', 'Min', 0, 'Max', 1, 'Value', mu, 'Position', [120, 550, 300, 20], 'Callback', @(src, event) updatePlot());
uicontrol('Style', 'text', 'Position', [20, 500, 100, 20], 'String', '\sigma');
uicontrol('Style', 'slider', 'Min', 0, 'Max', 1, 'Value', sigma, 'Position', [120, 500, 300, 20], 'Callback', @(src, event) updatePlot());
uicontrol('Style', 'text', 'Position', [20, 450, 100, 20], 'String', 's');
uicontrol('Style', 'slider', 'Min', 100, 'Max', 500, 'Value', s, 'Position', [120, 450, 300, 20], 'Callback', @(src, event) updatePlot());
uicontrol('Style', 'text', 'Position', [20, 400, 100, 20], 'String', '\Delta t');
uicontrol('Style', 'slider', 'Min', 0.001, 'Max', 0.1, 'Value', dt, 'Position', [120, 400, 300, 20], 'Callback', @(src, event) updatePlot());
uicontrol('Style', 'text', 'Position', [20, 350, 100, 20], 'String', 'N_T');
uicontrol('Style', 'slider', 'Min', 100, 'Max', 2000, 'Value', N, 'Position', [120, 350, 300, 20], 'Callback', @(src, event) updatePlot());
% Create axes for plotting
ax = axes('Parent', fig, 'Position', [0.1, 0.1, 0.8, 0.4]);
% Initial plot
set(findobj('String', '\sigma'), 'Value', sigma); % Update the slider value
set(findobj('String', '\mu'), 'Value', mu); % Update the slider value
set(findobj('String', '\Delta t'), 'Value', dt); % Update the slider value
set(findobj('String', 's'), 'Value', s); % Update the slider value
set(findobj('String', 'N_T'), 'Value', N); % Update the slider value
updatePlot(); % Manually call the updatePlot function
% Update plot function
function updatePlot()
% Get current slider values
mu = get(findobj('String', '\mu'), 'Value');
sigma = get(findobj('String', '\sigma'), 'Value');
s = get(findobj('String', 's'), 'Value');
dt = get(findobj('String', '\Delta t'), 'Value');
N = get(findobj('String', 'N_T'), 'Value');
% Run stochastic simulation with updated parameters
alpha = simulateStochasticProcess(mu, sigma, dt, N);
% Define time vector based on the simulation duration
T = N * dt;
t = dt:dt:T;
% Update plot based on simulation results
ax = findobj(gcf, 'Type', 'axes');
plot(ax, t, alpha, 'LineWidth', 1);
xlabel('Time t');
ylabel('Stochastic Order \alpha');
title(['\mu = ', num2str(mu), ', \sigma = ', num2str(sigma), ', s = ', num2str(s), ', \Delta t = ', num2str(dt), ', N_T = ', num2str(N)]);
grid on;
% Update slider values to reflect the changes
set(findobj('String', '\mu'), 'Value', mu);
set(findobj('String', '\sigma'), 'Value', sigma);
set(findobj('String', 's'), 'Value', s);
set(findobj('String', '\Delta t'), 'Value', dt);
set(findobj('String', 'N_T'), 'Value', N);
end
% Function to simulate stochastic process
function alpha = simulateStochasticProcess(mu, sigma, dt, N)
sd = sqrt(dt);
dB = sd * randn(1, N);
B = cumsum(dB);
alpha = mu + sigma * B;
end
I try to display Slider Values when i change these values and visualize the effect on the stochastic process, also each slider shows a corresponding LaTeX text.
how can I do? thanks.

Accepted Answer

Voss
Voss on 7 Jan 2024
The labels (i.e., the 'text'-stlye uicontrols) have the strings you are passing to findobj, not the sliders, so findobj returns those text uicontrols, not the slider uicontrols.
In fact, it is not usually necessary to use findobj. Instead, store the uicontrol handles in variables, and refer to those variables later when you want to get properties of the uicontrols. To access those variables in uicontrol callbacks, there are various approaches you can take; I like to have the callbacks nested in a main function, like in the code that follows.
I've included updating the labels' Strings to reflect the current slider Values in updatePlot (which I guess is what you were going for when you were updating the slider Values). LaTeX in a uicontrol text String will not be rendered, but you can use uilabels instead of uicontrols to do it.
GUI() % run the main function
function GUI() % your script is now a function with the other functions nested in it
% Initialize figure
fig = figure('Position', [100, 100, 1000, 600], 'Name', 'Interactive Stochastic Fractional Order Analysis');
% Initial parameters
mu = 0.2;
sigma = 0.2;
s = 100;
dt = 0.01;
N = 1000;
T = N * dt;
% Create sliders and labels for adjusting parameters
h_labels = [ ...
uicontrol('Style', 'text', 'Position', [20, 550, 100, 20]) ...
uicontrol('Style', 'text', 'Position', [20, 500, 100, 20]) ...
uicontrol('Style', 'text', 'Position', [20, 450, 100, 20]) ...
uicontrol('Style', 'text', 'Position', [20, 400, 100, 20]) ...
uicontrol('Style', 'text', 'Position', [20, 350, 100, 20]) ...
];
h_sliders = [ ...
uicontrol('Style', 'slider', 'Min', 0, 'Max', 1, 'Value', mu, 'Position', [120, 550, 300, 20], 'Callback', @(src, event) updatePlot()) ...
uicontrol('Style', 'slider', 'Min', 0, 'Max', 1, 'Value', sigma, 'Position', [120, 500, 300, 20], 'Callback', @(src, event) updatePlot()) ...
uicontrol('Style', 'slider', 'Min', 100, 'Max', 500, 'Value', s, 'Position', [120, 450, 300, 20], 'Callback', @(src, event) updatePlot()) ...
uicontrol('Style', 'slider', 'Min', 0.001, 'Max', 0.1, 'Value', dt, 'Position', [120, 400, 300, 20], 'Callback', @(src, event) updatePlot()) ...
uicontrol('Style', 'slider', 'Min', 100, 'Max', 2000, 'Value', N, 'Position', [120, 350, 300, 20], 'Callback', @(src, event) updatePlot()) ...
];
% Create axes for plotting
ax = axes('Parent', fig, 'Position', [0.1, 0.1, 0.8, 0.4]);
% Initial plot
updatePlot(); % Manually call the updatePlot function
% Update plot function
function updatePlot()
% Get current slider values
mu = get(h_sliders(1),'Value');
sigma = get(h_sliders(2),'Value');
s = get(h_sliders(3),'Value');
dt = get(h_sliders(4),'Value');
N = round(get(h_sliders(5),'Value'));
% Run stochastic simulation with updated parameters
alpha = simulateStochasticProcess(mu, sigma, dt, N);
% Define time vector based on the simulation duration
T = N * dt;
t = dt:dt:T;
% Update plot based on simulation results
plot(ax, t, alpha, 'LineWidth', 1);
xlabel('Time t');
ylabel('Stochastic Order \alpha');
title(['\mu = ', num2str(mu), ', \sigma = ', num2str(sigma), ', s = ', num2str(s), ', \Delta t = ', num2str(dt), ', N_T = ', num2str(N)]);
grid on;
% update the labels:
set(h_labels(1),'String',sprintf('mu = %g',mu));
set(h_labels(2),'String',sprintf('sigma = %g',sigma));
set(h_labels(3),'String',sprintf('s = %g',s));
set(h_labels(4),'String',sprintf('dt = %g',dt));
set(h_labels(5),'String',sprintf('NT = %g',N));
end
% Function to simulate stochastic process
function alpha = simulateStochasticProcess(mu, sigma, dt, N)
sd = sqrt(dt);
dB = sd * randn(1, N);
B = cumsum(dB);
alpha = mu + sigma * B;
end
end
  3 Comments
Yamina chbak
Yamina chbak on 8 Jan 2024
Thanks you @Voss for your help with the code. I really appreciate it!
Voss
Voss on 10 Jan 2024
You're welcome!

Sign in to comment.

More Answers (0)

Categories

Find more on Migrate GUIDE Apps in Help Center and File Exchange

Products


Release

R2021a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!