求解二次阻力的耦合微分方程

时间:2020-10-18 07:21:41

标签: java python matlab drag projectile

目标

我一直在尝试求解和绘制以下属于二次阻力的耦合微分方程:

enter image description here

方程式中的变量定义为:

c = 0.0004
m = 0.0027
starting position of projectile= (0,0.3)
velocity on horizontal component = 2.05
velocity on vertical component = 0.55
g = 9.81

问题

我似乎无法正确求解方程式,并且在编程中遇到一些错误

我尝试过的事情

我已经尝试过在MatLab上在线使用代码,也曾经在Matematica上进行过尝试,但是他们都无法编写此方程。我也尝试过在Python上查看SciPy,但似乎不起作用。

有人可以指导我如何正确编码吗?

1 个答案:

答案 0 :(得分:1)

您可以使用许多MATLAB内置的ODE求解器。 /// An affordance for adding extensions to every type. @propertyWrapper public struct Wrapped<Value> { public var wrappedValue: Value public var projectedValue: Self { self } public init(wrappedValue: Value) { self.wrappedValue = wrappedValue } } public extension Wrapped where Value: AnyObject { func callAsFunction( transform: (Value) throws -> Void ) rethrows { try transform(wrappedValue) } } public extension Wrapped { init(_ wrappedValue: Value) { self.init(wrappedValue: wrappedValue) } func callAsFunction( transform: (Value) throws -> Value ) rethrows -> Value { try transform(wrappedValue) } mutating func callAsFunction( transform: (inout Value) throws -> Void ) rethrows { try transform(&wrappedValue) } } 通常是一个很好的起点。

您有两个位置和两个速度(总共4个状态),因此您需要将4个ODE传递给求解器ode45(每个状态一个导数)。 如果ode45是x位置,x(1)是y位置,x(2)是x速度,而x(3)是y速度,则x(4)x(1)x(3)的导数是x(2)x(4)x(3)的导数是由您的两个阻力方程式给出的

最后,MATLAB实现可能如下所示:

x(4)

您可以按如下所示绘制结果:

c = 0.0004;
m = 0.0027;
p0 = [0; 0.3]; % starting positions 
v0 = [2.05; 0.55]; % starting velocities
g = -9.81; % gravitational acceleration

tspan = [0 5];
x0 = [p0; v0]; % initial states
[t_sol, x_sol] = ode45(@(t,x) drag_ode_fun(t,x,c,m,g), tspan, x0);

function dxdt = drag_ode_fun(t,x,c,m,g)
   dxdt = zeros(4,1);
   dxdt(1) = x(3);
   dxdt(2) = x(4);
   dxdt(3) = -c/m*x(3)*sqrt(x(3)^2+x(4)^2);
   dxdt(4) = g-c/m*x(4)*sqrt(x(3)^2+x(4)^2);
end