Lanchester战争模型:用可分离变量的微分方程占卜战事

640?wx_fmt=gif&wxfrom=5&wx_lazy=1


看过国产的战争题材电视剧《亮剑》的各位老铁一定熟悉李云龙集结重兵攻打县城的故事。在故事中,李云龙利用人数上的优势对平安县城进行了围点打援,最后用二营长的意大利炮消灭了城楼上的鬼子官。


但是众所周知,抗日时期中国军队的单兵作战能力及武器配备均远不如日本鬼子。因此最终的胜利是取决于李云龙部队的数量优势。


于是矛盾产生了:当我方在单兵作战效率上不如敌方时,我方需要获得怎样的数量优势已取得战斗的胜利呢?


早在第一次世界大战期间,英国工程师F.W Lanchester就利用战斗中双方人数的变化率提出了Lanchester战争模型用于预测战争结果。我相信李云龙在打县城之前曾研究过这个模型。


640?wx_fmt=png&wxfrom=5&wx_lazy=1

(图源:某贴吧)


640?wx_fmt=png//正经的部分来了


模型建立:


首先,我们假设A军在战斗开始后的t时刻有x(t)人,B军在战斗开始后的t时刻有y(t)人。设,且每支军队的减员均由敌方攻击造成,减员速率与敌方人数成正比。忽略增员部队与非战斗减员,我们可以根据双方的减员速率列出如下的微分方程组


640?wx_fmt=png


在上述微分方程组中,b与c分别代表B军与A军的单兵作战效率,即每个战士在单位时间内干掉的敌军数量。我们可以用这个量来代表士兵的“质量”或“效率”,显然这个量与军队的武器水平,指挥员的指挥水平与战士的单兵素质有关。


解原微分方程组,


由(2)/(1)得, bydy=cxdx//注意这一步,我将含y项与含x项分别移入等号两侧

对两边同时求不定积分      


640?wx_fmt=png

    

两边同时求至t的定积分       


640?wx_fmt=png


稍作处理,             

640?wx_fmt=png

                                     

得到                          

640?wx_fmt=png


下面开始分类讨论:


我们可以由b,c,与双方初始人数y0x0计算出K值


情况1:

当K=0时,有by²=cx²,即当y=0(B军全部阵亡)时,有x=0(A军全部阵亡)。故存在一个时刻T,双方战平。


情况2:

当K>0时,有by²-cx²=K,此时当x=0(A军全部阵亡)时,


640?wx_fmt=png


此时B军取得胜利。


情况3:

当K<0时,有cx²-by²=-K,此时当y=0(B军全部阵亡)时,


640?wx_fmt=png


此时A军取得胜利。

 

由以上的讨论我们可以发现,单兵质量上的优势对于整体作战能力的贡献是线性的,但是数量优势与对于整体作战能力的贡献是成平方关系的。这也就能解释为什么在二战中苏联红军在装备,指战员才能与单兵作战能力均不如德军的情况下能够以自身绝对的数量优势战胜敌军。


640?wx_fmt=png

    (图源:百度图片)

 

作为一个热爱计算机编程的高二狗,本能告诉我这种数学模型可以代入计算机由程序解决。于是我在学校上课期间(基本上是下课的时候),冒着被老班收掉MacBook Pro的风险写下了如下Java小程序(不要告诉老师O(∩_∩)O谢谢)

public class Army {

   private String name;

   private double quantity;

   private double warIndex;

   public Army(){

       name="";

       quantity=0;

    }

   public Army(String n,double q,double i){

       name=n;

       quantity=q;

       warIndex=i;

    }

 

   public double getQuantity() {

       return quantity;

    }

 

   public double getWarIndex() {

       return warIndex;

    }

 

   public String getName() {

       return name;

    }

}


//以上我创建了一个“Army”类(请自动将所有的Index(指数)看成coefficient(系数))


//下面我需要一个客户端,以进行相关运算

import java.util.Scanner;

public class Client{

   public static void main(String[] args){

       double K;

   Scanner sc=new Scanner(System.in);

       Scanner reader=new Scanner(System.in);

   System.out.println("Please input the name/quantity/warIndex of army1:");

   Army army1=new Army(sc.nextLine(),sc.nextDouble(),sc.nextDouble());

       System.out.println("Please input the name/quantity/warIndex of army2:");

       Army army2=newArmy(reader.nextLine(),reader.nextDouble(),reader.nextDouble());

       K=army2.getWarIndex()*Math.pow(army2.getQuantity(),2)-army1.getWarIndex()*Math.pow(army1.getQuantity(),2);

       if(K==0){

           System.out.println("It's a tie");

       }

       else if(K<0){

           double rest=Math.sqrt((-K)/army1.getWarIndex());

           System.out.println(army1.getName()+" "+"wins");

           System.out.println("The rest quantity of "+""+army1.getName()+":"+rest);

       }

       else if(K>0){

           double rest=Math.sqrt((K)/army2.getWarIndex());

           System.out.println(army2.getName()+" "+"wins");

           System.out.println("The rest quantity of "+""+army2.getName()+":"+rest);

       }

    }

}

