官术网_书友最值得收藏!

1.1 什么是Julia及為什么要使用Julia

Julia是一門非常新的語言,它主要擅長科學計算。開發(fā)Julia,是為了使科學計算更有趣、更高效。在計算機科學家和軟件工程師看來,Julia語言有很多優(yōu)點,你可以在官網(見參考資料[2])上了解這些。

這里援引了Julia的創(chuàng)造者在第一篇官方博客文章《為什么我們創(chuàng)造Julia》(見參考資料[3])中的一段話。

“我們想要一種自由的、開源的語言。它要像C語言(以下簡稱C)一樣快速,同時要有像Ruby那樣的動態(tài)語言的特性;要具有Lisp般的元編程能力而又有MATLAB那樣的數學符號輸入;要像Python般通用、像R般在統(tǒng)計分析上得心應手、像Perl般自然地處理字符串、像MATLAB般有強大的線性代數運算能力、像Shell般具有‘膠水語言’的進程管理能力;它要易于學習而又不讓真正的極客感到無聊;還有,它應該是交互式的,同時又是編譯型的……”

這就是Julia被創(chuàng)造的原因,用來滿足以上所有這些“貪婪的”愿望。

下面我來講講我的故事。在念研究生之前我做了幾年Java開發(fā)工作。我的第一份計算機家庭作業(yè)和課程項目自然是用Java寫的。在此之前,我本科的計算機家庭作業(yè)是用C寫的。上研究生不久,我開始用MATLAB,這主要是因為實驗室的其他研究生都在用MATLAB。我需要向他們學習,所以用了MATLAB。

我喜歡MATLAB。它不像Java和C,不需要在使用之前聲明每一個變量,在MATLAB里,變量可以直接使用。數組也不只是計算機內存里的數組,數組在MATLAB中像向量和矩陣。同時,計算結果繪圖也容易。對建模優(yōu)化問題,我使用GAMS,并與CPLEX這樣的求解器相連。雖然MATLAB-GAMS-CPLEX鏈也能滿足我的需求,但我不喜歡GAMS的語法——當時我不能完全理解這些語法——而且GAMS和MATLAB接口的速度很慢。盡管CPLEX提供與C、Java、Python的全面連接,但它與MATLAB卻只有基本的連接(不夠用)。

當我研究生畢業(yè)時,我認真考慮過是否要使用Python。它過去是,現在仍然是很多計算學家的一個普遍的選擇。CPLEX對Python的支持好過對MATLAB的支持。與MATLAB不同,Python是免費開源軟件。然而,當時我沒有轉向Python,而是決定繼續(xù)使用MATLAB。我個人不喜歡把0作為數組的首索引,就像C和Java里那樣。在Python里,首索引也是0。而在MATLAB里,首索引用的是1。例如,假設我們有這樣一個向量(為盡量保持原書的風格,本書中的矩陣、向量、字典、鏈接、節(jié)點等的名稱的樣式將與原書保持一致)。

在MATLAB里會被記成如下這樣。

向量的首元素應該用v(1)而不是用v(0)來訪問。第i個元素必須是v(i),而不是v(i-1)。因此我繼續(xù)使用MATLAB。

2012年,有人向我介紹Julia語言,它很吸引我,因為至少數組索引是從1開始的。做了一番調查研究后,我當時并沒有轉向Julia。因為它當時對建模和求解器優(yōu)化的支持太爛了。于是我繼續(xù)使用MATLAB。

2014年,我偶爾又讀了幾篇講Julia的博客文章和推特,我又更多地了解了Julia。于是發(fā)現了一個Julia建模優(yōu)化問題的包,叫作JuMP(Julia for Mathematical Programming,即數學編程Julia)。研究了幾個小時之后,我就愛上了JuMP,于是決定轉向Julia,這主要是為了使用JuMP。下面是我解決網絡優(yōu)化問題的部分代碼。

這簡直是下面的數學語言的直接“翻譯”。

其約束條件如下。

我認為這是非常明顯的“翻譯”。特別漂亮,對不對?

CPLEX和它的競品Gurobi通過JuMP與Julia的連接也都很順暢。我還有什么可猶豫的呢?現在,我已經使用Julia這么多年,我仍然熱愛它——我甚至為它寫了本書。

主站蜘蛛池模板: 利辛县| 阿图什市| 河南省| 运城市| 台中市| 中宁县| 中山市| 古田县| 双鸭山市| 邢台市| 栖霞市| 田阳县| 肥乡县| 阿坝| 江源县| 武夷山市| 开鲁县| 赣榆县| 砀山县| 兴山县| 太康县| 新兴县| 内黄县| 濮阳市| 肇州县| 灵璧县| 麦盖提县| 昂仁县| 修文县| 郧西县| 庐江县| 宁陵县| 昆山市| 枣阳市| 吉林市| 黄梅县| 广东省| 汉中市| 介休市| 保康县| 毕节市|