欢迎光临散文网 会员登陆 & 注册

古代炮兵怎样手算三角函数

2023-01-17 19:46 作者:小给猫  | 我要投稿

前段时间和朋友们聊天说起来,在计算机技术发展起来之前,炮兵是个要求极高的技术兵种。尤其是手摇式的计算器发明之前,甚至需要在战场上手算弹道。而其中最重要的数学工具就是三角函数。

那么,三角函数也能手算?

当然,用泰勒展开式就可以把三角函数转换成多项式形式,计算近似值。

下面直接上公式。(我数学一般,就不搬运证明过程了)

sinx%3D%5Csum_%7Bn%3D0%7D%5E%E2%88%9E%20%20%5Cfrac%7B(-1)_%7B%7D%5En%7D%7B(2n%2B1)!%7Dx_%7B%7D%5E%7B2n%2B1%7D

cosx%3D%5Csum_%7Bn%3D0%7D%5E%E2%88%9E%20%20%5Cfrac%7B(-1)_%7B%7D%5En%7D%7B(2n)!%7Dx_%7B%7D%5E%7B2n%7D

其余几个,tan呀sec什么的,展开式对我这种学渣来说太难了,就没抄。反正只要会算sin和cos其它都能推算出来。

显然我们没有办法计算无穷级数的和。但是如果只是想要一个近似值的话,只需计算级数的前几项就可以了。具体取决于实际的精度需求。

举个例子,假如需要计算cos17°的近似值,要求精度为百万分之一。需要计算几项呢?

精度为百万分之一,也就是说,计算值与实际之差的绝对值要小于千万分之五。

而在计算过程中的中间值的近似值就要取到千万分之一级。

所以,第一步,将17°转换为弧度值的时候,π值要取3.1415927 。

角度17°的弧度近似值就是0.2967060 。

※千万分之一的小数必须写满7位,时即使最末位是0也不能省略。但是输入计算器或电脑计算的时候无所谓。

接下来就是对比计算结果来选择项数了。本学渣这里就不手工计算了,而是借用上个世纪的科技帮忙。

先用Excel自带的VBA编程工具写一个基于泰勒展开新余弦函数,姑且就叫cosTay 。

函数需要2个输入变量,弧度值和项数。

代码如下:

Function cosTay(a As Double, n As Integer) As Double

 Dim i As Integer

 Dim k As Double

  For i = 0 To n

   k = Application.WorksheetFunction.Fact(2 * i)

   cosTay = cosTay + ((-1) ^ i) * (a ^ (2 * i)) / k

  Next i

End Function

※引入k是因为调用Excel自带的阶乘(Fact)函数这句话有点长,这样写看起来舒服一点。

 

然后写一个计算对比值的模块,输出直到达到精度需求前的计算值。

代码如下:

Sub test()

 Dim n As Integer

 Dim a As Double

 Dim d As Double

  a = 0.296706

  n = 1

  Do

   Cells(n + 1, 1).Value = Cos(a)

   Cells(n + 1, 2).Value = cosTay(a, n)

   d = Abs(Cos(a) - cosTay(a, n))

   Cells(n + 1, 3).Value = d

   n = n + 1

  Loop While d >= 5 / 10000000

End Sub

运行以后的输出如下

原来,只需计算3项(也可以说4项,因为从n=0开始算的),精度别说千万分之一了,都已经亿分之一了。

当然了,这个精度和输入的弧度值也有一点关系。

如果是53°,弧度值0.9250245,就需要4项才能达到同等精度。如下表。

输入的弧度值越大就需要计算更多的项数来确保精度。当然,也可以通过加法定理将需要计算的弧度值变得小一些,这样就不必计算太多项。

比如:

cos53%C2%B0%3Dcos(60%C2%B0-7%C2%B0)%3D%5Cfrac%7B1%7D%7B2%7Dcos(7%C2%B0)%2B%5Cfrac%7B%5Csqrt%7B3%7D%20%7D%7B2%7Dsin(7%C2%B0)

这样就从计算53°变成计算7°了。

 

 

再来看一个我在工作中遇到的实例。

我拿到几千张画稿,上面大概是这样的图像。

有一系列阶梯下降的短横线,长度是3mm。相邻的两条横线在竖直方向上的理论间距是0.0400mm(我不能说真实的数值,这是随意拟的同数量级的一个数值)。通过测量实际间距和理论值的接近程度来评价成像精度的优劣。

现有的工具可以对扫描稿件进行分析,得出所有相邻两条横线(中点)的间距。但是,由于实际印刷、扫描时不可避免的存在歪斜。所以需要增加一个对歪斜角度的补偿功能。

这里就把它当一道数学题来做,要求精度是万分之一。

通过上面这个图应该比较容易看出来。原有工具导出的结果为D,歪斜角是α,短线长是L,需要计算的是D’ 。于是有:

D%3DL%5Ccdot%20sin%5Calpha%20%2BD'%5Ccdot%20cos%5Calpha%20

D'%3D%5Cfrac%7BD-L%5Ccdot%20sin%5Calpha%20%7D%7Bcos%5Calpha%20%7D

因为需求精度并不太高,所以将三角函数转换为n=2的泰勒级数。

sinx%3Dx-%5Cfrac%7Bx%5E3%20%7D%7B6%7D%2B%5Cfrac%7Bx%5E5%20%7D%7B120%7D

cosx%3D1-%5Cfrac%7Bx%5E2%20%7D%7B4%7D%2B%5Cfrac%7Bx%5E4%20%7D%7B24%7D

x%3D%5Cfrac%7B%5Calpha%20%5Cpi%20%7D%7B180%7D

D'%3D%5Cfrac%7BD-L(x-%5Cfrac%7B(x%5E3%20)%7D%7B6%7D%2B%5Cfrac%7B(x%5E5%20)%7D%7B120%7D)%7D%7B1-%5Cfrac%7Bx%5E2%20%7D%7B4%7D%2B%5Cfrac%7Bx%5E4%20%7D%7B24%7D%7D

这样就已经是一个能够笔算的程度了。

虽然我想不会有人想看,但还是写一个实例。

D取0.3000,L取3,α取5° ,π取3.14159 ;代入计算(尽量约分):

弧度取0.08727 。

D'%3D%5Cfrac%7B0.3-3%5Ctimes%200.08727%2B%5Cfrac%7B0.08727%5E3%20%7D%7B2%7D-%5Cfrac%7B0.08727%5E5%20%7D%7B40%7D%7D%7B1-%5Cfrac%7B0.08727%5E2%20%7D%7B4%7D%2B%5Cfrac%7B0.08727%5E4%20%7D%7B24%7D%7D

如今,不会有人想去笔算这样的式子,所以我告诉大家结果,是0.0387 。

然而,在计算机技术普及之前,这是全世界众多科学家和工程师们解决问题的必经之路。


古代炮兵怎样手算三角函数的评论 (共 条)

分享到微博请遵守国家法律