作者SocketAM2 (AM2)
看板C_and_CPP
標題Re: [問題] 物理的數值模擬適合用C++嗎?
時間Fri Apr 20 09:51:14 2012
小弟的意見,什麼比較適合你要看你想要的輸出而定
不過,小弟對程式設計經驗有限,以下心得可能會有錯漏之處,還請見諒
C/C++最大的優勢是有機會寫出計算速度最快的程式
缺點是若計算完的結果要輸出的漂漂亮亮的需要再花一些effort
個人的意見,
假設你對於要怎麼算已經很清楚很確定
要計算出的結果只是幾個數字,沒有想要弄成可以轉來轉去拉來拉去操縱的圖,
而得出這幾個數字又"很"需要重複迴圈的計算量的話
(這裡的"很"有點難定義...
之前看過物理模擬分割成幾部分在N台電腦各跑N天的)
強烈建議你考慮C/C++,因為個人猜測他效率是最佳的 (很多程式都以C為底)
個人經驗,加法、if、mod這三個計算的組合跑迴圈暴力算數學問題
高三時在我家電腦上自己寫的VB程式隨便就要算過夜甚至超過一天
大一的時候在課堂上同樣的計算邏輯(除了開檔、讀檔)改寫成C++只花了不到一分鐘就算
完
那時我當場就被shock到了
如果你要做的計算方式還不太確定,
或者要算的東西希望能較華麗的輸出
例如是個三度空間中的圖,軸想轉來轉去或放大縮小拉來拉去來觀察
又或者你的計算過程中會很大量的用到各種特殊函數、微積分等數學工具
建議你考慮matlab,它內建的plot功能很強大
事實上他根本就是為了數學運算作圖而設計的軟體
直接使用它內建的各種數學功能可以省下你自己寫/上網找的功夫
matlab是直譯式語言,和下面的python都有容易即寫即試的特性
各種變數的監看環境也不錯
開發程式的方便度不錯
個人還玩過python,感想是介於上述兩者之間
以程式語言的容易學習性來說大勝C/C++(也許是我已經學過C了吧)
但是很多時候沒有pointer可以用真的有點煩
(你一定還不知道pointer是啥......
在板上或C板/pointer就可以感覺到他的威力和有點複雜性,
C想要算的有效率大概難以避免的要用到它)
而且python中對結構變數的call by value/reference初學者(我)常常弄不清楚
但是它大部分的語法很直覺,且list、dictionary的設計真的非常有用
在資料結構這部分可以省下很多功夫
而且python有一些不錯的module可以import來在各方面幫助你(和C的include差不多)
無論是數學計算相關或輸出相關
計算的部分你估狗照需求找比較實際吧
輸出的部分我推薦matplotlib,覺得它挺好用的
python最重要的特點是它是直譯式語言
也就是說不用整個程式寫完、compile完才能跑
所以可以寫一部份就run起來看看對不對,然後一直往下寫
對開發很方便
不過python的GUI好像不容易寫得很"即時",我常常都弄得頓頓的......
我知道很多物理的模擬程式會用fortran寫,但我沒這方面經驗
我猜想你學fortran的話會比較容易找到"同一主題"前人現成的成果
這點大概是最大的優勢吧
不過現在就算是在學界fortran似乎也在往下(只是感覺),用的人漸少
如果你要算的東西非常非常計算demanding,且能切開平行跑
而你又不可能去找超級電腦或工作站跑程式
一個可能的做法是去學CUDA,天體、原子第一原理計算等等的物理模擬我看過人用它
大致就是利用Nvidia的高階顯卡強大的計算能力來計算
如果你的問題適合它的特性,程式又寫得好,
動輒能跑得比用CPU計算快上百倍,而且硬體又相對很便宜
這語言我不會,詳細也請你估狗
小弟所知有限,希望這些有幫到你
如果有錯誤也請板上任何一位大大盡量指證
小弟也能更正正確的觀念
※ 引述《famayo (砝碼)》之銘言:
: 因為最近開始想學程式語言
: 但是苦不知該從哪種語言開始下手
: 於是就想到了最耳熟能想的C++
: 但是又聽到有些人說C++ 是比較舊的語言
: (我也不知有什麼是新的= =)
: 因此我想問問 C++能做的事情應該很多吧?
: 譬如說現在有哪些系統是用C++開發的呢
: 臉書 無名小站是嗎?
: 還有就是 假設我要做物理的數值模擬
: 用C++適當嗎? 因為覺得它應該比fortran matlab來得多用途
: 如果C++不是各位最推薦的語言
: 那麼哪總才最推薦呢 (數值模擬為主 搞不好還有其他需求)
: 感謝各位解惑
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 202.39.60.73
推 bill42362:推 CUDA 我做模擬心臟的 改寫成 CUDA 快了至少 100 倍 04/20 10:11
→ bill42362:還沒用到 share memory 喔~兩年畢業變成兩禮拜畢業 XDD 04/20 10:12
→ leiyan:matlab好像後來也支援cuda 04/20 10:14
→ kdjf:matlab的數學還有可能比自己刻快喔XD 不過很貴是真的 04/20 11:57
→ kdjf:C(++)快歸快,可是要自己處理一些不是很重要的東西 04/20 11:58
→ diabloevagto:要用matlab就要用矩陣運算,在矩陣運算加速很多 04/20 11:59
→ diabloevagto:將矩陣改成for雖然一樣能算,但就是慢很多 04/20 11:59
→ kdjf:是說matlab有提供C library,也可以試試看 04/20 11:59
→ bugmens:我看網頁說Octave就跟matlab功能相同 04/20 12:28
→ bugmens:為什麼Octave不比matlab出名 04/20 12:29
推 famayo:感謝原po 我除了算第一原理 也需要處理一些金融的數據 04/20 13:23
→ famayo:但其實第一原理已經有vasp這套裝軟體可以算 04/20 13:24
→ famayo:我大概只會做它輸出的數據處裡 04/20 13:24
→ famayo:主要也是想學以後可以有別的用處的語言 04/20 13:24
→ diabloevagto:沒聽過octave不過matlab出名是因為他很多寫好的fun 04/20 13:35
→ diabloevagto:幾乎你想的到的matlab都已經有現成的能用 04/20 13:35
→ angleevil:我的潛見是,那麼愛快...就用組語吧,cc 04/20 13:52
→ WeBurn:CUDA不能算是一種語言 因為他要與其他語言綁定 04/20 14:39
→ WeBurn:概念上,CUDA是XX語言的延申 04/20 14:40
→ WeBurn:XX可以為C/C++,fortran,JAVA...etc 04/20 14:40
推 maplefog:推matlab的C library,計算矩陣複數超快 04/20 22:01
→ uranusjr:Python 只有 call by reference, 不過這離題了... 04/20 22:29
→ s3748679:<~之所以聽過Octave是因為matlab要$$ 04/20 23:16
→ legnaleurc:python 是 pass by value ... 04/20 23:53
→ kdjf:octave真的比較慢XD 不過應該會越來越好 04/21 01:49
推 forloricever:把 octave link MKL 或 ACML 就沒差多少了 04/21 08:42
→ forloricever:MATLAB 快很多是因為他都幫你 link 好 04/21 08:43
→ MOONRAKER:Matlab比較有名是一定的,這就像AutoCAD很有名一樣 04/21 11:10
→ MOONRAKER:(有名到大家都在當土海盜) 04/21 11:10