比例导引理想弹道仿真

参考文献:[1]高尚.比例导引理想弹道仿真[J].计算机工程与设计, 2003, 24(8):3.DOI:10.3969/j.issn.1000-7024.2003.08.023.

​ 本文主要写的是对《比例导引理想弹道仿真》的部分公式推导,以及对文章源码的一些改动。如有错误,恳请大家留言指点。

部分公式推导

​ 比例导引法在导弹导向目标的过程中,弹道速度向量的旋转角速度的变化率 d θ = d t d\theta=dt dθ=dt与目标视线的旋转角速度 d q / d t dq/dt dq/dt成正比。导引方程为 d θ = m d q / d t d\theta=mdq/dt dθ=mdq/dt m m m为比例系数。

image-20240228224350204

​ 比例导引法

​ 导弹与目标在同一平面内运动,设 M k M_k Mk表示第 k k k个时间间隔时,导弹的空间位置; M k + 1 M_{k+1} Mk+1表示第 k + 1 k+1 k+1个时间间隔时,导弹的空间位置; T k T_k Tk表示第 k k k个时间间隔时,目标的空间位置; r ( k ) r(k) r(k)表示第 k k k个时间间隔时,导弹与目标的距离; S m S_m Sm表示导弹在一个时间间隔内运动的距离( S m = v m ∗ Δ t S_m=v_m*\Delta{t} Sm=vmΔt)。 x m x_m xm y m y_m ym z m z_m zm分别表示导弹的立体直角纵坐标, x t x_t xt y t y_t yt z t z_t zt分别表示目标的立体直角纵坐标, M k − 1 M k M_{k-1}M_{k} Mk1Mk表示导弹在一个时间间隔内运动的距离 S m S_m Sm T k − 1 T k T_{k-1}T_{k} Tk1Tk表示目标在一个时间间隔内运动的距离,大小是 S t S_t St,作 M k − 1 T k − 1 M_{k-1}T_{k-1} Mk1Tk1的平行线 M k B M_kB MkB。设 M k − 1 T c = c M_{k-1}T_c=c Mk1Tc=c A M K − 1 = c 2 AM_{K-1}=c_2 AMK1=c2 ∠ A M k − 1 T k − 1 = α k − 1 \angle AM_{k-1}T_{k-1}=\alpha_{k-1} AMk1Tk1=αk1,由几何知识可知,

β k − 1 = ∠ A M k − 1 T k − 1 = a r c c o s ( [ r i ( k − 1 ) ] 2 + s t 2 + c 2 2 ∗ r i ( k − 1 ) ∗ s t ) \beta_{k-1}=\angle AM_{k-1}T_{k-1}=arccos(\dfrac{\left[r_i(k-1)\right]^2 +s_t^2+c^2}{2*r_i(k-1)*s_t}) βk1=AMk1Tk1=arccos(2ri(k1)st[ri(k1)]2+st2+c2)

Δ q k − 1 = ∠ A M k T k ≈ ∠ T M k − 1 T k − 1 = a r c c o s ( [ r i ( k − 1 ) ] 2 − s t 2 + c 2 2 ∗ r i ( k − 1 ) ∗ c ) \Delta q_{k-1} = \angle AM_k T_k \approx \angle TM_{k-1}T_{k-1} = arccos(\dfrac{\left[r_i(k-1)\right]^2 - s_t^2+c^2}{2*r_i(k-1)*c}) Δqk1=AMkTkTMk1Tk1=arccos(2ri(k1)c[ri(k1)]2st2+c2)

r i ( k ) = ( x i ( k ) − x m ( k ) ) 2 + ( y ( k ) − y m ( k ) ) 2 + ( z i ( k ) − z m ( k ) ) 2 r_i(k) = \sqrt{(x_i(k)-x_m(k))^2 + (y(k)-y_m(k))^2 + (z_i(k)-z_m(k))^2} ri(k)=(xi(k)xm(k))2+(y(k)ym(k))2+(zi(k)zm(k))2