//(嘘!传说李云龙在战前用这个程序算了一卦)


640?wx_fmt=png下面我们来举一个栗子:假设李云龙的八路军有100人,鬼子有50人,设双方单兵作战效率均为1(客观地说,当时不太可能),两军交战.则经过程序处理后,运行得到下列结果:

Please input the name/quantity/warIndex ofarmy 1:

Balu

100

1

Please input the name/quantity/warIndex ofarmy 2:

Guizi

50

1

Balu wins

The rest quantity of  Balu:86.60254037844386

 

Process finished with exit code 0


即当鬼子被全歼时,八路军剩余约87人(阵亡13人)

 

现在给太君们一个翻盘的机会:将每个鬼子的单兵作战效率提升至八路军的4倍(2的平方)


运行客户端程序,得到下列结果:

Please input the name/quantity/warIndex ofarmy 1:

Balu

100

1

Please input the name/quantity/warIndex ofarmy 2:

Guizi

50

4

It's a tie

 

Process finished with exit code 0

 

Oops!即使拥有了4倍于对方的效率,可怜的鬼子还是赢不了,只能与八路打成平手。(请各位老铁自己去看看《亮剑》,估计一下李云龙部队的数量是投入战斗的鬼子的几倍)

 

这样一来,数量优势对于整体作战能力的贡献是成平方关系的规律得到了验证。这个规律也就是兰彻斯特平方定律。

 

利用这个数学模型,我们不用再去庙里给菩萨上香或是夜观天象,而是可以理性地利用科学占卜战事走向,根据敌我双方实力做出合理的兵力分配,以获得最大程度的作战效益。

 

这里还有2个问题有待解决:如何确定敌我双方的单兵作战效率(即系数b,c)?如何最佳地规定单位时间的设置?对于后者,我作为一个没有上过军校或战场的高中生并没有资格发言。但是对于前者,我写了一个程序,但是不确定正确与否,由于时间仓促加之老班太严,我并不能在交稿前对其进一步研究。


这里仅附上其源代码,供评论区各位大佬批评指正。


import java.util.Scanner;

public class warIndex {

   public static void main(String[] args){

       int n,counter;

       double sum1,sum2;

       sum1=0;

       sum2=0;

       System.out.println("Please input the quantity (in groups) ofdata");

       Scanner reader=new Scanner(System.in);

       n=reader.nextInt();

       double[] warIndex1=new double[n+1];

       double[] warIndex2=new double[n+1];

       System.out.println("Please input the casualty of army1(group bygroup):");

       Scanner rd=new Scanner(System.in);

       double[] cas1=new double[n+1];

       for (counter=0;counter<=(n-1);counter++){

           cas1[counter]=rd.nextDouble();

       }

       System.out.println("Please input the total quantity of army1(groupby group):");

       Scanner rdd=new Scanner(System.in);

        double[] quantity1=new double[n+1];

       for (counter=0;counter<=(n-1);counter++){

           quantity1[counter]=rdd.nextDouble();

       }

       System.out.println("Please input the casualty of army2(group bygroup):");

       Scanner scc=new Scanner(System.in);

       double[] cas2=new double[n+1];

       for (counter=0;counter<=(n-1);counter++){

           cas2[counter]=scc.nextDouble();

       }

       System.out.println("Please input the total quantity of army2(groupby group):");

        Scanner rddd=new Scanner(System.in);

       double[] quantity2=new double[n+1];

       for (counter=0;counter<=(n-1);counter++){

           quantity2[counter]=rddd.nextDouble();

       }

       System.out.println("Please input the time consumed forbattles(group by group):");

       double[] time=new double[n+1];

       Scanner scanner=new Scanner(System.in);

       for (counter=0;counter<=(n-1);counter++){

           time[counter]=scanner.nextDouble();

       }

       for (counter=0;counter<=(n-1);counter++){

           warIndex1[counter]=cas2[counter]/(quantity1[counter]*time[counter]);

       }

       for (counter=0;counter<=(n-1);counter++){

           sum1=sum1+warIndex1[counter];

       }

       for (counter=0;counter<=(n-1);counter++){

           warIndex2[counter]=cas1[counter]/(quantity2[counter]*time[counter]);

       }

       for (counter=0;counter<=(n-1);counter++){

           sum2=sum2+warIndex2[counter];

       }

       System.out.println("The warIndex of army1="+sum1/n);

       System.out.println("The warIndex of army2="+sum2/n);

    }

}


