与传染媒介的Matlab 3d子弹头割线方法

时间:2018-04-04 13:00:34

标签: matlab vector projectile runge-kutta

如何使用割线方法计算角度b(正x轴和负y轴之间)我必须抛出一个球才能让它落在x轴上,具有以下条件:

球从原点抛出,高度为z = 1.4 m,角度为a(水平面)为30°,速度为25 m / s。空气阻力系数c = 0.070,地面风力为7 m / s,随着高度的增加而增加:a(z)= 7 + 0.35z。

球的运动描述如下: x' = - qx',y'' = - q(y' -a(z)),z'' = - 9.81- qz',q = c * sqrt(x' ^ 2 +(y' -a(z))^ 2 + z' ^ 2)

我做了一个变量替换(u)然后使用RK4来计算球的运动,但我无法弄清楚如何使用割线方法来找到角度b。问题在于,当我用这些开始和猜测值绘制时,球不会落在x轴上

clear all, close all, clc

a = pi/3; %start angle
c = 0.07; % air resistance coeff.
v0 = 25; %start velocity, 25 m/s
t = 0; %start time
h = 0.1; % 0.1 second step
b = 0

x0 = 0; xPrim = v0*sin(a)*cosd(b);
y0 = 0; yPrim = v0*sin(a)*sind(b); 
z0 = 1.4; zPrim = v0*cos(a);

u = [x0 xPrim y0 yPrim z0 zPrim]';
uVek = u';

% Secant method
b0 = 270;   % Start guess nr 1
b1 = 360;    % Start guess nr 2
f0 = funk (b0);   
db = 1;   

while  abs(db) > 0.5e-8   
    f1 = funk (b1);   
    db = f1 * (b1 - b0) / (f1 - f0);   
    b0 = b1;   % Updates b0
    f0 = f1;   % Updates f0
    b1 = b1 - db   % new b
end

while u(5) >= 0 && u(3)<=0
    f1 = FRK4(t,u);
    f2 = FRK4(t+h/2,u+(h/2)*f1);
    f3 = FRK4(t+h/2,u+(h/2)*f2);
    f4 = FRK4(t+h,u+h*f3);
    f = (f1 + 2*f2 + 2*f3 + f4)/6;
    u = u + h*f;
    uVek = [uVek; u'];

    t = t+h;
end


x = uVek(:,1)'; y = uVek(:,3)'; z = uVek(:,5)';

plot3(x,y,z)
xlabel('X');
ylabel('Y');
zlabel('Z');
grid on

其中FRK4是一个函数:

function uPrim = FRK4(t,u)
c = 0.07;
az = 7+0.35*(u(5));
q = c*sqrt(u(2)^2 +(u(4)- az)^2 + u(6)^2);
uPrim = [u(2) -q*u(2) u(4) -q*(u(4) - az) u(6) -9.81-q*u(6)]';
end

其中funk是一个函数:

function f = funk(b)
a = pi/3
v0 = 25
x0 = 0; xPrim = v0*sin(a)*cosd(b);
y0 = 0; yPrim = v0*sin(a)*sind(b); 
z0 = 1.4; zPrim = v0*cos(a);

f = [x0 xPrim y0 yPrim z0 zPrim]';
end

0 个答案:

没有答案