
發布
注冊
/
登錄Mathematica代碼的案例
10個編寫快速運行的Mathematica代碼的小訣竅
02
學會Compile
Compile函數接受Mathematica的代碼,并讓你預先聲明輸入參數的類型(比如實數、復數等)和結構(如數值、列表、矩陣等)。這雖然失去了Mathematica語言靈活性的優勢,但是可以免于擔心類似于“如果參數是符號怎么辦?”的問題,Mathematica也可以最優化程序并創建一個字節碼在虛擬器上運行。并不是所有東西都可以被編譯,且簡單的代碼可能不會有太大效果,但是那種復雜的低階數字代碼速度可以得到大大的提升。
使用Compile可以比Function的運行速度提高80倍。
但是我們可以在Compile函數中加入一些代碼的可并行性質,這樣可以生成更好的結果。
在我的雙核處理器電腦上,我的運行結果比原本快150倍,如果是多核處理器那么效果會更加明顯。
但是要注意,很多Mathematica函數比如Table、Plot、NIntegrate等會自動編譯它們的參數,這樣的話你使用上述方法可能不會看到任何速度上的提升。
02.5
使用Compile生成C代碼
另外,如果你的代碼可編譯,你還可以使用選項CompilationTarget->“C”來生成C代碼,調用你的C編碼器并將其匯編成一個DLL,并把這個DLL鏈接回Mathematica,都是自動操作的。在編譯階段,DLL直接在CPU上運行而非Mathematica的虛擬器,所以會更快得到結果。
03
使用內置函數
Mathematica有很多函數。起碼半數以上的人可能不會坐下來學習所有函數。
展開 10個編寫快速運行的Mathematica代碼的小訣竅
當我聽到人們說Mathematica不夠快的時候,我通常會提出想要看一下這段令他們煩惱的代碼,然后會發現,其實并不是Mathematica本身的表現不夠好,而是Mathematica沒有被最優使用。我覺得我應該和大家分享一下我在優化Mathematica代碼時首先會看的一些內容。
01
如果可以的話盡量盡早使用浮點數
我最常看到的導致代碼變慢的問題是,程序員會不經意地讓Mathematica做超出需要的細致的事情。沒必要的代數精確是其中最常見的問題。
在多數與數字相關的軟件中,是不需要這么精確的代數的。1/3和0.33333333333333是一樣的。當你碰到特別嚴重的在數字上不穩定的問題時這個差異可能會被放大的特別明顯,但是,在大多數情況中,浮點數已經足夠使用了,而且最重要的是,浮點數運算更快。Mathematica中,任何小于16位的小數都被看作是機器浮點數,所以如果更想要速度而可以舍棄一些精確性的時候,記得用小數(比如,三分之一輸入為1./3.)。以下是一個例子,可以看到使用浮點數是精確數運行速度的50.6倍。在這個例子中,兩個數字的使用得到的是同一個結果。
在符號運算中也是這樣。如果你不是很在意符號式的結果,并且計算的穩定性也不是問題的話,那么盡快使用數值作為替代。比如,求解下面的二項式符號計算時,在使用數值作為替代之前,這個代碼可能會讓Mathematica生成長達五頁的中間符號表達式。
展開 為什么 Mathematica 用戶會關心R?
某些特定庫(BLAS/LAPACK、GMP 等)的鏈接最終成為 Mathematica 中的核心基礎設施組件。
R 代碼不會處理符號參數或高精度數字,因此,為了穩健性,您需要比使用Mathematica代碼更仔細地進行類型檢查。
LS-DYNA | 磨料水射流破巖
水下爆炸 | 水下爆炸載荷對目標作用的數值模擬
爆炸與沖擊 | 分享一些我最近做的案例
Python | 破片戰斗部對某導彈陣地的毀傷效果
LS-DYNA | 使用Python批量輔助LS-DYNA的結構設計
Mathematica五行代碼實現豆瓣評分的爬蟲
PyQt | 戰斗部毀傷效能評估軟件的設計與開發
爬蟲+游戲 | Mathematica有趣實例

