我正在尝试编写一些代码,这些代码允许我点击轴和点击点的ode解决方案,因为初始条件将被绘制。这是我到目前为止所尝试的:
function myui
clc
close all
xmin=2;
xmax=10;
ymin=-4;
ymax=4;
f=@(t,y) y^2-t
fig=figure;
ax=axes('Units','pixels',...
'XLim',[xmin,xmax],...
'YLim',[ymin,ymax],...
'ButtonDownFcn',@plotode)
function plotode(source,event)
initcond=get(ax,'CurrentPoint');
initcond=initcond(1,1:2)
[t,y]=ode45(f,[initcond(1),xmax],initcond(2));
plot(t,y)
hold on
[t,y]=ode45(f,[initcond(1),xmin],initcond(2));
plot(t,y)
axis([xmin xmax ymin ymax])
hold off
end
end
我有几个问题。
我只能点击一次。我想点击几次并绘制几条曲线。
曲线可以很快地射到正负无穷大,所以如果它离开我的轴窗口,我想停止45度。
如果有人可以分享一些完整的代码,我会非常感激,因为我可以学到很多东西。
感谢。
答案 0 :(得分:0)
所有
我已经为我的代码添加了一些执行我希望看到的任务的步骤。
function myui
% clear command window and close all open figures
clc
close all
% define our function
f=@(t,y) y^2-t;
% axes boundaries
tmin=2;
tmax=10;
ymin=-4;
ymax=4;
% steps for quiver
tstep=20;
ystep=20;
% create a figure window
fig=figure;
% create axes with limits
ax=axes('Units','Normalized',...
'XLim',[tmin,tmax],...
'YLim',[ymin,ymax]);
% create direction field with quiver
[T,Y]=meshgrid(linspace(tmin,tmax,tstep),...
linspace(ymin,ymax,ystep));
S=Y.^2-T;
L=sqrt(1+S.^2);
quiver(T,Y,1./L,S./L,0.5,'r','ButtonDownFcn',@plotode)
axis tight
hold on
% set ButtonDownFcn on axes ax
set(ax,'ButtonDownFcn',@plotode);
% function plots initial conditions and solutions
function plotode(source,event)
warning('off','MATLAB:ode45:IntegrationTolNotMet');
initcond=get(ax,'CurrentPoint');
initcond=initcond(1,1:2);
[t,y]=ode45(f,[initcond(1),tmax],initcond(2));
plot(t,y,'b','linewidth',1)
[t,y]=ode45(f,[initcond(1),tmin],initcond(2));
plot(t,y,'b','linewidth',1)
plot(initcond(1),initcond(2),'ro')
set(ax,'XLim',[tmin,tmax],'YLim',[ymin,ymax],...
'ButtonDownFcn',@plotode);
end
end
当我用鼠标多次点击轴时,会生成此图像。
我仍然喜欢听一些指示和建议。
感谢。