之前學習C語言的時候,一直有個疑問,計算機從芯片設計的角度來看,只能計算常規的加減乘及移位之類的操作,那么對於像sin 、cos這些三角函數,人腦尚無可以直接運算的法則,那么計算機是怎么實現的呢?最近上了《數值分析》的課程,終於有點了解。
方法一:泰勒展開式
首先,相信大家都知道那個把我們搞得死去活來的”泰勒公式“,用文字來描述就是如果函數足夠光滑的話,在已知函數在某一點的各階導數值的情況之下,泰勒公式可以用這些導數值做系數構建一個多項式來近似函數在這一點的鄰域中的值。
公式如下圖所示:
因此,像正弦函數這一類函數,最終都可以寫成多項式的形式(在0點進行展開)。
為了求得精確值,n必須趨於無窮,但是要交給計算機來算的話,就必須進行截斷,一般來說n取9既可,另外考慮到分子中帶有指數函數,當x較大時,余項帶來的誤差必定比較大,而我們知道正弦函數是一個周期函數,且所有值都可以由[0,pi/4]間的函數值變換而來,因此在計算之前,我們先對要計算的數值根據誘導公式變換到[0,pi/4]區間上。
方法二:拉格朗日插值法
對於正弦函數,我們已知在[0,pi/4]區間上,當x分別為0、pi/6、pi/4、pi/3、pi/2點處對應的正弦值,那么,根據多項式插值法,已知5個點的函數值,我們可以構造唯一的4次多項式函數L(x)來逼近正弦函數,公式如下:
其中每個為拉格朗日基本多項式(或稱插值基函數),其表達式為:
根據實驗結果,其計算數值距離標准數學庫計算出來的數值仍有一定的偏差,誤差限為0.0005,我估計標准數學庫是使用了更多點的插值法,因此結果比5點插值得來的更加准備一些,猜想正確與否,有待考證。