古代炮兵怎樣手算三角函數

前段時間和朋友們聊天說起來,在計算機技術發(fā)展起來之前,炮兵是個要求極高的技術兵種。尤其是手搖式的計算器發(fā)明之前,甚至需要在戰(zhàn)場上手算彈道。而其中最重要的數學工具就是三角函數。
那么,三角函數也能手算?
當然,用泰勒展開式就可以把三角函數轉換成多項式形式,計算近似值。
下面直接上公式。(我數學一般,就不搬運證明過程了)
其余幾個,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(我不能說真實的數值,這是隨意擬的同數量級的一個數值)。通過測量實際間距和理論值的接近程度來評價成像精度的優(yōu)劣。
現有的工具可以對掃描稿件進行分析,得出所有相鄰兩條橫線(中點)的間距。但是,由于實際印刷、掃描時不可避免的存在歪斜。所以需要增加一個對歪斜角度的補償功能。
這里就把它當一道數學題來做,要求精度是萬分之一。

通過上面這個圖應該比較容易看出來。原有工具導出的結果為D,歪斜角是α,短線長是L,需要計算的是D’ 。于是有:
因為需求精度并不太高,所以將三角函數轉換為n=2的泰勒級數。
這樣就已經是一個能夠筆算的程度了。
雖然我想不會有人想看,但還是寫一個實例。
D取0.3000,L取3,α取5° ,π取3.14159 ;代入計算(盡量約分):
弧度取0.08727 。
如今,不會有人想去筆算這樣的式子,所以我告訴大家結果,是0.0387 。
然而,在計算機技術普及之前,這是全世界眾多科學家和工程師們解決問題的必經之路。