单兵种直瞄武器交战的Lanchester方程

预备知识

(1)单-Lanchester方程的解

单-Lanchester方程的表达式为:
{ x 1 ˙ = − b y 1 y 1 ˙ = − a x 1 \left\{\begin{matrix} \dot{x_1}= -by_1\\ \dot{y_1}= -ax_1 \end{matrix}\right. {x1˙=by1y1˙=ax1
其中x、y分别为甲、乙双方的作战单位数,a、b分别为甲、乙双方对对方的毁伤系数,满足以下条件:

a > 0 a>0 a>0

b > 0 b>0 b>0

x ( 0 ) = x 0 > 0 x(0)={x_0}>0 x(0)=x0>0

y ( 0 ) = y 0 > 0 y(0)={y_0}>0 y(0)=y0>0

那么,解为:
{ x = c e − λ t + d e λ t a y = c e − λ t − d e λ t b \left\{\begin{matrix} x = \frac{ce^{-\lambda t}+de^{\lambda t}}{\sqrt[]{a} } \\ y = \frac{ce^{-\lambda t}-de^{\lambda t}}{\sqrt[]{b} } \end{matrix}\right. {x=a ceλt+deλty=b ceλtdeλt

其中,
{ c = 1 2 ( a x 0 + b y 0 ) d = 1 2 ( a x 0 − b y 0 ) λ = a b \left\{\begin{matrix} \begin{aligned} c &= \frac{1}{2}(\sqrt{a}x_0+\sqrt{b}y_0 ) \\ d &= \frac{1}{2}(\sqrt{a}x_0-\sqrt{b}y_0 ) \\ \lambda &= \sqrt{ab} \end{aligned} \end{matrix}\right. cdλ=21(a x0+b y0)=21(a x0b y0)=ab

(2)全文的公式使用下面的网址编辑而成:

在线LaTex公式编辑器

正文

本文摘自沙昌基教授《数理战术学》第3章 单兵种直瞄武器交战的lanchester方程的第3节 留预备队。文中举了一个简单的数值例子,证明了战场上留预备队是一种好的策略。

假设如下:

甲、乙双方发生了一场战斗,乙方拟向甲方进攻,可能的战场有三处:

(1)主要进攻方向(对甲来说是主要防御方向,后文简称为“方向1”);

(2)次要进攻方向(对甲来说是次要防御方向,后文简称为“方向2”);

(3)甲方大本营(后文简称为“大本营”)。

首先给出甲、乙两方的初始兵力。

甲方兵力为 x 0 = 10000 {x_0} = 10000 x0=10000,乙方兵力为 y 0 = 12000 {y_0} = 12000 y0=12000

其次给出三个战场交战的Lanchester方程,按照顺序分别为:

那么此时,甲、乙双方有三种策略。

(1)策略1

甲方不留预备队,将兵力平均安排至方向1和方向2

即取

方向1: x 10 = 5000 {x_{10}} = 5000 x10=5000

方向2: x 20 = 5000 {x_{20}} = 5000 x20=5000

大本营: x 30 = 0 {x_{30}} = 0 x30=0

假定乙方集中全力从方向1进攻,则战场1的Lanchester方程解为:
{ x 1 = 5000 e − t − 500 e − t y 1 = 10000 e − t + 1000 e t \left\{\begin{matrix} \begin{aligned} x_1&= 5000e^{-t}-500e^{-t}\\ y_1&= 10000e^{-t}+1000e^{t} \end{aligned} \end{matrix}\right. {x1y1=5000et500et=10000et+1000et

则当 T = 1 2 ln ⁡ 11 T = \frac{1}{2}\ln 11 T=21ln11时, x 1 ( T ) = 0 {x_1}(T)=0 x1(T)=0 y 1 ( T ) = 2000 11 {y_1}(T)=2000\sqrt {11} y1(T)=200011

结果表明:经战斗时间T后,乙方突破方向1,可长驱直捣大本营。

Matlab仿真结果如下图所示。

图1

(2)策略2

甲方全部留在大本营

即取

方向1: x 10 = 0 {x_{10}} = 0 x10=0

方向2: x 20 = 0 {x_{20}} = 0 x20=0

大本营: x 30 = 10000 {x_{30}} = 10000 x30=10000

此时,乙方可轻易通过方向1、方向2前进至大本营处与甲方展开决战。

那么,战场3的Lanchester方程为
{ x 3 = 11000 e − t − 1000 e − t y 1 = 11000 e − t + 1000 e t \left\{\begin{matrix} \begin{aligned} x_3&= 11000e^{-t}-1000e^{-t}\\ y_1&= 11000e^{-t}+1000e^{t} \end{aligned} \end{matrix}\right. {x3y1=11000et1000et=11000et+1000et

则当 T = 1 2 ln ⁡ 11 T = \frac{1}{2}\ln 11 T=21ln11时, x 1 ( T ) = 0 {x_1}(T)=0 x1(T)=0 y 1 ( T ) = 2000 11 {y_1}(T)=2000\sqrt {11} y1(T)=200011

结果表明:经战斗时间T后,乙方摧毁甲方全部兵力获胜。在这种策略下,甲方也不能有效抵抗乙方的进攻。

Matlab仿真结果如下图所示。

在这里插入图片描述

(3)策略3

甲方对兵力适当配置

即取

方向1: x 10 = 3000 {x_{10}} = 3000 x10=3000

方向2: x 20 = 3000 {x_{20}} = 3000 x20=3000

大本营: x 30 = 4000 {x_{30}} = 4000 x30=4000

假定乙方集中全力从方向1进攻,则战场1的Lanchester方程解为:
{ x 1 = 4500 e − t − 1500 e − t y 1 = 9000 e − t + 3000 e t \left\{\begin{matrix} \begin{aligned} x_1&= 4500e^{-t}-1500e^{-t}\\ y_1&= 9000e^{-t}+3000e^{t} \end{aligned} \end{matrix}\right. {x1y1=4500et1500et=9000et+3000et

作战开始后,甲方知道方向1上吃紧,就将预备队 x 30 x_{30} x30 全部派往方向1,经时间 T = ln ⁡ 1.25 T=\ln1.25 T=ln1.25 后到达方向1。在预备队到达前的瞬间,甲、乙双方的兵力存活情况如下:

x 1 ( T 1 − 0 ) = 4500 × 0.8 − 1500 × 1.25 = 3600 − 1875 = 1725 x_1(T_1-0)=4500 \times 0.8 - 1500 \times 1.25 = 3600 - 1875 = 1725 x1(T10)=4500×0.81500×1.25=36001875=1725
y 1 ( T 1 − 0 ) = 9000 × 0.8 − 3000 × 1.25 = 7200 + 3750 = 10950 y_1(T_1-0)=9000 \times 0.8 - 3000 \times 1.25 = 7200 +3750 = 10950 y1(T10)=9000×0.83000×1.25=7200+3750=10950

当预备队到达战场后,甲方兵力布置变为

x 1 ( T 1 + 0 ) = x 1 ( T 1 − 0 ) + x 30 = 1725 + 4000 = 5725 x_1(T_1+0) = x_1(T_1-0) + x_{30}=1725+4000=5725 x1(T1+0)=x1(T10)+x30=1725+4000=5725

乙方实力不变。

T 1 T_1 T1 时刻起算,方向1处的Lanchester方程解为:
{ x 1 ( T 1 + t 1 ) = 5600 e − t + 125 e − t y 1 ( T 1 + t 1 ) = 11200 e − t − 250 e t \left\{\begin{matrix} \begin{aligned} x_1(T_1+t_1)&= 5600e^{-t}+125e^{-t}\\ y_1(T_1+t_1)&= 11200e^{-t}-250e^{t} \end{aligned} \end{matrix}\right. {x1(T1+t1)y1(T1+t1)=5600et+125et=11200et250et

此时,乙方不能突破主攻方向,甲方有效地抵抗了乙方的进攻。这种情况下,乙方在方向1与方向2分兵进攻效果显然更差。

Matlab仿真结果如下图所示。

在这里插入图片描述
对这三种作战部署方案的分析说明,无论是倾巢分兵把守,还是全部留守都不能抵御敌方进攻,只有适当留预备队才是克敌制胜之道。这一结果与军事常识中留预备队的战术是一致的。

Matlab仿真代码

Matlab仿真代码分为三个文件:

(1)SingleLanchesterMain.m;

(2)diffSolution.m;

(3)evaluate.m。

在这里分别给出。

SingleLanchesterMain.m

clear;clc;close all;
% 仿真时长

scheme = 3;         % 选择123来选择战场策略
switch scheme
    case 1
        % 毁伤系数
        a = 2;
        b = 0.5;

        % 作战单位初值
        x0 = 5000;
        y0 = 12000;
        
        % 微分方程解
        [A,B,C,D,lambda] = diffSolution(a,b,x0,y0);
        
        % 解算过程
        [t,x] = evaluate(lambda,A,B);
        
        % 交战结果
        y = C*exp(-lambda*t) - D*exp(lambda*t);
        fprintf('交战时间为 【%1.4f】 秒\n',t);
        fprintf('敌方战斗力剩余 【%4.2f】\n',y);
    case 2
        % 毁伤系数
        a = 1;
        b = 1;

        % 作战单位初值
        x0 = 10000;
        y0 = 12000;
        
        % 微分方程解
        [A,B,C,D,lambda] = diffSolution(a,b,x0,y0);
        
        % 解算过程
        [t,x] = evaluate(lambda,A,B);
        
        % 交战结果
        y = C*exp(-lambda*t) - D*exp(lambda*t);
        fprintf('交战时间为 【%1.4f】 秒\n',t);
        fprintf('敌方战斗力剩余 【%4.2f】\n',y);
    case 3
        % 毁伤系数
        a = 2;
        b = 0.5;

        % 作战单位初值
        x0 = 3000;
        y0 = 12000;
        % 微分方程解
        [A,B,C,D,lambda] = diffSolution(a,b,x0,y0);
        
        % 解算过程
        t = log(1.25);
        x = A*exp(-lambda*t) + B*exp(lambda*t);
        y = C*exp(-lambda*t) - D*exp(lambda*t);
        fprintf('我方战斗力剩余 【%4.2f】\n',x);
        fprintf('敌方战斗力剩余 【%4.2f】\n',y);
        disp('-----------------------');
        
        % 再次求解微分方程解
        fprintf('我方增援 【%4.2f】\n',4000);
        disp('-----------------------');
        x = x + 4000;
        fprintf('我方现存战斗力 【%4.2f】\n',x);
        disp('-----------------------');
        
        % 解算过程
        [A,B,C,D,lambda] = diffSolution(a,b,x,y);
        t = 0;
        y1 = C*exp(-lambda*t) - D*exp(lambda*t);
        while y1 > 0
            y1 = C*exp(-lambda*t) - D*exp(lambda*t);
            t = t + 1e-4;
        end       
        % 交战结果
        x1 = A*exp(-lambda*t) + B*exp(lambda*t);
        t = t+log(1.25);               
        fprintf('交战时间为 【%1.4f】 秒\n',t);
        fprintf('我方战斗力剩余 【%4.2f】\n',x1);
        fprintf('敌方战斗力剩余 【%4.2f】\n',y1);
    otherwise
        disp('-----------------');
        disp('请选择正确的方案!');
end

diffSolution.m

function [A,B,C,D,lambda] = diffSolution(a,b,x0,y0)
% 微分方程解
c = 0.5*(sqrt(a)*x0 + sqrt(b)*y0);
d = 0.5*(sqrt(a)*x0 - sqrt(b)*y0);
lambda = sqrt(a*b);

A = c/sqrt(a);
B = d/sqrt(a);
C = c/sqrt(b);
D = d/sqrt(b);
end

evaluate.m

function [t,x] = evaluate(lambda,A,B)
    t = 0;
    x = A*exp(-lambda*t) + B*exp(lambda*t);
    while x > 0
    x = A*exp(-lambda*t) + B*exp(lambda*t);
    t = t + 1e-4;
    end
end

就酱~

希望自己以后不要忘记这些代码!

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值