matlab - 使用 Matlab ode45 对弹丸运动进行建模
问题描述
所以我正在尝试使用 Matlab 中的 ode45 求解器对简单的弹丸运动(无空气阻力等)进行建模。到目前为止,这是我的代码:
function [x,y] = trajectory_without_AR_45(v0,theta, dt)
%Path of mortar without air resistance using ode45
g = 9.81;
t_start = 0;
t_end = 100;
%Initial Conditions
y01 = 0; %initial x
y02 = v0 * cos(theta); %finding initial velocity in x direction
y03 = 0; %initial y
y04 = v0 * sin(theta); % finding intial velocity in y direction
y0 = [y01;y02;y03;y04];
%Derivatives
dy1 = y0(2); %vx
dy2 = 0; %ax
dy3 = y0(4); %vy
dy4 = -g; %ay
dy = [dy1;dy2;dy3;dy4];
%Using ODE45
f = @ (t, y) (dy);
solution = ode45(f, [t_start, t_end], y0);
t = t_start : 0.01: t_end;
y = deval(solution, t);
plot (y(:,1), y(:,3)); %plotting trajectory
end
但是,我得到的情节只是一条显然不正确的直线。任何帮助,将不胜感激。
解决方案
我认为您没有正确调用 ode 求解器,您似乎只是在使用初始条件来计算dy
,这是错误的。最好将 ode 函数放在单独的函数(文件)中。例如,以下内容位于missile.m
:
function dY = missile(t,Y)
g = 9.81;
dY(1) = Y(2); %vx
dY(2) = 0; %ax
dY(3) = Y(4); %vy
dY(4) = -g; %ay
end
然后你会调用如下:
t_start = 0;
t_end = 2.3; % changed to something more consistent with when y<0
v0 = 10; % made up
theta=pi/4; % made up
y01 = 0; %initial x
y02 = v0 * cos(theta); %finding initial velocity in x direction
y03 = 0; %initial y
y04 = v0 * sin(theta); % finding intial velocity in y direction
y0 = [y01;y02;y03;y04];
opts = odeset('MaxStep',0.01,'InitialStep',0.001);
[t,y] = ode45(@missile, [t_start, t_end], y0, opts);
plot(t,y)
legend('x','dx','y','dy')
这给出了以下结果:
推荐阅读
- function - 我在 Pine 中声明函数时遇到赋值问题
- python - 正则表达式 Python:从数据框中的列中提取遵循模式的单词
- c++ - C++20,如何用 Clang-10 或 GCC11 编译
- angular - 如何更改数组在控制台中的打印方式?
- javascript - 如何做到这一点,以便当我在 JavaScript 中按下一个按钮时,它会将整个背景更改为黑色,将文本更改为白色?
- mysql - SQL 语句在所有列中搜索关键字
- junit4 - Spring Boot Controller Test with Mock Service 不使用模拟服务
- node.js - node koa REST(打字稿)挂在firebase数据库调用上
- azure-cognitive-search - 单个 Azure 搜索索引中具有不同属性的多个表
- python - 在 Python 中使用 ftplib 包进行异常处理