Как обновить график после изменения значения параметра в приложении Scilab? - PullRequest
0 голосов
/ 03 декабря 2018

Я попытался сделать простое приложение, которое решает оду для данного начального значения y_0.

Например, мы можем иметь:

dy / dt = -2ty

Используя некоторые учебные пособия (сайт scilab и учебник YouTube), я получаю текущую версию:

function dy = f(t,y)
    dy = -2*t*y;
endfunction

function updatePlot()
clf(right)
y0 = get(y0CONTROL,"value");
t0 = 0;
t = 0:0.1:10
solution = ode(y0,t0,t,f);
plot(solution, right)

endfunction

gui = figure();
gui.visible = "on";
gui.immediate_drawing = "on";

left = uicontrol(gui,...
'style','frame',...
'layout','gridbag',...
'constraints', createConstraints('border', 'left',))

right = uicontrol(gui,...
'style','frame',...
'layout','border',...
'constraints', createConstraints('border', 'center'))

y0CONTROL = uicontrol(left, ...
'style','slider', ...
'max', 10, ...
'min', -10, ...
'value',-1,...
'callback', 'updatePlot')

updatePlot()

Как видно, я пытался использовать clf(right) для очистки предыдущего графика и plot(solution,right) для построения теперь предположительно пустого right кадра.

И все же эта попытка не удалась - старые линии остаются на графике после перемещения ползунка.

Пожалуйста, скажите мне, как это исправить.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

более плавное решение - просто изменить данные кривой:

   function updatePlot()
     y0CONTROL;
     y0 = y0CONTROL.value
     curve=y0CONTROL.user_data
     t0 = 0;
     t = 0:0.1:10
     solution = ode(y0,t0,t,f);
     if curve==[] then //first call
       plot(t,solution)
       curve=gce().children(1); //the handle on the curve
       y0CONTROL.user_data=curve;
     else //other calls
       ax=gca();
       ax.data_bounds(:,2)=[min(solution);max(solution)];
       curve.data(:,2)=solution.';
     end
   endfunction

   gui = figure();
   ax=gca();
   gui.visible = "on";
   gui.immediate_drawing = "on";
   y0CONTROL = uicontrol(gui, ...
   'style','slider', ...
   'position',[20 20 100 20],...                      
   'max', 10, ...
   'min', -10, ...
   'value',-1,...
   'callback', 'updatePlot()',...
   'user_data',[])
   ax.background=-2;

   updatePlot()
0 голосов
/ 04 декабря 2018

Оказывается, что освежающий эффект может быть достигнут путем замены clf(right) на

current_axes = gca()
delete(current_axes)

Это было полезно.

...