我试图创建一个简单的应用程序,该应用程序可以为给定的起始值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
框架。
但是此尝试失败-滑块移动后,旧线仍留在图形上。
请告诉我如何解决此问题。
答案 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)