数学建模笔记-斜抛运动建模

数学建模笔记-斜抛运动建模

作者:Peiy_Liu
日期:2020-02-04


1. 数学模型

质量为m的质点作斜抛运动,假定质点出射后,只受到恒力 m g m\bf{g} mg和空气阻力 f \bf{f} f作用,其中f的大小与速度大小的平方成正比,方向与速度相反,即 f = − k v 2 (1.1) f=-kv^2 \tag{1.1} f=kv2(1.1)则质点始终在初速度确定的竖直平面内运动,在质点运动平面内以高度为0处一点为原点,水平方向为 x x x轴,竖直方向为 y y y轴建立坐标系。令 r \bf{r} r = [ x y ] T = \left[\begin{matrix}x&y\end{matrix}\right]^T =[xy]T为质点的位矢,由牛顿第二定律列出质点动力学方程 f + m g = m r ¨ (1.2) {\bf{f}}+m{\bf{g}}=m\ddot{\bf r} \tag{1.2} f+mg=mr¨(1.2)由于空气阻力方向与速度方向相反, f \bf{f} f可写为 f = − k v 2 e = − k [ x ˙ x ˙ 2 + y ˙ 2 y ˙ x ˙ 2 + y ˙ 2 ] (1.3) {\bf{f}}=-kv^2{\bf{e}}=-k\left[\begin{matrix}\dot{x}\sqrt{\dot{x}^2+\dot{y}^2}\\\dot{y}\sqrt{\dot{x}^2+\dot{y}^2}\end{matrix}\right] \tag{1.3} f=kv2e=k[x˙x˙2+y˙2 y˙x˙2+y˙2 ](1.3)式中 e = [ 1 / 1 + y ′ 2 y ′ / 1 + y ′ 2 ] T {\bf{e}}=\left[\begin{matrix}1/\sqrt{1+y'^2}&y'/\sqrt{1+y'^2}\end{matrix}\right]^T e=[1/1+y2 y/1+y2 ]T为质点速度方向的单位矢量.由此,式(1.2)可写成一个二阶微分方程组 { m x ¨ = − k x ˙ x ˙ 2 + y ˙ 2 m y ¨ = − k y ˙ x ˙ 2 + y ˙ 2 − m g (1.4) \begin{cases}m\ddot{x}=-k\dot{x}\sqrt{\dot{x}^2+\dot{y}^2}\\m\ddot{y}=-k\dot{y}\sqrt{\dot{x}^2+\dot{y}^2}-mg\end{cases}\tag{1.4} {mx¨=kx˙x˙2+y˙2 my¨=ky˙x˙2+y˙2 mg(1.4)再令 z 1 = x ˙ , z 2 = y ˙ z_1=\dot{x},z_2=\dot{y} z1=x˙,z2=y˙方程组(1.4)化为形如 Y ′ = f ( t , Y ) (1.5) {\bf Y'}={\bf f}(t,{\bf Y})\tag{1.5} Y=f(t,Y)(1.5)的标准形式 { z 1 ˙ = − k z 1 z 1 2 + z 2 2 / m z 2 ˙ = − k z 2 z 1 2 + z 2 2 / m − g (1.6) \begin{cases}\dot{z_1}=-kz_1\sqrt{z_1^2+z_2^2}/m\\\dot{z_2}=-kz_2\sqrt{z_1^2+z_2^2}/m-g\end{cases}\tag{1.6} {z1˙=kz1z12+z22 /mz2˙=kz2z12+z22 /mg(1.6)
就可以用MATLAB中提供的函数求解了。

2. MATLAB建模

2.1 MATLAB解常微分方程

很多常微分方程难以求出解析解,需要运用数值解法,如方程组(1.6)。MATLAB提供了如ode45、ode23、ode113等函数可以解出形如式(1.5)的常微分方程(组)的数值解,通用用法为

[T,Y] = solver(fun,tspan,y0)

solver可用ode45、ode23、ode113中的任意一个替代,fun为等式右边的 f \bf f f向量,它所代表的M文件须有如下形式

function dy = fun(t,y)
    dy = ...

不管是否在fun中用到,fun一定有两个参数t和y。tspan为求解区间向量,y0为初值向量。返回值中T是自变量的取值,Y的各列为数值解。对由一个高阶常微分方程化为的方程组。Y(:1)是对应t的初值解,Y(:n)为对应t处初值解的n-1阶导数。

2.2 编程求轨迹

先用上述方法解出 z 1 , z 2 z_1,z_2 z1,z2(即 v x , v y v_x,v_y vx,vy),再对分速度分别进行数值积分则可得到轨迹上的点 ( x , y ) (x,y) (x,y),最后可使用plot()函数绘出轨迹图。下面是代码

m = 2;                                    %质点质量kg
k = 0.50;                                 %空气阻力f = -k * v^2,国际单位
g = 9.8;                                  %重力加速度
theta = pi / 4;                           %出射仰角rad
v0 = 20;                                  %初速度大小
vx0 = v0 * cos(theta);
vy0 = v0 * sin(theta);
z0 = [vx0, vy0];                          %构造微分方程组
x0 = 0;
y0 = 0;
f = @(t,z) [-k * z(1) * sqrt(z(1)^2 + z(2)^2) / m; -k * z(2) * sqrt(z(1)^2 + z(2)^2) / m - g];
[T, Z] = ode45(f, [0, 1.5], z0);
vx = Z(:,1);
vy = Z(:,2);
x = x0;
y = y0;
for i = 1:length(T)-1                     %手动数值积分
    tempx =  x(i) + vx(i) * (T(i+1) - T(i));
    tempy =  y(i) + vy(i) * (T(i+1) - T(i));
    x = [x;tempx];
    y = [y;tempy];
end
plot(x, y)

运行效果如图
在这里插入图片描述
##参考文献
司守奎《数学建模算法与应用》

  • 14
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
小球运动可以通过 Python 进行建模,建议使用 SciPy 库中的 odeint 函数来求解微分方程。 首先,我们需要确定小球在空中的运动轨迹。在运动中,小球在水平方向匀速运动,在竖直方向上受到重力加速度的作用。假设小球的初始速度为 v0,出角度为θ,重力加速度为 g,则小球在空中的运动轨迹可以表示为: x = v0 * t * cos(θ) y = v0 * t * sin(θ) - 0.5 * g * t ** 2 其中,t 表示时间。 接下来,我们需要求解小球在空中的运动轨迹上每个时刻的速度和加速度。根据牛顿第二定律,小球受到的合力等于质量乘以加速度,即: F = m * a 其中,m 表示小球的质量,a 表示小球的加速度。在运动中,小球受到的合力可以分解为水平方向和竖直方向上的分力,即: Fx = 0 Fy = - m * g 因此,小球在空中的运动轨迹上每个时刻的速度和加速度可以表示为: vx = v0 * cos(θ) vy = v0 * sin(θ) - g * t ax = 0 ay = - g 最后,我们可以使用 SciPy 库中的 odeint 函数来求解微分方程。具体地,我们可以将小球在空中的运动轨迹上每个时刻的速度和加速度表示为一个向量,然后将其传入 odeint 函数中,即可得到小球在空中的运动轨迹。 以下是一段示例代码,用于求解小球在空中的运动轨迹: ``` import numpy as np from scipy.integrate import odeint # 定义微分方程 def func(y, t, g): vx, vy, x, y = y dxdt = vx dydt = vy dvxdt = 0 dvydt = - g return [dvxdt, dvydt, dxdt, dydt] # 定义初始条件 v0 = 10 theta = np.pi / 4 m = 1 g = 9.8 y0 = [v0 * np.cos(theta), v0 * np.sin(theta), 0, 0] # 定义时间间隔 t = np.linspace(0, 2 * v0 * np.sin(theta) / g, 100) # 求解微分方程 sol = odeint(func, y0, t, args=(g,)) # 绘制运动轨迹 import matplotlib.pyplot as plt plt.plot(sol[:, 2], sol[:, 3]) plt.xlabel('x') plt.ylabel('y') plt.show() ``` 在上述代码中,func 函数表示微分方程,y0 表示初始条件,t 表示时间间隔,sol 是求解得到的小球在空中的运动轨迹。您可以根据需要修改初始条件和时间间隔。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值