古代炮兵怎样手算三角函数
前段时间和朋友们聊天说起来,在计算机技术发展起来之前,炮兵是个要求极高的技术兵种。尤其是手摇式的计算器发明之前,甚至需要在战场上手算弹道。而其中最重要的数学工具就是三角函数。
那么,三角函数也能手算?
当然,用泰勒展开式就可以把三角函数转换成多项式形式,计算近似值。
下面直接上公式。(我数学一般,就不搬运证明过程了)
其余几个,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项才能达到同等精度。如下表。

输入的弧度值越大就需要计算更多的项数来确保精度。当然,也可以通过加法定理将需要计算的弧度值变得小一些,这样就不必计算太多项。
比如:
这样就从计算53°变成计算7°了。
再来看一个我在工作中遇到的实例。
我拿到几千张画稿,上面大概是这样的图像。

有一系列阶梯下降的短横线,长度是3mm。相邻的两条横线在竖直方向上的理论间距是0.0400mm(我不能说真实的数值,这是随意拟的同数量级的一个数值)。通过测量实际间距和理论值的接近程度来评价成像精度的优劣。
现有的工具可以对扫描稿件进行分析,得出所有相邻两条横线(中点)的间距。但是,由于实际印刷、扫描时不可避免的存在歪斜。所以需要增加一个对歪斜角度的补偿功能。
这里就把它当一道数学题来做,要求精度是万分之一。

通过上面这个图应该比较容易看出来。原有工具导出的结果为D,歪斜角是α,短线长是L,需要计算的是D’ 。于是有:
因为需求精度并不太高,所以将三角函数转换为n=2的泰勒级数。
这样就已经是一个能够笔算的程度了。
虽然我想不会有人想看,但还是写一个实例。
D取0.3000,L取3,α取5° ,π取3.14159 ;代入计算(尽量约分):
弧度取0.08727 。
如今,不会有人想去笔算这样的式子,所以我告诉大家结果,是0.0387 。
然而,在计算机技术普及之前,这是全世界众多科学家和工程师们解决问题的必经之路。