LS-DYNA | 自然破片戰斗部
水下爆炸 | 水下爆炸載荷對目標作用的數值模擬
爆炸與沖擊 | 分享一些我最近做的案例
Python | 破片戰斗部對某導彈陣地的毀傷效果
LS-DYNA | 使用Python批量輔助LS-DYNA的結構設計
Mathematica五行代碼實現豆瓣評分的爬蟲
PyQt | 戰斗部毀傷效能評估軟件的設計與開發
爬蟲+游戲 | Mathematica有趣實例
LS-DYNA | 內彈道彈丸發射
水下爆炸 | 水下爆炸載荷對目標作用的數值模擬
爆炸與沖擊 | 分享一些我最近做的案例
Python | 破片戰斗部對某導彈陣地的毀傷效果
LS-DYNA | 使用Python批量輔助LS-DYNA的結構設計
Mathematica五行代碼實現豆瓣評分的爬蟲
PyQt | 戰斗部毀傷效能評估軟件的設計與開發
爬蟲+游戲 | Mathematica有趣實例
LS-DYNA | 模擬水的浮力
水下爆炸 | 水下爆炸載荷對目標作用的數值模擬
爆炸與沖擊 | 分享一些我最近做的案例
Python | 破片戰斗部對某導彈陣地的毀傷效果
LS-DYNA | 使用Python批量輔助LS-DYNA的結構設計
Mathematica五行代碼實現豆瓣評分的爬蟲
PyQt | 戰斗部毀傷效能評估軟件的設計與開發
爬蟲+游戲 | Mathematica有趣實例
LS-DYNA | 寫漢字“戰斗部”
水下爆炸 | 水下爆炸載荷對目標作用的數值模擬
爆炸與沖擊 | 分享一些我最近做的案例
Python | 破片戰斗部對某導彈陣地的毀傷效果
LS-DYNA | 使用Python批量輔助LS-DYNA的結構設計
Mathematica五行代碼實現豆瓣評分的爬蟲
PyQt | 戰斗部毀傷效能評估軟件的設計與開發
爬蟲+游戲 | Mathematica有趣實例
LS-DYNA | 外界載荷作用下炸藥內孔洞坍塌
水下爆炸 | 水下爆炸載荷對目標作用的數值模擬
爆炸與沖擊 | 分享一些我最近做的案例
Python | 破片戰斗部對某導彈陣地的毀傷效果
LS-DYNA | 使用Python批量輔助LS-DYNA的結構設計
Mathematica五行代碼實現豆瓣評分的爬蟲
PyQt | 戰斗部毀傷效能評估軟件的設計與開發
爬蟲+游戲 | Mathematica有趣實例
LS-DYNA | 基于Python的自然破片戰斗部二次開發
水下爆炸 | 水下爆炸載荷對目標作用的數值模擬
爆炸與沖擊 | 分享一些我最近做的案例
Python | 破片戰斗部對某導彈陣地的毀傷效果
LS-DYNA | 使用Python批量輔助LS-DYNA的結構設計
Mathematica五行代碼實現豆瓣評分的爬蟲
PyQt | 戰斗部毀傷效能評估軟件的設計與開發
爬蟲+游戲 | Mathematica有趣實例
Mathematica培養計算思維@Torrey Pines 高中
隨著出席率的提高, 俱樂部成員開始在數學課上使用他們的Mathematica知識。學生們開始邀請朋友加入俱樂部, 兩名俱樂部成員甚至參加了Wolfram高中夏令營, 在暑假期間進一步參與Mathematica的學習和應用。
CT@TP:學生們的故事
上圖從右至左:Abby Brown, Shannon Brownlee 和 Emily Zhang 在2018年Wolfram 技術大會上演講。
Emily Zhang是CT@TP的成員之一, 通過Abby的微積分課認識了Mathematica。她決定在她的畢業課題中運用她在CT@TP中學到的計算思維和 Wolfram 語言技能。
Emily 想在這個課題中運用三重積分。她最終決定模擬山體,創建了圣海倫山、珠穆朗瑪峰和富士山的不同三維模型。
圣海倫山
珠穆朗瑪峰
富士山
Shannon Brownlee最初是Girls Who Code的成員, 但她覺得乏味后來退出了。她在三年級上Abby的數學課時開始學習Mathematica,并決定加入CT@TP來再次學習如何寫代碼。
學習如何用Mathematica寫代碼很順利,Shannon還把它用在了微積分3課程的期末課題上。
展開 
用 Mathematica 中的阿基米德螺線和復雜代數分析太空中雜耍的模式
人體轉動慣量
在我第一次拋物線飛行之前,我寫了一個 Mathematica 代碼來計算人體在不同位置的主要轉動慣量。概述其中一些研究的文章稱為“失重中人體的編舞技術”。下圖是使用該筆記本生成的。
知道主軸很有用,因為最大和最小軸向我們展示了我們可以穩定旋轉的軸。如果系統沒有簡并性,這些是身體可以穩定旋轉的唯一軸。通過構造轉動慣量張量(繞物體質心)來找到軸,然后找到特征值和特征向量。
在上面的圖中,藍色和紅色箭頭分別表示的最大和最小軸。如果身體的總角動量與這些軸之一對齊,則身體將穩定旋轉并且不會擺動。我發現有趣的是,身體可以圍繞腹部旋轉,有點像通過圍繞藍色軸旋轉的側手翻。
在失重狀態下扔球
下一個需要了解的細節是,當一個球在失重狀態下投擲時,它沿直線而不是拋物線運動。
我們可以將這兩條信息放在一起,考慮到一個人可以以側手翻的方式旋轉并將球扔給自己。更有趣的是,我們知道球在慣性空間中沿直線運動,但它們在旋轉坐標系中的運動路徑是什么?雜耍人看到了什么?
首先,我們需要一個表示雜耍人脊柱方向的函數。假設從頭部到沿脊柱的位置以及雜耍者的雙手之間的距離為 A。我們也可以說雜耍者以角速度 ω 旋轉。因此
我們想知道從點 f[t] 到手的位置的偏移量,我們可以縮放和旋轉 f[t] 來簡化。
記住,任何復數向量乘以一個單位復數會旋轉它,旋轉角度是正實軸和這個向量的夾角。在 Mathematica 中,如果您有一個單位復向量,您可以計算這個向量的 Arg,它會告訴您旋轉角度是多少。
展開 從 Python 遷移到 Wolfram 語言的經驗教訓
我記得有很多學生在這門本科計算機科學課程中忘記提交他們項目的討論部分,因為它是獨立于 Python 和 R 代碼的文檔。
Mathematica 在 notebook 界面中集成了代碼和排版,可以幫助防止諸如討論部分未附加到項目代碼中的問題。此外,Mathematica 現在支持的一個重要功能是 Mathematica Online的集成,它使用 Wolfram Cloud。許多大學和學院現在都支持 Mathematica 和 Mathematica Online。這讓您和其他人可以通過 Web 瀏覽器、手機或平板電腦訪問它,還可以更輕松地共享和發布文檔。我可以很容易地看到這個作業的新版本:
“使用以下命名約定:Comp_Sci_100_StudentLastName_Proj1.”
將您完成的 Mathematica 筆記本(代碼、結果和討論)分享到*在此處插入教師電子郵件*”
當學生與他們共享筆記本時,教授的 Wolfram Cloud 將發送通知。教職員工可以將筆記本分類到適當的文件夾中,并在準備為作業評分時打開它。
深入了解這些計算的時間和速度
我進行了多個測試來比較 Wolfram 語言和 Python 中不同編程風格的效果來創建這個博客,并將計算分成兩個表。所有這些計算都是在 Mathematica 中執行的,Python 計算是在 Mathematica 中使用 Python 的外部會話執行的。
第一列顯示了我所描述的迭代編程風格的緩慢時間。
展開