c = ( x i ( k ) − x m ( k − 1 ) 2 + ( y i ( k ) − y m ( k − 1 ) ) 2 + ( z r ( k ) − z m ( k − 1 ) ) 2 c=\sqrt{(x_i(k)-x_m(k-1)^2 + (y_i(k)-y_m(k-1))^2 + (z_r(k) -z_m(k-1))^2} c=(xi(k)xm(k1)2+(yi(k)ym(k1))2+(zr(k)zm(k1))2

c 1 = r i ( k − 1 ) s i n ( β k − 1 ) s i n ( α k − 1 + β k − 1 ) c_1 = \dfrac{r_i(k-1)sin(\beta_{k-1})}{sin(\alpha_{k-1}+\beta_{k-1})} c1=sin(αk1+βk1)ri(k1)sin(βk1)

c 2 = r i ( k − 1 ) s i n ( α k − 1 ) s i n ( α k − 1 + β k − 1 ) c_2 = \dfrac{r_i(k-1)sin(\alpha_{k-1})}{sin(\alpha_{k-1}+\beta_{k-1})} c2=sin(αk1+βk1)ri(k1)sin(αk1)

​ 导弹的直角纵坐标的差分方程为: { q k = q k − 1 + Δ q θ k = θ k − 1 + m Δ q α k = θ k − q k − 1 x t ( k ) = x t ( k − 1 ) + c 2 s t ( x t ( k ) − x t ( k − 1 ) ) y t ( k ) = y t ( k − 1 ) + c 2 s t ( y t ( k ) − y t ( k − 1 ) ) z t ( k ) = z t ( k − 1 ) + c 2 s t ( z t ( k ) − z t ( k − 1 ) ) x m ( k ) = x m ( k − 1 ) + s m c 1 ( x t ( k ) − x m ( k − 1 ) ) y m ( k ) = y m ( k − 1 ) + s m c 1 ( y t ( k ) − y m ( k − 1 ) ) z m ( k ) = z m ( k − 1 ) + s m c 1 ( z t ( k ) − z m ( k − 1 ) ) \begin{cases} q_k=q_{k-1}+\Delta q\\ \theta_k = \theta_{k-1} + m\Delta_q\\ \alpha_k = \theta_k -q_{k-1}\\ x_t(k)=x_t(k-1)+\dfrac{c_2}{s_t}(x_t(k)-x_t(k-1))\\ y_t(k)=y_t(k-1)+\dfrac{c_2}{s_t}(y_t(k)-y_t(k-1))\\ z_t(k)=z_t(k-1)+\dfrac{c_2}{s_t}(z_t(k)-z_t(k-1))\\ x_m(k)=x_m(k-1)+\dfrac{s_m}{c_1}(x_t(k)-x_m(k-1))\\ y_m(k)=y_m(k-1)+\dfrac{s_m}{c_1}(y_t(k)-y_m(k-1))\\ z_m(k)=z_m(k-1)+\dfrac{s_m}{c_1}(z_t(k)-z_m(k-1))\\ \end{cases} qk=qk1+Δqθk=θk1+mΔqαk=θkqk1xt(k)=xt(k1)+stc2(xt(k)xt(k1))yt(k)=yt(k1)+stc2(yt(k)yt(k1))zt(k)=zt(k1)+stc2(zt(k)zt(k1))xm(k)=xm(k1)+c1sm(xt(k)xm(k1))ym(k)=ym(k1)+c1sm(yt(k)ym(k1))zm(k)=zm(k1)+c1sm(zt(k)zm(k1))

​ 导弹与目标接近时,用 ∠ A M k − 1 T k − 1 \angle AM_{k-1}T_{k-1} AMk1Tk1近似 Δ q k − 1 \Delta q_{k-1} Δqk1时误差比较大,因此要修正:

c 3 = ( c 1 − s m ) 2 + ( c 2 − s t ) 2 + x ( c 1 − s m ) ( c 2 − s t ) c o s ( α + β ) c_3=\sqrt{(c_1-s_m)^2+(c_2-s_t)^2+x(c_1-s_m)(c_2-s_t)cos(\alpha +\beta)} c3=(c1sm)2+(c2st)2+x(c1sm)(c2st)cos(α+β)

Δ q = α − a r c c o s ( ( c 1 − s m ) 2 + c 3 2 − ( c 2 − s t ) 2 2 ( c t − s m ) c 3 ) \Delta q = \alpha - arccos(\dfrac{(c_1-s_m)^2+c_3^2-(c_2-s_t)^2}{2(c_t -s_m)c_3}) Δq=αarccos(2(ctsm)c3(c1sm)2+c32(c2st)2)

部分证明如下:

M k − 1 M_{k-1} Mk1 Δ M k − 1 T k − 1 T k \Delta M_{k-1}T_{k-1}T_k ΔMk1Tk1Tk的高 M k − 1 H M_{k-1}H Mk1H,设 T k − 1 H T_{k-1}H Tk1H x x x,那么有

r ( k − 1 ) 2 − x 2 = c 2 − ( s t 2 − x ) 2 r(k-1)^2 -x^2 = c^2 - (s_t^2 -x)^2 r(k1)2x2=c2(st2x)2

x = s t 2 − c 2 + r ( k − 1 ) 2 ∗ s t ∗ r ( k − 1 ) x=\dfrac{s_t^2 - c^2 +r(k-1)}{2*s_t*r(k-1)} x=2str(k1)st2c2+r(k1)

∠ A T k − 1 M k − 1 \angle AT_{k-1}M_{k-1} ATk1Mk1 β k − 1 \beta_{k-1} βk1,则

β k − 1 = a r c c o s ( s t 2 − c 2 + r ( k − 1 ) 2 ∗ s t ∗ r ( k − 1 ) ) \beta_{k-1}=arccos(\dfrac{s_t^2-c^2+r(k-1)}{2*s_t*r(k-1)}) βk1=arccos(2str(k1)st2c2+r(k1))

s i n ( β k − 1 + α k − 1 ) = h c 1 = s i n ( β k − 1 ) ∗ r ( k − 1 ) c 1 sin(\beta_{k-1}+\alpha_{k-1})=\dfrac{h}{c_1}=\dfrac{sin(\beta_{k-1})*r(k-1)}{c_1} sin(βk1+αk1)=c1h=c1sin(βk1)r(k1)

可得, c 1 = r ( k − 1 ) s i n ( β k − 1 ) s i n ( α k − 1 + β k − 1 ) c_1 = \dfrac{r(k-1)sin(\beta_{k-1})}{sin(\alpha_{k-1}+\beta_{k-1})} c1=sin(αk1+βk1)r(k1)sin(βk1)。同理从 T k T_k Tk Δ M k − 1 T k − 1 T k \Delta M_{k-1}T_{k-1}T_k ΔMk1Tk1Tk的高 T k − 1 N T_{k-1}N Tk1N,可得 c 2 = r ( k − 1 ) s i n ( α k − 1 ) s i n ( α k − 1 + β k − 1 ) c_2 = \dfrac{r(k-1)sin(\alpha_{k-1})}{sin(\alpha_{k-1}+\beta_{k-1})} c2=sin(αk1+βk1)r(k1)sin(αk1)

源码改动

​ 文章短小但精悍,作者很贴心的把源码都贴上去了。只要你看懂文章的前半部分,就能看懂代码了。我在基于对文章的理解上加上了一些简单的注释。在将代码敲到MATLAB,滚动框那边有黄色待优化的提示,我个人就按照提示将部分变量预分配了大小。其中,作者源码中的c1c2的代码不知道为什么和文章中的公式表达的不一样。我干脆就按照作者的表达式将代码改了。不知道是我理解错了还是作者少敲了几个数字。下面贴出作者源代码和我修改过的代码以及两者之间的效果图。

源代码

% *************************************************************************
% 文件名:proportionGuideRaw.m
% 创建人:高尚
% 创建时间:2024-01-19
% 仿真来源:[1]高尚.比例导引理想弹道仿真[J].计算机工程与设计, 2003, 24(8):3.DOI:10.3969/j.issn.1000-7024.2003.08.023.
% 文件描述:文中自带的代码
% *************************************************************************
clear;clc;
tt=0.1;
sm=0.6*tt;
st=0.42*tt;
x(1)=0;y(1)=0;z(1)=0;
pmr(:,1)=[x(1);y(1);z(1)];
ptr(:,1)=[25;5;10];
m=3;
q(1)=0;
o(1)=0;
a(1)=0;
for(k=2:600)
    ptr(:,k)=[25-0.42*cos(pi/6)*tt*k;5;10+0.42*sin(pi/6)*k*tt];
    r(k-1)=sqrt((ptr(1,k-1)-pmr(1,k-1))^2+(ptr(2,k-1)-pmr(2,k-1))^2+(ptr(3,k-1)-pmr(3,k-1))^2);
    c=sqrt((ptr(1,k)-pmr(1,k-1))^2+(ptr(2,k)-pmr(2,k-1))^2+(ptr(3,k)-pmr(3,k-1))^2);
    b=acos((r(k-1)^2+st^2-c^2)/(2*r(k-1)*st));
    dq=acos((r(k-1)^2-st^2+c^2)/(2*r(k-1)*c));
    if abs(imag(b))>0
        b=0.0000001;
    end
    if abs(imag(dq))>0
        dq=0.0000001;
    end
    q(k)=q(k-1)+dq;
    o(k)=o(k-1)+m*dq;
    a(k)=o(k)-q(k);
    c1=r(k-1)*sin(b)/sin(a(k)+b);
    c2=r(k-1)*sin(a(k))/sin(a(k)+b);
    c3=sqrt((c1-sm)^2+(c2-st)^2+2*(c1-sm)*(c2-st)*cos(a(k)+b));
    dq=a(k)-acos(((c1-sm)^2+c3^2-(c2-st)^2)/(2*(c1-sm)*c3));
    if abs(imag(dq))>0
        dq=0.0000001;
    end
    q(k)=q(k-1)+dq;
    o(k)=o(k-1)+m*dq;
    a(k)=o(k)-q(k);
    c1=r(k-1)*sin(b)/sin(a(k)+b);
    c2=r(k-1)*sin(a(k))/sin(a(k)+b);
    c3=sqrt((c1-sm)^2+(c2-st)^2+2*(c1-sm)*(c2-st)*cos(a(k)+b));
    dq=a(k)-acos(((c1-sm)^2+c3^2-(c2-st)^2)/(2*(c1-sm)*c3));
    if abs(imag(dq))>0
        dq=0.0000001;
    end
    q(k)=q(k-1)+dq;
    o(k)=o(k-1)+m*dq;
    a(k)=o(k)-q(k);
    c1=r(k-1)*sin(b)/sin(a(k)+b);
    c2=r(k-1)*sin(a(k))/sin(a(k)+b);
    c3=sqrt((c1-sm)^2+(c2-st)^2+2*(c1-sm)*(c2-st)*cos(a(k)+b));
    x1(k)=ptr(1,k-1)+c2/st*(ptr(1,k)-ptr(1,k-1));
    y1(k)=ptr(2,k-1)+c2/st*(ptr(2,k)-ptr(2,k-1));
    z1(k)=ptr(3,k-1)+c2/st*(ptr(3,k)-ptr(3,k-1));
    x(k)=pmr(1,k-1)+sm/c1*(x1(k)-pmr(1,k-1));
    y(k)=pmr(2,k-1)+sm/c1*(y1(k)-pmr(2,k-1));
    z(k)=pmr(3,k-1)+sm/c1*(z1(k)-pmr(3,k-1));
    pmr(:,k)=[x(k);y(k);z(k)];
    r(k)=sqrt((ptr(1,k)-pmr(1,k))^2+(ptr(2,k)-pmr(2,k))^2+(ptr(3,k)-pmr(3,k))^2);
    if  r(k)<0.06
        break;
    end
end
sprintf('遭遇时间:%3.1f',0.1*k)
figure,plot3(pmr(1,1:k),pmr(2,1:k),pmr(3,1:k),'g',ptr(1,:),ptr(2,:),ptr(3,:),'r');
axis([0 25 0 5 0 25]);
text(x(80),y(80),z(80),'\leftarrow 比例导引');
grid on

修改后的代码

% *************************************************************************
% 文件名:proportionGuide.m
% 创建人:qhy
% 创建时间:2024-01-19
% 仿真来源:[1]高尚.比例导引理想弹道仿真[J].计算机工程与设计, 2003, 24(8):3.DOI:10.3969/j.issn.1000-7024.2003.08.023.
% 文件描述:对文中自带的代码加注释、改变每次迭代的c1&c2表达式以及对部分变量进行预分配空间
% *************************************************************************
clc;clear;

%% 比例制导仿真
deltaT = 0.1;   % 时间间隔
Sm = 0.6*deltaT;    % 导弹在时间间隔内移动距离
St = 0.42*deltaT;   % 载机在时间间隔内移动距离
Xm(1,:) = 0;Ym(1,:) = 0;Zm(1,:) = 0; % 导弹位置矩阵,row为x,y,z;column为k*t
pmr(:,1) = [Xm(1);Ym(1);Zm(1)];    % 导弹起始位置
X1(1,:) = 0;Y1(1,:) = 0;Z1(1,:) = 0;    % 载机的位置矩阵
X1(1) = 25;Y1(1) = 5; Z1(1) = 10;
ptr(:,1) = [X1(1);Y1(1);Z1(1)];   % 载机起始位置
m = 3;  % 比例导引系数
r(1,:) = 0; % 某个时间间隔,导弹与载机之间的距离
q(1,:) = 0;theta(1,:) = 0;a(1,:) = 0;    % 角度矩阵


for k = 2:600
    ptr(:,k) = [25-0.42*cos(pi/6)*deltaT*k;5;10 + 0.42*sin(pi/6)*k*deltaT]; % 载机的运动方程
    r(k-1) = sqrt((ptr(1,k-1)-pmr(1,k-1))^2 + (ptr(2,k-1)-pmr(2,k-1))^2 + (ptr(3,k-1)-pmr(3,k-1))^2); %载机和导弹相对距离
    c = sqrt((ptr(1,k)-pmr(1,k-1))^2 + (ptr(2,k)-pmr(2,k-1))^2 + (ptr(3,k)-pmr(3,k-1))^2);
    beta = acos((r(k-1)^2 + St^2-c^2)/(2*r(k-1)*St));
    deltaQ = acos((r(k-1)^2-St^2 + c^2)/(2*r(k-1)*c));
    if abs(imag(beta))>0
        beta = 0.0000001;
    end
    if abs(imag(deltaQ))>0
        deltaQ = 0.0000001;
    end
    % 导弹的差分方程
    q(k) = q(k-1) + deltaQ;
    theta(k) = theta(k-1) + m*deltaQ;
    a(k) = theta(k)-q(k);
    c1 = r(k-1)*sin(beta)/sin(a(k-1) + beta);
    c2 = r(k-1)*sin(a(k-1))/sin(a(k-1) + beta);
    c3 = sqrt((c1-Sm)^2 + (c2-St)^2 + 2*(c1-Sm)*(c2-St)*cos(a(k) + beta));
    deltaQ = a(k)-acos(((c1-Sm)^2 + c3^2-(c2-St)^2)/(2*(c1-Sm)*c3));
    if abs(imag(deltaQ))>0
        deltaQ = 0.0000001;
    end
    q(k) = q(k-1) + deltaQ;
    theta(k) = theta(k-1) + m*deltaQ;
    a(k) = theta(k)-q(k);
    c1 = r(k-1)*sin(beta)/sin(a(k-1) + beta);
    c2 = r(k-1)*sin(a(k-1))/sin(a(k-1) + beta);
    c3 = sqrt((c1-Sm)^2 + (c2-St)^2 + 2*(c1-Sm)*(c2-St)*cos(a(k) + beta));
    deltaQ = a(k)-acos(((c1-Sm)^2 + c3^2-(c2-St)^2)/(2*(c1-Sm)*c3));
    if abs(imag(deltaQ))>0
        deltaQ = 0.0000001;
    end
    q(k) = q(k-1) + deltaQ;
    theta(k) = theta(k-1) + m*deltaQ;
    a(k) = theta(k)-q(k);
    c1 = r(k-1)*sin(beta)/sin(a(k-1) + beta);
    c2 = r(k-1)*sin(a(k-1))/sin(a(k-1) + beta);
    c3 = sqrt((c1-Sm)^2 + (c2-St)^2 + 2*(c1-Sm)*(c2-St)*cos(a(k) + beta));
    
    X1(k) = ptr(1,k-1) + c2/St*(ptr(1,k)-ptr(1,k-1));
    Y1(k) = ptr(2,k-1) + c2/St*(ptr(2,k)-ptr(2,k-1));
    Z1(k) = ptr(3,k-1) + c2/St*(ptr(3,k)-ptr(3,k-1));
    Xm(k) = pmr(1,k-1) + Sm/c1*(X1(k)-pmr(1,k-1));
    Ym(k) = pmr(2,k-1) + Sm/c1*(Y1(k)-pmr(2,k-1));
    Zm(k) = pmr(3,k-1) + Sm/c1*(Z1(k)-pmr(3,k-1));
    pmr(:,k) = [Xm(k);Ym(k);Zm(k)];
    r(k) = sqrt((ptr(1,k)-pmr(1,k))^2 + (ptr(2,k)-pmr(2,k))^2 + (ptr(3,k)-pmr(3,k))^2);
    if r(k)<0.06
        break;
    end
end
sprintf('遭遇时间:%3.1fs',0.1*k)
figure,plot3(pmr(1,:),pmr(2,:),pmr(3,:),'g',ptr(1,:),ptr(2,:),ptr(3,:),'r');
text(Xm(80),Ym(80),Zm(80),'\leftarrow 比例导引');
axis([0 25 0 5 0 25]);title('比例引导法m=3的理想弹道');
grid on

效果图

image-20240127211916915

​ 源代码效果展示

image-20240127212021521

​ 修改后的代码效果展示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值