會想整理這篇文章, 是看到如何估計log7, 覺得很神奇也很有興趣.
求函數f在某點x的近似值有很多種方法, 像是:
Taylar's expension(泰勒展開式): 知道x附近另一點x1的0~N階導函數值, 可用N階泰勒展開式在x1展開再帶入x求值.
Interpolation(內插or外插):
a) 最常見的是linear interpolation, 已知f另外兩個點對應的函數值, 利用這兩點形成的直線估計f(x), x在這兩點之間是內插, 反之是外插.
b) 至於polynomial interpolation(或是Lagrange polynomial)或spline interpolation, 沒有計算機的幫忙很容易算錯...
然而, 除了linear interpolation, 其他都需要不少複雜的計算.
以前的我真的滿會算的, 這不是自誇, 遙想大一時, 工程力學的期中考, 別人都帶工程計算機, 我卻呆呆地帶了一台只能+-×÷(還不能開平方根)的計算機...囧...於是...
三角函數: sin(3°)這種小角度就直接帶Taylar's expension在0展開的公式; 角度大就用倍角公式, 像是sin(13°)就先算出sin((13/2)°)和cos((13/2)°)再帶入sin兩倍角公式, 像是sin(23°)就先算出sin((23/3)°)再帶入sin三倍角公式; sin(67°)就是cos(23°)...
開根號: 1~10的開平方根和開立方根, 以前我都有背, 儘量化簡再套入我有背的值.
對數值: log10的1~10, 以前我都有背, 儘量化簡再套入我有背的值.
然而, 現在年紀大了, 細心? 耐心? 數字感? ...... 囧rz
另外, 就我現在的工作而言, 如果程式裡面要求近似值, 嘿嘿...不能太複雜, 否則計算量過大且組合語言太難寫...Orz
看到"如何估計log7"這種用差分求近似值的方法, 計算很簡單, 於是想整理一下公式. (整理公式可是我的專長, 不信? 請參見我的碩士論文...XD)
首先, 假設我們要求f(x)的近似值, 而我們有f在x附近的函數值可利用.
一階差分就是將函數值相減, 二階差分就是將一階差分相減, 以此類推..., 於是可列出如下的差分表.
把一階差分中有f(x)的相鄰兩項設成相等(藍色的算式)(類似假設一階微分的f'(x-)=f'(x+))就可求f(x).
把二階差分中有f(x)的相鄰兩項設成相等(綠色的算式)(類似假設二階微分的f"(x-)=f"(x+))就可求f(x).
然而, 假設N階差分中相鄰兩項相等, 其實就是假設這相鄰兩項所產生的(N+1)階差分等於0. 對應結果如下所示.
寫成公式就是..., 公式是程式算的, 人腦算還是列出差分表.
在估計log7時, 假設4階差分中相鄰兩項相等, 求出的結果令人滿意. logx是單調遞增函數, 而且隨著x增加, f(x)的變化越小(f'(x)遞減), 是不是因為這樣差分求近似值才能準確呢?
f(x)=3x, 已知{f(x) | x<10 or x>10}, 求f(10)=?(ans=59049)
f(x)是單調遞增函數, 但是f'(x)也遞增.
假設N階(N>1)的差分項等於0.
N=2, f(10)=32805或98392.5, min_err=-26244(-44.45%)
N=3, f(10)=41553或76545或6561, min_err=±17496(±29.63%)
N=4, f(10)=47385或67797或41553或137781, min_err=8748(14.82%)
N=5, f(10)=51273或63714.6或52050.6或80044.2, min_err=4665.6(7.91%)
N=6, f(10)=53865或61641或55938.6或66047.4或31055.4, min_err=2592(4.39%)
越高階的差分, 求得的近似值越靠近真實的值.
但是也可以發現有可能會選出誤差大的值. 如果把表格的範圍縮小(計算的欄位變少), 這收斂的速度會變慢.
考慮另外一個例子, f(x)=cos((x-0.8)π/8), 不是單調函數, 已知{f(x) | x<0 or x>0}, 求f(0)=?(ans=0.9511)
假設N階(N>1)的差分項等於0.
N=2, f(0)=1.1028或0.87865, min_err=-0.07245(-7.62%)
N=3, f(0)=0.9671或0.953367或0.941367, min_err=0.002267(0.24%)
N=4, f(0)=0.9568或0.947367或0.95545, min_err=-0.003733(-0.40%)
N=5, f(0)=0.95114或0.9506, min_err=0.00004(0.005%)
N=6, f(0)=0.95087或0.9512267, min_err=0.0001267(0.0013%)
這函數值的變化並不劇烈又對稱於x=0.8, 故差分也可有效的求取近似值.
對於變化激烈的函數, 越高階的差分能得到越好的近似值; 越小的d能在較低階差分就獲得良好的近似值.
其他參考資料:
http://zh.wikipedia.org/zh-tw/%E5%B7%AE%E5%88%86
http://en.wikipedia.org/wiki/Difference_operator
http://en.wikipedia.org/wiki/Finite_difference
求函數f在某點x的近似值有很多種方法, 像是:
a) 最常見的是linear interpolation, 已知f另外兩個點對應的函數值, 利用這兩點形成的直線估計f(x), x在這兩點之間是內插, 反之是外插.
b) 至於polynomial interpolation(或是Lagrange polynomial)或spline interpolation, 沒有計算機的幫忙很容易算錯...
然而, 除了linear interpolation, 其他都需要不少複雜的計算.
以前的我真的滿會算的, 這不是自誇, 遙想大一時, 工程力學的期中考, 別人都帶工程計算機, 我卻呆呆地帶了一台只能+-×÷(還不能開平方根)的計算機...囧...於是...
三角函數: sin(3°)這種小角度就直接帶Taylar's expension在0展開的公式; 角度大就用倍角公式, 像是sin(13°)就先算出sin((13/2)°)和cos((13/2)°)再帶入sin兩倍角公式, 像是sin(23°)就先算出sin((23/3)°)再帶入sin三倍角公式; sin(67°)就是cos(23°)...
開根號: 1~10的開平方根和開立方根, 以前我都有背, 儘量化簡再套入我有背的值.
對數值: log10的1~10, 以前我都有背, 儘量化簡再套入我有背的值.
然而, 現在年紀大了, 細心? 耐心? 數字感? ...... 囧rz
另外, 就我現在的工作而言, 如果程式裡面要求近似值, 嘿嘿...不能太複雜, 否則計算量過大且組合語言太難寫...Orz
看到"如何估計log7"這種用差分求近似值的方法, 計算很簡單, 於是想整理一下公式. (整理公式可是我的專長, 不信? 請參見我的碩士論文...XD)
首先, 假設我們要求f(x)的近似值, 而我們有f在x附近的函數值可利用.
一階差分就是將函數值相減, 二階差分就是將一階差分相減, 以此類推..., 於是可列出如下的差分表.
把一階差分中有f(x)的相鄰兩項設成相等(藍色的算式)(類似假設一階微分的f'(x-)=f'(x+))就可求f(x).
把二階差分中有f(x)的相鄰兩項設成相等(綠色的算式)(類似假設二階微分的f"(x-)=f"(x+))就可求f(x).
然而, 假設N階差分中相鄰兩項相等, 其實就是假設這相鄰兩項所產生的(N+1)階差分等於0. 對應結果如下所示.
寫成公式就是..., 公式是程式算的, 人腦算還是列出差分表.
在估計log7時, 假設4階差分中相鄰兩項相等, 求出的結果令人滿意. logx是單調遞增函數, 而且隨著x增加, f(x)的變化越小(f'(x)遞減), 是不是因為這樣差分求近似值才能準確呢?
f(x)=3x, 已知{f(x) | x<10 or x>10}, 求f(10)=?(ans=59049)
f(x)是單調遞增函數, 但是f'(x)也遞增.
f(x) | 1st | 2nd | 3rd | 4th | 5th |
243 | |||||
729 | 486 | ||||
2187 | 1458 | 972 | |||
6561 | 4374 | 2916 | 1944 | ||
19638 | 13122 | 8748 | 5832 | 3888 | |
y=f(10) | y-19683 | y-32805 | y-41553 | y-47385 | y-51273 |
177147 | 177147-y | 196830-2y | 229935-3y | 271188-4y | 318573-5y |
531441 | 354294 | y+177147 | 3y-19683 | 6y-249318 | 10y-520506 |
1594323 | 1062882 | 708588 | 531441-y | 551124-4y | 800442-10y |
4782969 | 3188646 | 2125764 | 1417176 | y+885735 | 5y+334611 |
但是也可以發現有可能會選出誤差大的值. 如果把表格的範圍縮小(計算的欄位變少), 這收斂的速度會變慢.
f(x) | 1st | 2nd | 3rd | 4th | 5th |
2187 | |||||
6561 | 4374 | ||||
19638 | 13122 | 8748 | |||
y=f(10) | y-19683 | y-32805 | y-41553 | ||
177147 | 177147-y | 196830-2y | 229935-3y | 271188-4y | |
531441 | 354294 | y+177147 | 3y-19683 | 6y-249318 | 10y-520506 |
1594323 | 1062882 | 708588 | 531441-y | 551124-4y | 800442-10y |
考慮另外一個例子, f(x)=cos((x-0.8)π/8), 不是單調函數, 已知{f(x) | x<0 or x>0}, 求f(0)=?(ans=0.9511)
f(x) | 1st | 2nd | 3rd | 4th | 5th |
0.6494 | |||||
0.8910 | 0.2416 | ||||
0.9969 | 0.1059 | -0.1357 | |||
y=f(0) | y-0.9969 | y-1.1028 | y-0.9671 | ||
0.7604 | 0.7604-y | 1.7573-2y | 2.8601-3y | 3.8272-4y | |
0.4540 | -0.3064 | y-1.0668 | 3y-2.8241 | 6y-5.6842 | 10y-9.5114 |
0.0.0785 | -0.3755 | -0.0691 | 0.9977-y | 3.8218-4y | 9.5060-10y |
對於變化激烈的函數, 越高階的差分能得到越好的近似值; 越小的d能在較低階差分就獲得良好的近似值.
其他參考資料:
http://zh.wikipedia.org/zh-tw/%E5%B7%AE%E5%88%86
http://en.wikipedia.org/wiki/Difference_operator
http://en.wikipedia.org/wiki/Finite_difference
沒有留言:
張貼留言