|
有朋自遠方來 作者:曾慶潭Ching-Tang Tseng 2009-03-20于紐西蘭 ilikeforth@gmail.com http://forthfortnight.blogsopt.com
有朋自臺灣來,帶來了雙倍的承諾,以及更多的硬體支援,最樂之事卻是有機會再度與同道暢談Forth。人逢知己精神爽,彼此由衷的心得交換,不僅鼓舞了繼續努力實現夢想的胸懷,而且強烈的感受到,瞬間大增了在此領域的技術功力,並且獲得對現行發展Forth時,可供配套之軟、硬體應有的最新認識。真所謂,德不孤,必有鄰,原本在海外隻身奮鬥於Forth的處境,產生了幾近道不行,乘桴浮於海的念頭,有此一朋友的來到,完全改觀了!焉有不受激勵之理? 『Forth操作音效卡』一文刊出之後,得到了不少迴響,文中曾經提及老友奉駿泉先生承諾提供A/D轉換器一事,熟料奉兄有感於單片A/D卡供作『地震早期監測系統』發展所須稍嫌單薄,特別新購了兩套A/D裝置帶來紐西蘭,實現了雙倍的承諾。另外,又覺不必勉強硬要使用舊系統,亦可同時在現行電腦硬體與作業系統下進行此事,特別相贈了一個他自己公司發展出來的產品,是使用USB接頭為界面,一個小巧玲瓏的裝置,內附Silab’s 8051F320晶片,是一套也具有A/D功能的好東西,價格千元台幣左右。有此利器,實現夢想就不太遠了,更何況奉兄還指導了關鍵的應用方式,直接解決界面問題,接妥的系統,不單純是只能做目前計劃中的工作,幾乎擁有可供實驗室中直接執行抓取訊號的應用了。 我們在推廣Forth的同時,若有廠商協助及贈與,對於彼此的發展必然是相得益彰,奉兄是知己,遠勝於廠商,出錢出力支持Forth的發展已不知有幾次了,這一次除了感激外,更應以禮相待,君子以文會友,以友輔仁,特以行將付梓、不便外傳的兩篇文章:『美麗的詩篇』、『實現劃線Forth程式』,印妥成實體後相贈,知己才更珍惜這種技術產品,當天奉兄便開始展卷閱讀,他告訴我Charles Moore的習慣,就是公開了艱深、精彩設計後,從來就不寫相關文章的。 『實現劃線Forth程式』涉及別人專利,且此二文均因圖文並用,而不利於個人網頁的素文字刊出,網頁的初衷就不想浪費時間去搞花俏,有相當份量的文章也只宜以書出版,故均不外傳。 『美麗的詩篇』雖然僅只是述而不作,信而好古的產出,但以特殊方式詳述、剖析Forth程式語言發明人Charles Moore當初所設計的Tiny BASIC compiler,完整解說一個漂亮系統的設計技術。完成該文以後,便開始闡揚其特出方法,身體力行,以其中精華做為依據,將Forth改善成可以用中算符方式設計程式的系統。截至目前為止,已有許多具體的成果,新近的作品是一篇『Forth計算程式的新外貌』,昨天的突破則是將浮點亂數函數適當的加入了系統,短程的目標是在Win32Forth系統上完成具有浮點數字功能的中算符系統而後暫止,先供推廣之用,待其落定之後,長程目標則改在可以用Forth全面發展數值分析程式,供作學術教學或實際應用之須,到時就會有無限的發展空間。立定了志向,假以時日,必然能有所成。 如此發展出來的系統,具有如同BASIC程式語言一般的程式寫作方式,易寫、易用、易讀、易懂,幾近可以直接引用前人精彩的程式設計,配合Forth原有的完整功能,能作許多事情了,尤其是數值分析應用方面,更加方便可行。下列就節錄『Forth計算程式的新外貌』文章中的一段應用實例,可以看出此一系統的端倪。
------------------------------------------------------------------------------------------------------- 2. 應用實例
數值分析程式實際上並不複雜,它期望系統能提供的性能,主要是在計算式子的表示方式上,要接近數學表示式的方式為最好。至於資料的輸出、輸入、程式執行迴路、或者是邏輯判斷後的條件分支能力…等問題,則都不是強調重點,能行就行。因此,我們要舉的實例,暫不考慮數學方面的複雜理論,避免類似需要疊代(iteration)計算的問題,也不需要舉許多分支情況的例子搞混了主題。 曲線調適(Curve fitting)問題,在數值分析技術中算得上是一個很有用的主題,如果Forth計算程式能將此一問題處理得很好,使程式的外貌易讀易懂,就可謂性能大大的改善了。 所謂曲線調適,是應用在將實驗數據妥善的匹配至理論數學式子的一種數值分析技術。有許多場合,一個自然現象可以用一個標準簡單的數學式子來表示,形同y=f(x)的數學函數,也就是y隨x變化的狀況由y=f(x)來決定。從事研究工作的人經常會對一個已經確定了y=f(x)關係的研究問題進行實驗,取得這種y與x間關係的許多組實驗值,接下來要做的工作就是曲線調適了。由於y=f(x)數學函數表示式通常僅表示一個現象的趨勢關係,函數式中每一項的前引係數均未定,必須靠實際的實驗來決定這些係數之值,曲線調適技術便發展出許多方法來處理實驗數據,以求得函數式子的所有係數。最後獲得的完整數學式子不只是將問題確定而已,這樣的數學式子,通常也代表了此後可以合理的運用,因為實驗時只做了有限個點的關係實驗,應用時則代表了可以用在指定範圍內的無窮多個點之情況,所以曲線調適也就成為實驗結束後非作不可的工作了。 要想仔細研究曲線調適的各種方法,很可以寫出一部洋洋大觀的專門書籍來,本文的目的不在這裡,相反的,此處完全不于探討,還得請讀者自行去參考相關書籍,任何數值分析的書籍都有這個主題,我們僅借用其中一個最簡單的研究結果作為代表,當作程式設計時的範例。 以最小平方差原理(Least-Squares Approximation)來達到曲線調適的目的,是此處想引用的例子,為了說明方便,我們也僅舉一個一階多項式的函數關係為例,以標準數學式表示如下:
y = a + b x
其中,a 與b均為未定係數,有待以最小平方差曲線調適後決定。原則上兩個未知數,只要兩組關係值就足供確定了。然而,實際的環境並非如此,為了減少各方面可能產生的誤差,我們必須進行更多的實驗,取得更多組的數據,然後以最小平方差原理,根據統計分析的技術結論,將誤差減至最小,如此決定的係數才有學術根據,才能研究與討論。 假設已經完成了N次的實驗,得到了N組y與x之間的關係數值,那麼,最小平方差分析後的結論,兩個係數a與b及標準誤差D可以寫成下列恆等式:
Σ x․Σ x y – Σ x² ․Σ y a = ──────────────── ( Σ x )² – N ․Σ x²
Σ x ․Σ y – N ․Σ x y b = ──────────────── ( Σ x )² – N ․Σ x²
這三個式子是本文借來規劃程式設計的重要依據,因為從式子中可以看出要大量的使用運算符號,符號Σ是代表總合(Summation)的意思,因此如果作了十次實驗,得到十組y與x的相關數據,單只考慮求得a與b時,我們就得分別先求出十個x、y、x乘y、與x的平方總合後的結果,然後才能代入上列式子,進行乘法、減法、與除法計算,最後才能得到a與b的答案。這麼多的計算,如果要用傳統Forth來寫後算符式的程式,大多數人寧可放棄不做了,就算勉強做了還很容易出錯或搞得一團混亂,這就是Forth不適合用來發展數值分析程式設計的原因。 以『美麗的詩篇』文中解決中算符問題的方法為藍本,可以制定一些Forth設計計算程式時的新規矩,解決它不適合發展數值分析程式的問題。為了避免後續還得重新列印程式來配合說明,此處直接一次便將整個完整的曲線調適程式列印如程式二,先假設它可以執行,我們便根據這個程式來制定一些新規矩,再以這些新規矩當作程式設計規格,實現整個構想。請先從上到下瀏覽一遍這個程式,你很容易發現程式在數值分析方面的可讀性,幾乎與BASIC程式語言相等,它是Forth計算程式的新外貌!
\ First-order least squares curve fitting demonstration program \ by Ching-Tang Tseng 2009-2-24 \ ilikeforth@gmail.com http://forthfortnight.blogspot.com
LOAD CHING.4 \ 即程式三
20 FIXARRAY XX 20 FIXARRAY YY FIXVAR A FIXVAR B FIXVAR D FIXVAR D1 FIXVAR A1 FIXVAR A2 FIXVAR B0 FIXVAR B1
: RESET-ALL 21 0 DO {{ XX ( I ) = 0 }} {{ YY ( I ) = 0 }} LOOP {{ A = 0 }} {{ B = 0 }} {{ D = 0 }} {{ D1 = 0 }} {{ A1 = 0 }} {{ A2 = 0 }} {{ B0 = 0 }} {{ B1 = 0 }} ; : INPUT-DATA {{ XX ( 1 ) = 0 }} {{ YY ( 1 ) = 0 }} {{ XX ( 2 ) = 0.157 }} {{ YY ( 2 ) = 0.156 }} {{ XX ( 3 ) = 0.314 }} {{ YY ( 3 ) = 0.308 }} {{ XX ( 4 ) = 0.471 }} {{ YY ( 4 ) = 0.454 }} {{ XX ( 5 ) = 0.628 }} {{ YY ( 5 ) = 0.587 }} {{ XX ( 6 ) = 0.785 }} {{ YY ( 6 ) = 0.706 }} {{ XX ( 7 ) = 0.942 }} {{ YY ( 7 ) = 0.808 }} {{ XX ( 8 ) = 1.099 }} {{ YY ( 8 ) = 0.891 }} {{ XX ( 9 ) = 1.256 }} {{ YY ( 9 ) = 0.950 }} {{ XX ( 10 ) = 1.413 }} {{ YY ( 10 ) = 0.987 }} {{ XX ( 11 ) = 1.550 }} {{ YY ( 11 ) = 0.999 }} ; : RUN-COEFFICIENT 12 1 DO {{ A1 = A1 + XX ( I ) }} {{ A2 = A2 + ( XX ( I ) * XX ( I ) ) }} {{ B0 = B0 + YY ( I ) }} {{ B1 = B1 + ( YY ( I ) * XX ( I ) ) }} LOOP {{ D = ( A1 * A1 ) - ( 11 * A2 ) }} {{ A = ( A1 * B1 ) - ( A2 * B0 ) }} {{ A = A / D }} {{ B = ( A1 * B0 ) - ( 11 * B1 ) }} {{ B = B / D }} ; : RUN-STANDARD-DEVIATION {{ D = 0 }} 12 1 DO {{ D1 = YY ( I ) - A - ( B * XX ( I ) ) }} {{ D = D + ( D1 * D1 ) }} LOOP {{ D = SQRT ( D / ( 11 - 2 ) ) }} ; : OUTPUT-DATA CR ." Fitted equation is :" CR ." y = " A FN. SPACE B DUP 0< IF FN. ." x" ELSE ." + " FN. ." x" THEN CR ." Standard deviation of fit is : " D FN. CR ." Finished. " CR ; : CV \ Least squares Curve Fitting routing RESET-ALL INPUT-DATA RUN-COEFFICIENT RUN-STANDARD-DEVIATION OUTPUT-DATA ;
程式二、一階最小平方差曲線調適Forth範例程式(CVFIT.4)
執行縮寫指令CV可以快速的得到曲線調適後的答案,列印如下:
Fitted equation is : y = 0.104 + 0.661 x Standard deviation of fit is : 0.070 Finished.
|
| |||||||||||||||||||
| 建立群組 - Google 網上論壇 - Google 首頁 - 服務條款 - 隱私權政策 |
| ©2009 Google |