//在上述程序中,用户需要输入所需数据的数量,A军在每场试验性战斗中的阵亡人数,A军在每场试验性战斗中的总人数;B军在每场试验性战斗中的阵亡人数,B军在每场试验性战斗中的总人数及每场战斗的持续时间。最后程序会计算出双方单兵作战效率的平均值供指战员决策时作参考

 

最后,我们应该珍爱和平,决不首先发动战争。但是,当祖国受到侵略,人民的生命财产安全受到威胁之时,我们要全方位的武装自己,保家卫国,维护世界和平。

640?wx_fmt=png

Dove of peace (图源:百度图片)

参考文献:

《高等数学军事应用案例》  主编:但琦  国防工业出版社


作者:罗漫,浦东外国语学校


640?wx_fmt=png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303739.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微软软件安装平台

http://www.microsoft.com/web/downloads/platform.aspx 转载于:https://www.cnblogs.com/kkun/archive/2011/03/09/1978039.html

如何在 C# 中使用 yield

yield关键词是在 C# 2.0 中被引入的&#xff0c;我们都知道实现了 IEnumerable 接口的类都可以用于被 foreach 迭代&#xff0c;这是因为 IEnumerable 接口中提供了一个可迭代的 GetEnumerator() 方法&#xff0c;代码定义如下&#xff1a;public interface IEnumerable{IEnume…

通过听力写代码?盲人程序员就是这样做的

一Michael Forzano&#xff0c;Amazon2018 年 3 月&#xff0c;Amazon 官网「工作在 Amazon」栏目有一篇文章&#xff0c;介绍了他们的一位盲人程序员 Michael Forzano。&#xff08;视频来自&#xff1a;阑夕&#xff09;Amazon 软件工程师 Michael Forzano 出生就因先天疾病而…

android修改电量颜色,android状态栏电池颜色?

鸿蒙传说/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java在Intent.ACTION_BATTERY_CHANGED broadcast处理中调用fireBatteryLevelChanged()方法fireBatteryLevelChanged中会回掉BatteryStateChangeCallbackframewor…

access 战地1不加入ea_炒牛肉时,想要牛肉嫩滑又不老,只需加入1样东西,很多人都不懂...

炒牛肉时&#xff0c;想要牛肉嫩滑又不老&#xff0c;只需加入1样东西&#xff0c;很多人都不懂冬季滋补怎么能少得了牛肉&#xff0c;牛肉中含有非常丰富的营养成分&#xff0c;其中蛋白质的含量尤为丰富还有大量的氨基酸&#xff0c;能够提高身体的抗病能力&#xff0c;特别适…

张亚勤:PC之外的争夺战

文 / 陈振烨 尽管经常有公司抢走微软的风头&#xff0c;但当今世界&#xff0c;微软仍然是当之无愧的IT霸主。过去几个季度&#xff0c;微软各项核心数据非常给力&#xff0c;2011财年第一季度净利润54亿美元&#xff0c;营收162亿美元&#xff1b;而2010财年187.6亿美元的净利…

优化 ASP.NET Core Docker 镜像的大小

在这容器化的世界里&#xff0c;我们已经很少直接通过文件发布来运行asp.net core程序了。现在大多数情况下&#xff0c;我们都会使用docker来运行程序。在使用docker之前&#xff0c;我们往往需要打包我们的应用程序。asp.net core程序的镜像打包&#xff0c;网上有很多教程&a…

监督学习:KNN(K-近邻)算法实现手写数字识别的三种方法

没人会看的开场白&#xff1a;本来觉得自己从数据建模转人工智能方向应该问题不大&#xff08;自我感觉自己算法学的不错&#xff09;。结果一个K-邻近实现手写数字识别的代码就让我改了三四天。虽然网上这方面的代码是很多&#xff0c;但是我运行了好几个&#xff0c;结果都不…

xp怎样安装android-studio,Xposed 框架的安装

借鉴&#xff1a;安装流程&#xff1a;安装 雷电模拟器3.93下载安装xposed框架。xposed 框架在Dalvik 虚拟机和ART虚拟机上的安装不一样(至于ART虚拟机和Dalvik虚拟机的区别&#xff0c;可以参阅 文章)如果Android 版本不小于 5.0&#xff0c;就是ART版本的虚拟机&#xff0c;需…

在 .NET Core 5 中集成 Create React app

