close
作者: MHG (MPS model) 站內: PhD
標題: Re: [問題] 數值計算的軟體
時間: Sun Apr 12 18:00:03 2009

※ 引述《ForHonor (I'm not afraid)》之銘言:
: 大家好
: 就我所知常用來做研究的工具有
: C語言 Fortran Matlab Mathematica
: 有沒有大大用過這其中的好幾個可以給個比較
: 假設以
: 人性化(方便性) 運算速度 繪圖能力 多變性
: 這幾個點為討論出發點

小弟專長是作數值運算的~以發展數值方法為主。
所以對於程式語言來說算是較為常用的!
根據原po所列的工具,小弟有使用過用於數值計算的問題,如下所列:
Fortran, C, C++, Matlab, Mathematica, Maple

下列所述都是個人使用的經驗!
實際的速度還是得依照個人使用的語言習慣與計算環境較有關係!
如有錯誤的話煩請各位大大指證!

當然!小弟從學程式語言以來所學主要的開發工具是以Fortran為主~
所以經常混搭Fortran與C或是Fortran與Matlab作為使用~
以下的的討論其OS環境,小弟就簡單以WinXP與Linux為主~
其他的BSD或是其他的Unix, 就不題了~基本上有些計算效率而言~Linux較快一點!
但相同的codes在其他的UNIX環境下都跟Linux差異不大~

1. Fortran
一般而言~從名字上就可以知道Fortran它的功用了!
由於小弟不擅長繪圖功能的程式撰寫,所以在此以討論數值計算的速度為主。
而繪圖的部分,Fortran 90之後的功能提升很多也可以撰寫繪圖程式用於I/O了。
但是小弟實際上還是會用其他軟體輔助繪圖的部分,
以Tecplot為主,並以Grapher、Surfer為輔大致上2D 3D的圖大概都還可以表達~
有時會搭用Matlab來作後端輸出的視覺化表達。
而其他軟體在搭配fortran上的表達也算還ok啦!
(但Fortran 90以上基本也支援OpenGL~可以支援不少科學繪圖了!)

就計算而言,Fortran的Subroutine和Function可用性很高,
在計算上著名的書籍Numerical Recipes早期就以fortran 77出版了~
而支援Fortran的語言函式或是副程式也非常多(C, C++, Matlab...etc.),
這個關係到使用fortran這個工具時~你也可以使用其他語言的工具,
進而降低研發程式的難度與時間。

在工作站上的計算小弟目前也有使用Fortran,使用的OS環境為Linux~
由於先前小弟group並未購買IMSL用於工作站上,所以此時很多小問題得依賴
世界各地專家們所釋出的函式或是副程式來解決,只要小心根據定義使用
Fortran在銜接這些solutions的相容性非常高的!

So, 人性化(方便性)、運算速度可謂極佳!
繪圖能力則屬尚可(我得強調!這是因為我太弱了XD)
多變性我個人評為佳!
(雖然90以上的語法已經可以支指標、援物件導向...etc.
但與C++比起物件導向來看我想還有些距離吧!)

2. C語言
這是小弟接觸以來的經驗,一般來看,C可以算是早期泛用型語言了吧!
但是C與Fortran比起,Fortran可以作的C都可以作!
然而Fortran是以撰寫數值程式為專門取向的工具,這點是無庸置疑的~
故小弟個人認為以C來寫數值程式比起Fortran先天上並無大的優勢!

以眾多前人所釋出的函式或是副程式寶藏來看...
C的資源可謂是最豐富的吧!
而且,C與FORTRAN的subroutine或functions連結是非常容易且多樣的!
著名的劍橋數值菜單Numerical Recipes也有C的版本~XD

再者!許多著名的大型程式之撰寫(UMPACK, SuperLU, FFTW...etc.)
也是由C撰寫的!真是可為寶藏含量極為豐富的語言啊!XD

在工作站上C的使用,比起Fortran而言算是簡易很多了!
而速度上則會因為程式設計者的習慣而有差異!
基本綜觀以同方法解同問題但是用不同語言來比較的話!我想是差異不大的!

So, 人性化(方便性)與運算速度可謂極佳,繪圖能力由於龐大寶藏之故也可謂極佳
多變性來看還是受限於語法本身,比Fortran90略微單調,但也算佳!

3. C++
C++的部分小弟使用不是很多!煩請大大幫忙簡述這項工具的威力程度了!

C++是C的延伸(小弟個人觀感),他既可已接收前人發展C的龐大資源
又可以超越C做出物件導向,
但是C++在與Fortran上的連結卻變的困難許多!
不過小弟覺得無妨!因為C的資源對於一般程設者大概就夠用了~
更何況到處都有得討論~XD

附帶一題的是Numerical Recipes也有出版C++版本~:p

在工作站上的使用上~C++似乎有著一些語法的優勢~
在某些平行的計算環境上~似乎蠻多人使用C++作為開發的工具~
(平行計算的部份小弟並無實際經驗!煩請各位大大補充了!)

So, 人性化(方便性)則因為可接收C的大寶藏(有些時候需要改寫)個人判斷為佳
計算速度因小弟個人使用之故無法做出最好的評斷!
繪圖能力由於龐大寶藏之故也可謂極佳!
而多變性來看是極佳!



4. Matlab
呵...基本上小弟不完全認為Matlab算是個"程式語言"...
但是它有許多好用的tool box!對於繪圖而言他可以算是天生的強項啊~
但是它的計算速度卻相對於C或是Fortran卻慢很多!尤其是迴圈的部分!
針對它在與C或是Fortran的連結來觀察,相容性很高!
所以大致上可以將需要加速的部分丟給Fortran或是C來處理~
而Matlab本身的資源也算是不錯!除了專業的Tool box以外~
連接C與Fortran的資源也可算是可以接受的了~
(C++與Matlab連結的的狀況,小弟不明瞭煩請能人補充了!)

至於資源的部份來看~Matlab在網路上的資源也漸漸的流行起來!
可以想見未來的資源也會越來越多!

就使用上而言,他不太嚴謹,也因此方便了許多!XD

工作站上的計算則是需要for Linux的版本~使用方法差異不大~
Matlab作大量運算的效能來還是無法與C/C++或是Fortran比擬~

So, 人性化(方便性)可謂極佳!與運算速度則只能說尚可了!
繪圖能力由於Tool box之故也可謂極佳!
多變性來看還是屬於尚可的階段~

5. Mathematica與Maple
嗯!他不是程式語言!執行速度也不太快!
畫圖的部粉也只能說是普普!(有許多軟體也能做到)
但是他的特殊功能卻是其他軟體無法比擬的!
例如:微分、積分、特殊函數...etc.

通常在數值分析前段我會使用它來協助數學上的驗算~
另外~~在精度上的部份這類工具有著一些的優勢~
例如超越雙精度的數值計算或是大數運算~
雖然程式語言都還可以操作~但是沒有這類工具來的簡便~

至於他們的資源只能說不算太多了!而跟其他程式的結合似乎還不多見!(請能人補充!)
用來作大量計算的話我想是頗為困難的吧!(若有誤請能人指證~)

So, 人性化(方便性)可謂尚可!與運算速度可謂不佳!
繪圖能力可謂尚可!多變性來看算是不佳~


綜觀1~5.....大概是台灣市面上極為常見的幾種數值工具了~

但是基本上我還是得說明一下!
工具只是工具!它們會因使用者的不同用法而有著效率上的差異~

個人認為,學熟其中的一種程式語言,搭配使用其他的資源,用來解決問題即可!
若真正講究計算效率,倒不如把演算法的細節先搞定,
再交給真正的程式設計人員去操刀~

例如:我用有限體積法(FVM)去分析3D大規模不規則區域的黏性流場~
目的是藉由數值方法分析這個計算區域的物理現象~
看到這問題我個人第一個感想是:這是個物理問題!數值程式只是工具~
就算我用數值菜單的CG解法去求解矩陣,還是沒辦法和商業軟體比快!
因為這個例子的目標並不是在研發新型快速的矩陣解法~而流場的物理現象才重點!
也許有人會講~那與其這樣為何不用LU分解就好?
是的!因為傳統LU分解的速度可能會讓我多好幾年才畢業!
工具只要夠用即可!要更好的效率要付出更多的的代價~只有自己能去衡量輕重~


呵~以上是小弟的粗略看法!

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.190.160
[1;37m推 [33mmrjmrj [m [33m:推!我感覺自已只是會寫小程式,卻無法區別程式的優缺點 [m 04/12 18:07
[1;37m推 [33mmrjmrj [m [33m:只是拿程式來預測自已的理論對不對 [m 04/12 18:10
[1;37m推 [33mtouyalin [m [33m:推!原po對程式熟的話,可以考慮用cuda平台來增加計算效率 [m 04/12 20:03
[1;37m推 [33mfish1217 [m [33m:Fortan和C或Matlab混搭...是透過COM嗎? [m 04/12 20:46
[1;31m→ [33mMHG [m [33m:回tou大:呵!正有意思想入門cuda玩耍,無奈雜事纏身啊! [m 04/12 21:25
[1;31m→ [33mMHG [m [33m:魚大:小弟笨拙,COM是指??囧a... [m 04/12 22:16
[1;37m推 [33mfish1217 [m [33m:M兄...那請解釋一下混搭的意思.... [m 04/12 23:51
※ [1;32mcyliu [0;32m:轉錄至看板 MATLAB [m 04/13 00:10
[1;37m推 [33mcyliu [m [33m:本文已經借轉MATLAB板, 因為這可算是MATLAB板的FAQ了. XD [m 04/13 00:12
[1;37m推 [33mfish1217 [m [33m:C兄...這個是Fortan的問題....應該不是轉Matlab版 [m 04/13 00:14
※ [1;32mkumoking [0;32m:轉錄至看板 Civil [m 04/13 01:45
[1;37m推 [33mcyliu [m [33m:回魚大: 因為MATLAB板上常有人問 XX vs MATLAB的問題.. [m 04/13 02:26
[1;31m→ [33mMHG [m [33m:回魚大:混搭是指各項的標題工具(1.Fortran)去call其他的函式 [m 04/13 12:04
[1;31m→ [33mMHG [m [33m:Ex: Call C or Matlab functions from Fortran [m 04/13 12:06
[1;31m→ [33mMHG [m [33m:只是簡單的call函式或是副程式而以~ [m 04/13 12:07
[1;37m推 [33mForHonor [m [33m:推好文 解釋的很清楚 [m 04/13 12:32
[1;37m推 [33mfish1217 [m [33m:對...那 Call Func 的方法...是不是要寫定義.. [m 04/13 18:15
[1;31m→ [33mfish1217 [m [33m:總不可能...直接呼叫... [m 04/13 18:16
[1;31m→ [33mfish1217 [m [33m:所以晚輩才會說是不是透過COM [m 04/13 18:16
[1;31m→ [33mMHG [m [33m:呵~魚兄見笑了~我還是不懂啥是COM是啥~XD [m 04/13 22:15
[1;31m→ [33mMHG [m [33m:我用fortran的作法是用interface彭國倫書上有寫~XD [m 04/13 22:16
[1;31m→ [33mMHG [m [33m:Fortran call Matlab是類似這個網頁http://0rz.tw/jZ6bM [m 04/13 22:28
[1;31m→ [33mMHG [m [33m:不過我只會簡單的~Matlab和C/C++都是自學的~給大家見笑了XD [m 04/13 22:29
※ 編輯: MHG 來自: 140.112.190.160 (04/13 22:34)
[1;37m推 [33mfish1217 [m [33m:M兄詳細解說...大概明白您的混搭.... [m 04/14 00:37
[1;31m→ [33mfish1217 [m [33m:原來是透過Matlab Eng混搭... [m 04/14 00:38
[1;31m→ [33mfish1217 [m [33m:其實接口很多...只是覺得寫起來很嚕嗦而己 [m 04/14 00:40
[1;31m→ [33mfish1217 [m [33m:再次感謝您的解說 [m 04/14 00:40
[1;31m→ [33mMHG [m [33m:呵~是啊!有很多技巧可以用~魚兄可以解說一下COM是啥嗎?XD [m 04/14 11:44
[1;31m→ [33mfish1217 [m [33m:也只是一個接口(大陸用語)...定義和撰寫不太一樣 [m 04/15 16:35
[1;37m推 [33myhd [m [33m:FVM 造出來的Sparse Matrix,應該沒有會考慮用LU 去解 XD [m 04/15 21:39
arrow
arrow
    全站熱搜

    jackc 發表在 痞客邦 留言(2) 人氣()