📄 boat_sol.m
字号:
function t=boat_sol
% 返回时间向量,则最后一点即为航行时间
global v_river v_boat;
v_river=input('请输入水流的速度大小\n');
v_boat=input('请输入船的速度大小\n');
x_initial=input('请输入船的起始位置坐标[x0 y0]\n');
if x_initial(2)<=0
error('对于我所建立的模型,河的宽度必须为正值!');
end
tend=input('请输入预计船的航行截止时间\n');
% 根据实际需要,船只要航行到[0 0]点即应该结束计算,为此
% 我们必须通过odeset函数指定当迭代进行到y(t)=0时就终止
% 迭代过程,而不是一定要计算到截止时间。这通过'events'
% 属性指定终止函数为后续的私有函数
% [value,isterminal,direction] = events(t,y)
% 后两组参数是分别重新设置计算的相对误差和绝对误差,
%大家可选择不要它们或设置其它值
options = odeset('Events',@events,'reltol',1e-4,'abstol',1e-7);
% 在下一条语句中的第四个参数options与上一条语句相互应
% 但值得注意的是第一条参数的书写格式,即调用微分方程
% 函数的形式, 这个问题曾困惑了我一个多小时,过去我们在
% 编写无options的ode调用时,我们既可以用
% 'boat'也可用@boat的形式(后者中的@表示一个函数句柄),
% 但我的个人实践表明,如果ode调用带有options选项,必须
% 使用@boat的形式输入第一个参数
[t,x]=ode45(@boat,[0,tend],x_initial,options);
plot(x(:,1),x(:,2),'*-');
axis equal;
% ode方法求解微分方程迭代终止事件函数
function [value,isterminal,direction] = events(t,y)
value = y(2); %若y(2)==0(即到达对岸)
isterminal = 1; %则结束迭代
direction = -1; %y(2)是由正值向负到达0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -