在Scilab应用程序中更改参数值后如何刷新图形?

时间:2018-12-03 09:01:59

标签: scilab

我试图创建一个简单的应用程序,该应用程序可以为给定的起始值y_0求解ode。

例如,我们可以拥有:

  

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 :(得分:1)

更平滑的解决方案是更改曲线数据:

   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()

答案 1 :(得分:0)

事实证明,代换可以达到清新的效果 clf(right)

current_axes = gca()
delete(current_axes)

This很有用。