請問我在寫程式寫其格點時,可不可以要把程式分成四個步驟?(使用有限差分法)
例如:1 任意點a點,在外部邊界時之格點
2 任意點a點,在內部圓形邊界之格點
3 任意點a點,在內部矩形邊界之格點
4 任意點a點,在內部無觸及邊界之格點 還是說有更快的方法?
--
※ Origin: 楓橋驛站<bbs.cs.nthu.edu.tw> ◆ From: 61-230-221-62.HINET-IP.hinet.net
就我的經驗來說,OO的語言如C++和Java都很好處理這些事
我之前的設計是先設計一個叫Point的class
再分別設計BoundaryPoint和DomainPoint兩個class來際承Point
很明顯的,不論是邊界上的點或Domain內的點,都是一種"Point"
你再根據BoundaryPoint和DomainPoint分別設定他們該有的interface
如果你的問題是mix Boundary的話
還可以設計幾個子類別來繼承BoundaryPoint
如DirichiletBoundaryPoint和NeumannBoundaryPoint
然後你就可以用一個Container來裝這些point
例如C++中的STL或Java Container在這就可以幫上忙
不管他是邊界點或Domain的點...他們都是"Point"
所以這個Container就是裝"Point"這個type
把點全往裡面塞...
最後在form matrix的時候就可以發現他的威力
我們可以用iterator來traversal每一個點
再用C++或Java的RTTI機制
(C++為type_id(),dynamic_cast<>兩個搭配,Java則用instanceof關鍵字)
來辯別這是屬於哪一種點的instance
再把它downcast之後再來呼叫相對應的interface
(例如你會設計一個formMatrix()的method)
把matrix form起來,當然你也可以把該interface的層次提到base class
設計成一個pure virtual (C++) / abstract (Java) function
讓derived class來實做..
例如boundary point就會把boundary value甩掉matrix的right hand side
如果是解Poisson equation
那domain的loading value也會被甩到matrix right hand side
但甩的方式不太一樣,所以每個derived class實作內容的差異性在此!
ps.如果loading/boundary value是以一連續函數來表達的話,
又會引進一個funciton callback的問題..也是設計的一個重點
總之這例用OO的方法有很多種,我沒辦法在這一次完全講清楚
只提及了很粗淺的概念而已,實際上還是端看你怎麼設計
甚至是不是可以利用design pattern來解決
(之前的project我是引進了decorator pattern來解決1~3D FDM的問題
不過那是regular domain可能和你的問題又不太一樣)
這都是我們現在在觀察的問題...
使用OO design的好處不但在於方便性,而且也可以提升程式的複雜度和彈性
當然你的方法不是不行
用陣列去存也是很好...如果是一個很客制化的問題倒是沒有什麼關係的!
如果是面臨一個很複雜的project..或是更複雜domain
那你就要重新思考是不是有一個general rule來統合整個問題
而不用把單一的問題逐步的拆開來看
當然這是一個很遠大的目標,也不是很快就能達成..
所以現在做OO numerical的人都在看這塊大餅,
research和paper也一直從這裡衍生出來
--
[1;30m [1;37mI [1;30mn [0;37mf [1;30ml u [0;37me [1;37mn [0;37mt [1;37m. [1;30m.... [1;37m.
[1;30m i [1;37mn [0;37mf [1;37mluen [1;30mce
[0;37mw H a t [1;30mev [1;37mer [1;37m. [1;30m. [0;37m. [1;30m. [0;37m. [1;37m. [0;37m. [1;37m?
[m [1;33m※來源 : [1;36m 台北科大計中紅樓資訊站 [1;35mredbbs.cc.ntut.edu.tw
[1;32m※FROM : [1;37m211.75.136.186 [m