此為公開平台, 請勿在此揭露你我的個人資訊.
不歡迎散播謠言與八卦. 嚴禁商業廣告.

biking travel | hiking travel
picasa album 1 | picasa album 2 | picasa album 3
picasa album 4 | picasa album 5

    近期碎碎唸 - 記錄近期的感觸跟雜念
角落的孤棋, 在艱難做活的同時, 也要盡可能爭取最大實利!
-- 邊緣未生

    近期集錦 - 分享近期聽到看到的一些好東西
We laughed and kept saying "see you soon", but inside we both knew we'd never see each other again.
from La Leggenda del Pianista sull'Oceano in 1998

We are often told to "put on a brave face” or to be strong. To do this, we often have to hide, or at least minimize, whatever fears, flaws, and vulnerabilities we possess. However, such an emphasis on strength is misguided. What truly takes courage is to show our imperfections, not to show our strengths, because it is only when we are able to show vulnerability - or the capacity to be hurt - that we are genuinely able to connect with other people.
from Essay prompts of SAT administration in Jan. 2015


2009/09/12

差分(difference)求近似值

會想整理這篇文章, 是看到如何估計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)也遞增.
    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
    假設N階(N>1)的差分項等於0.
  • N=2, f(10)=32805或98392.5, min_err=-26244(-44.45%)
  • N=3, f(10)=4155376545或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) 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
    假設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

    沒有留言:

    張貼留言