翻译自 Camilo Reyes 2021年2月22日的文章 《Integrate Create React app with .NET Core 5》 [1]本文演示了如何将 Create React app 与 .NET Core 集成&#xff0c;以生成一个移除了几个依赖项的脚手架。Create React app 是社区中创建一个全新 React 项目的首选方式。该工具…

程序员找不到对象是因为还没遇到一个有远见的丈母娘

当别人在放肆秀恩爱的时候&#xff0c;程序员单身狗们在角落里瑟瑟发抖。别人去网站相亲找到对象&#xff0c;程序员去相亲找到BUG。其实&#xff0c;你找不到对象是因为你还没遇到一个有远见的丈母娘。都说程序员很难找到对象&#xff0c;就知道整天对着键盘一直敲敲敲&#x…

WPF 如何将IconFont图标转成Geometry

之前每次使用IconFont图标&#xff0c;都要去下载一个png图片&#xff0c;每次颜色什么的改了&#xff0c;都要重新下载&#xff0c;太苦逼了。现在好了&#xff0c;终于找到如何方便快速地使用IconFont图标了。是应该的演示如何从IconFont网站上找到Geometry先看看效果吧&…

给所有想从事软件研发的年轻工程师的忠告与建议

图片来源&#xff1a;Fargo Season 3一、我为什么写这篇文章&#xff1a;这几天&#xff0c;在某个IT论坛的软件培训与认证栏目中&#xff0c;看到了很多处于迷惑之中的人们&#xff0c;也看到了许多大家普遍感到困惑的问题&#xff0c;写此文章的目的&#xff0c;是想将我这些…

谁今天收到鸿蒙系统推送,鸿蒙系统正式推送,只有部分高端机才能收到

原标题&#xff1a;鸿蒙系统正式推送&#xff0c;只有部分高端机才能收到华为已经对鸿蒙2.0系统开始进行推送更新&#xff0c;从华为推出鸿蒙系统概念已经时隔几年了&#xff0c;如今华为把ppt系统映射进现实是真正为自己正名了&#xff0c;而且据华为陈述鸿蒙2.0已经能达到安卓…

2020邮箱账号密码大全_通知 | 复旦大学2020年春季学期研究生选课FAQ

1选课须知1. 研究生选课系统什么时间开放&#xff1f; 答&#xff1a;2020年春季学期研究生选课系统开放时间为&#xff1a;2020年2月19日(周三)10:00至2020年3月9日(周一)10:00。2020年3月9日(周一)10:00后&#xff0c;研究生可以在选课系统中查询课表、已选课程、学分获得情况…

如何从零开始构建深度学习项目?这里有一份详细的教程

导读&#xff1a;在学习了有关深度学习的理论之后&#xff0c;很多人都会有兴趣尝试构建一个属于自己的项目。本文将会从第一步开始&#xff0c;告诉你如何解决项目开发中会遇到的各类问题。本文由六大部分组成&#xff0c;涵盖深度学习 ( DL ) 项目的整个过程。我们将使用一个…

性能分布式NewLife.XCode对无限数据的支持

上周发布了《改进版CodeTimer及XCode性能测试》&#xff0c;展示了NewLife.XCode在性能上的表现。实际上NewLife.XCode是一个很平凡的ORM&#xff0c;只是在分页和缓存方面多下点功夫&#xff0c;注意每一个细节&#xff0c;才能保证在数据量大、业务繁忙的环境中得以保持良好的…

C#实用小知识:string和判断null

stringstring是常用的类型&#xff0c;它具有不可变性&#xff1a;就是一旦赋值&#xff0c;就不可变&#xff0c;如果再赋值 &#xff0c;就重新开辟内存空间&#xff1b;保留性&#xff1a;如果一个字符串存在&#xff0c;另一个与其相同&#xff0c;他们会指向同一个地址&am…

.net html5页面缓存,详解HTML5中的manifest缓存使用

起源html5之前的网页&#xff0c;都是无连接&#xff0c;必须联网才能访问&#xff0c;这其实也是web的特色&#xff0c;这其实对于PC是时代问题并不大&#xff0c;但到了移动互联网时代&#xff0c;设备终端位置不再固定&#xff0c;依赖无线信号&#xff0c;网络的可靠性变得…

机器学习的最佳学习路线原来只有四步

AI这个词相信大家都非常熟悉&#xff0c;近几年来人工智能圈子格外热闹&#xff0c;光是AlphoGo就让大家对它刮目相看。今天小天就来跟大家唠一唠如何进军人工智能的第一步——机器学习。在机器学习领域&#xff0c;Python已经成为了主流。一方面因为这门语言简单易上手&#x…