常用數學軟件介紹(二)

序言

在處理很多數學問題的時,有時候需要利用一些數學軟件來檢驗或者是測試自己的想法、處理方式是否正確,而這裡就大致簡單總結一下常用的數學軟件。數學軟件是用來建模、分析、計算各種數學資料,包括數值、符號、幾何資料等之電腦軟件。

以下是我們總結的一些常用的數學軟件,至於那些少許專業用戶的數學軟件,我會在最後略微有點說說吧。

Julia

常用數學軟件介紹(二)

Julia 是一種高級通用動態編程語言,它最初是為了滿足高性能數值分析和計算科學的需要而設計的,不需要編譯器速度快,也可用於客戶端和服務器的Web用途、低級系統編程或用作規約語言。

Julia設計的獨特之處包括,參數多態的類型系統,完全動態語言中的類型,以及它多分派的核心編程範型。它允許併發、並行和分佈式計算,並直接調用C和Fortran庫而不使用粘合代碼。

Julia擁有垃圾回收機制,使用及早求值,包含了用於浮點計算、線性代數、隨機數生成和正則表達式匹配的高效庫。有許多庫可以使用,其中一些(如用於快速傅里葉變換的庫)已經預先捆綁在Julia裡。

鑑於大家想要一個不要錢的數學軟件,沒錯的,這個Julia就是不要錢,而且她的源程序都在 [github](https://github.com/JuliaLang/julia)上,你可以自己瀏覽,以及自己編譯。因為,Julia是免費的、開源的!

主要用於數值計算

  • 核心語言非常小。標準庫用的是Julia語言本身寫的
  • 調用許多其它成熟的高性能基礎代碼。如線性代數、隨機數生成、快速傅里葉變換、字符串處理。
  • 豐富的用於創建或描述對象的類型語法
  • 高性能,接近於靜態編譯型語言。包括用戶自定義類型等
  • 為並行計算和分佈式計算而設計
  • 輕量級協程
  • 優雅的可擴展的類型轉換/提升
  • 支持Unicode,包括但不限於UTF-8
  • 可直接調用C函數(不需要包裝或是藉助特殊的API)
  • 有類似shell的進程管理能力
  • 有類似Lisp的宏以及其它元編程工具
  • 可與jupyter notebook 一起使用

為什麼我們要創造Julia

簡短來講,是因為我們很貪婪。

我們之中有些是使用MATLAB的重量級用戶,有些是來自Lisp的極客,還有一些是來自Python和Ruby的魔法師,甚至還有來自Perl社區的大魔法師。我們之中還有從鬍子都沒長齊時就開始使用Mathematica的。其中的有些人現在都沒長鬍子!我們像是瘋了一樣用R畫了越來越多的圖,而C是我們的硬核搖滾(也有大殺器之意)。

我們熱愛所有這些語言,他們實在很好很強大。在我們從事的領域(科學計算,機器學習,數據挖掘,大規模線性代數計算,分佈式和並行計算)中,每一種語言都對某一項工作的一項特定需求非常完美,但是卻無法勝任其它需求。於是使用什麼語言都需要我們去權衡。

而我們很貪婪,我們還想要更多。

我們想要的是一個自由開源的語言,並且它同時擁有C的速度和Ruby的動態性;我們想要一個具有同像性(可以將語言的腳本本身當作數據進行處理)的語言,它有著真正的和lisp一樣的宏,但是卻像Matlab一樣有著顯然的,類似於數學表達式的標記;我們想要一個既可以像Python一樣作為通用編程語言的工具,又可以像R那樣適用於統計分析,能像Perl那樣自然地處理字符串,能像Matlab那樣給力地處理矩陣運算,它還要能像shell一樣作為膠水將各種程序粘合在一起;我們想要一個簡單易學的語言,同時它還能讓最苛刻的魔法師們(hackers)開心。我們希望它是交互式的,但我們也希望它能被編譯。

(我們剛剛有提它要和C一樣快嘛?!)

當我們在構思這些需求的時候,我們發現它還得有Hadoop這樣強大的分佈式能力,卻不想要Hadoop裡面那些冗長Jave和XML模板,更不想被被迫在幾個GB的日誌文件和幾百臺機器裡找bug。我們不想要那些令人費解的層次結構。我們想讓簡單的標量循環能被編譯成僅用寄存器和一塊CPU的乾淨的機器碼。我們希望簡單地寫下A*B就能夠在成千上萬的機器上用成千上萬地運算來計算這個龐大的矩陣乘法。

如無必要,那就不用聲明類型。但當我們需要多態函數(polymorphic functions)時,我們也想要用泛型編程(generic programming)僅僅書寫一次算法,就能夠在無限多的類型上使用。我們想要多重派發(multiple dispatch)來為一個函數所有可能的參數選出最佳的執行方法。這些參數可能有著不同定義,不同類型,但是卻有著相同功能。在擁有以上能力的同時,我們還希望這種語言簡單,乾淨。

要求有點多,是不是?

儘管我們意識到了自己有多貪心,我們還是想要擁有這些功能。大概在兩年半之前,我們開始創造這種能滿足我們貪念的語言。它還沒有完工——但是已經可以發佈一個1.0版本了(其實等了6年才要發佈)——我們創造的這個語言叫做Julia。它已經實現了我們這次亂七八糟需求的90%,而現在她需要來自更多人的亂七八糟的需求,來讓她走得更遠。

R語言

常用數學軟件介紹(二)

一種自由軟件編程語言與操作環境,主要用於統計分析、繪圖、數據挖掘。R本來是由來自新西蘭奧克蘭大學的羅斯·伊哈卡和羅伯特·杰特曼開發(也因此稱為R),現在由“R開發核心團隊”負責開發。R基於S語言的一個GNU計劃項目,所以也可以當作S語言的一種實現,通常用S語言編寫的代碼都可以不作修改的在R環境下運行。R的語法是來自Scheme。

R的源代碼可自由下載使用,亦有已編譯的可執行文件版本可以下載,可在多種平臺下運行,包括UNIX(也包括FreeBSD和Linux)、Windows和MacOS。R主要是以命令行操作,同時有人開發了幾種圖形用戶界面,其中RStudio是最為廣泛使用的集成開發環境。

功能的包

  • R內置多種統計學及數字分析功能。R的功能也可以透過安裝包(Packages,用戶撰寫的功能)增強。因為S的血緣關係,R比其他統計學或數學專用的編程語言有更強的面向對象(面向對象程序設計, S3, S4等)功能。
  • R的另一強項是繪圖功能,製圖具有印刷的素質,也可加入數學符號。
  • 雖然R主要用於統計分析或者開發統計相關的軟件,但也有人用作矩陣計算。其分析速度可媲美專用於矩陣計算的自由軟件GNU Octave和商業軟件MATLAB
  • R的功能能夠透過由用戶撰寫的包增強。增加的功能有特殊的統計技術、繪圖功能,以及編程接口和數據輸出/輸入功能。這些軟件包是由R語言、LaTeX、Java及最常用C語言和Fortran撰寫。下載的可執行文件版本會連同一批核心功能的軟件包,而根據CRAN記錄有七千多種不同的軟件包。其中有幾款較為常用,例如用於經濟計量、財經分析、人文科學與社會科學研究以及人工智能

GNU Octave

常用數學軟件介紹(二)

GNU Octave是一種採用高級編程語言的主要用於數值分析的軟件。Octave有助於以數值方式解決線性和非線性問題,並使用與MATLAB兼容的語言進行其他數值實驗。它也可以作為面向批處理的語言使用。因為它是GNU計劃的一部分,所以它是GNU通用公共許可證條款下的自由軟件。

Octave是MATLAB的主要自由替代品之一,其他還有Scilab和FreeMat。然而,與Octave相比,Scilab更少強調與MATLAB的(雙向)句法兼容性

產品功能

  • Octave語言是直譯式及結構化(類於第二代的BASIC)的編程語言,支持許多C語言風格的標準函數功能,同時可以使用UNIX的系統調用以進行擴展增進功能,但不支持以引用的方式傳遞參數。
  • Octave的核心由一組內置的(built-in)矩陣運算語言(如四則運算)和可加載函數(Loadable Function)組成(例如求矩陣逆inv),其餘能在核心語言之上實現而且性能開銷不會顯著增加的函數調用則一般以Octave腳本的形式存在(例如求解方程組的fsolve函數)。Octave 解釋器會自動處理各種不同類型的調用。
  • Octave支持數據建構,也支持基本的面向對象編程,但通常仍把它當作面向過程的程序設計語言來看待。
  • 它的語法基本上與Matlab一致,嚴謹編寫的代碼應同時可在Matlab及Octave運行。但若調用了Matlab工具包,則一般不能直接在Octave上運行,因為Octave附帶的工具包與Matlab並不兼容。
  • 由於Octave是以GNU通用公共許可證許可,所以可以自由地複製、流通與使用。Octave可在大部分的類Unix操作系統中運行,亦可在Microsoft Windows中運行。在MacOS中運行也是可能的,但設置較為複雜。

以上三個是免費的、不要錢的數學軟件,偏向於工程計算和數據分析方向,符號處理幾乎沒有的,另外我強烈推薦那個Julia,現在還在學習中的。下一期我繼續推薦其他一些在比如優化建模、數據分析、金融數學、群論等領域,比較特殊的數學軟件。


分享到:


相關文章: