Juliaを活用した微積分学
(jverzani.github.io)- 微積分をさまざまな観点から理解できるように支援する学習ノートで、Juliaのわかりやすい文法と計算能力をグラフ・数値実験に活用している
- Harvard流の rule of four の流れに沿って、グラフ、数値、代数、言語的観点をあわせて扱いつつ、Juliaでは主にグラフ・数値・一部の代数的側面を示している
- Mathematica、Maple、Sage のような コンピュータ代数システム が記号処理に強い一方で、このノートでは Julia を数値計算中心のツールとして位置づけ、必要な代数処理を補っている
- 学習者はインストール・インターフェース案内に従って環境を準備し、
CalculusWithJuliaパッケージで反復作業や共通関数を簡略化できる - 各ページは本の1節のように焦点を絞った概念を扱い、末尾の 自己採点問題 を通じて入門微積分の問題を解くのに必要な計算概念を確認できる
Juliaで微積分を学ぶアプローチ
- Calculus with Julia は、calculus を
Julia言語で学ぶためのノート集である - Julia はオープンソースのプログラミング言語であり、このノートでは 学びやすい文法 と計算機能が微積分学習に適したツールとして使われている
- 学習準備のための文書もあわせて提供されている
- Getting started with Julia: Julia のインストールとユーザー設定の案内
- Julia interfaces: Julia のインストール環境と対話するさまざまな方法の案内
- 1990年代半ば以降、微積分教育では複数の観点を併用しようとする流れがあり、Harvard 式の “rule of four” は、可能な限り グラフ・数値・代数・言語的要素 をあわせて含めることを目指している
- このノートは Julia を通じて、微積分のグラフ的側面と数値的側面、時には代数的側面まで見ていけるように構成されている
コンピュータ代数システムとの違い
- Mathematica、Maple、Sage のような コンピュータ代数システム を微積分学習に統合した事例は多い
- WolframAlpha は Mathematica の機能を呼び出しつつ、柔軟な非形式的文法を許容し、Apple Siri 機能のバックエンドとして使われることもある
- こうしたシステムは学習において代数・記号処理をうまくモデル化し、数値的側面を示す手段も提供する
- 一方でこのノートは、Julia を主に 数値計算ツール として用い、その上に代数・記号処理を追加する形でアプローチしている
- 記号処理を自分の手で直接行う過程は学習に有益でありうるが、コンピュータ代数システムは完成された結果を容易に作れるため、その練習を重複したものに見せてしまうことがある
学習範囲とページ構成
- 目標は、コンピュータ言語の機械的な細部に縛られず、技術を活用して 微積分の概念 にアプローチすることである
- Julia の文法は、電卓を使うより初期参入の難易度が大きく高いわけではなく、それでいて拡張性の高い言語として扱われている
- ノートでは計算概念を限られた集合に絞って扱う
- この集合だけでも微積分の多くの問題を解ける
- プログラミングのさまざまな側面を徹底的に扱うわけではない
- さらに関心のある学習者は Julia を通じて深く探究できる
- この限られた計算概念の中には、微積分計算を
action(function, arguments...)という形の関数呼び出しに還元する演算子が含まれる - 組み合わせ可能な小さな 動作(action) の集まりによって、入門微積分の多くの問題を扱うことができる
- 各ページは本の1節のように、比較的焦点の絞られた1つの概念を中心に構成されている
- ページ末尾には自分で解く問題があり、いずれも限られた数の 自己採点用解答 を持っている
- アイデアは Strang、Knill、Schey、Hass など、Rogawski など、Angenent、複数の Wikipedia ページやその他の出典から得られている
提供資料と実行方法
- ノートには
CalculusWithJuliaJulia パッケージが付属している- 共通作業を簡略化するシンプルな関数群を提供する
- 繰り返し利用する便利なパッケージをロードする
- ノートは Quarto book 形式で提供されており、Quarto の書籍に関する情報は Quarto 文書 で確認できる
- Quarto で PDF ファイルをコンパイルすることはできるが、いくつもの部分を調整する必要があり、結果も最適とは言えず、ファイルサイズもかなり大きい
- PDFバージョンのダウンロード が提供されている
- 貢献は “Edit this page” リンクを通じて、追加トピックの提案、誤りの修正、誤字の修正という形で行え、貢献者は contributors に記録される
- Julia は
juliaupユーティリティで簡単にインストールできる - Web 上で Julia を実行する
binder.orgインスタンスへのリンクも提供されているが、リソース制約がある- SymPy なしのイメージ
- SymPy を含むイメージ、読み込み時間はより長い
1件のコメント
Hacker Newsの意見
自分の子どもが高校2年生になり、SVCを履修するタイミングなので、個人的にはとても適切な資料に見える。
著者がこのスレッドを見ているなら、Pythonの入門を少しやった程度の高校生にも適切かどうかが気になる。
コードの文法に悩むより、問題を自分で解いて基本概念について考えることが重要で、手を動かして練習したほうが内容をよりよく内面化できる。
プログラミング部分は問題ないが、ざっと見る限り、数学の説明はすでに微積分を知っている人でなければ非常に混乱するように書かれていて、学生は実際には説明が不足しているだけなのに、自分は数学が苦手なのだと感じてしまうかもしれない。
たとえば[1]の図は、軸ラベルもないL字型の影付きの箱に曲線が通っており、続いてパラメータ方程式と複数の置換によって部分積分の公式を導いている。
部分積分をよく知っている立場から見ても、公式を導出したり説明したりする方法としてはほぼ最も混乱しやすい部類で、すでに概念を理解している人でなければ図もあまり役に立たない。
James Stewartの『Calculus』のような優れた図解と明快な説明を見たことがあるなら、その対比は非常にはっきりしている。
通常、部分積分の説明は著者と同じく積の微分法から始めるが、まずいくつかの例で積の微分を行い、結果の原始関数の形について直感を作ったうえで、両辺を積分し、積分を分ける形で公式を導出する[2]。
こちらのほうがはるかに明確で追いやすく、実際に学生を助けたいなら、何度も部分積分するときに符号で苦労しないよう、表方式/「DI」法のようなものも教えるほうがよい。
[1] https://jverzani.github.io/CalculusWithJuliaNotes.jl/integra...
[2] 私が学んだときにまとめた導出ノートがここにある。初心者に説明するために書いたものではなく個人ノートだが、それでも上の例よりはずっと追いやすい。 https://publish.obsidian.md/uncarved/3+Resources/Public/Inte...
なので勧めるなら、KleppnerとRamseyのQuick Calculusを見るとよいと言いたい。
初めて触れる概念の直感を作るうえで、私が使ったどの本もこの本には及ばなかった。
それを身につけた後なら良い本なら何でもよく、James Stewartの本も素晴らしいが、分厚すぎるので、1ページ目からすべての問題をやらせるのではなく、適切な読み物と問題を選ぶ参考書のように使うのがよい。
核心は、最初から導関数、積分、極限とは何かという基礎をきちんと押さえることだが、その点ではQuick Calculusが圧倒的だった。
学生がプログラミングに興味があるなら、このJuliaの本や似た本から判断に合う練習問題を選んでStewartを補うのもよいし、望むならPythonで解いても十分だ。
私も同じ年齢のころ、微積分の知識を固める方法としてPythonで数値積分器と記号微分器を実装したが、どちらも有益で楽しかった。
特に記号微分は魔法のように感じられたが、結局はパースを行い、数学で学んだ各規則を次々に追加していく作業だった。
高校時代の最後の2年間で学んだ微積分は、それ以前の学年と同じように、記号を操作するいくつかのアルゴリズムと少しの直感が必要な段階、そして傾きと面積に関するいくつかの事実を学んで文章題を解く、というものだった。
最初に学んだのは、微分アルゴリズムの一部である、x^nの導関数はn x^(n-1)だという規則だった。
大学では同じ科目を解析学と呼び、さまざまな概念を定義してその性質を証明する内容だった。
こうした授業は概ね、数列・級数と極限への収束、関数の連続性と関数の極限、微分と積分およびおそらくTaylorの定理の一部、という三部構成に従う。
Cauchyが教科書で多くの「現代的」な定義を導入して以来、この構成は大きく変わっておらず、明らかな例外はRiemann積分として知られる積分くらいだ。
このコースがどの種類なのかは分からないが、極限から始まっているので後者に近い可能性があり、その場合Juliaがどれほど役に立つのかはよく分からない。
適合性を考えるうえでの核心は、プログラミングよりも数学的成熟度を要求し得る点にあるように思う。
ここでいう数学的成熟度とは、厳密な定義と抽象概念を扱いながら誤った結論を大量に引き出さず、数学的証明という形の論証を追える能力に近い。
本を少しあちこち拾い読みしてみたが面白く、子どもたちにこういう方法で微積分を学ぶよう勧めてもよさそうだと感じた
ただ、序文の最初の段落にある「Juliaは学びやすい構文を備えたオープンソースのプログラミング言語であり、この作業に適している」という言葉が気になった
なぜ Julia は他の言語より適しているのか?
標準的な数学表記のように変数の前にスカラーを置くと暗黙に乗算になり、たとえばxが2なら3xは6と評価される
Unicode対応も豊富で、∈や∉のような演算子は少しやりすぎに見えるかもしれないが期待どおりに動作し、πは事前定義されていて、しかも無理数型であり、√も演算子として使えるので√2は有効な式として浮動小数点値になる
Juliaはこうした構文をサポートするだけでなく、簡単に入力する方法も提供している
微積分とは少し関係が薄いが、ベクトルと行列が第一級のデータ型なので、Pythonよりも入力しやすく、見た目にも把握しやすい
m = [1 2 3; 4 5 6; 7 8 9]とm = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]の違いである転置は1文字の演算子
'ででき、内積はドット演算子m ⋅ nで可能で、A\bもMatlabのように動作するまたブロードキャストをサポートし、内包表記もあるが、個人的にはブロードキャストのおかげで内包表記の必要性は少なかった
有理数も組み込みで、
1//2のような非常に単純な構文を使う主な「競合」であるPythonは、数学演算の構文が良くないことで有名で、標準ライブラリの数学サポートも小さく、型システムは限定的で、実行性能も非常に悪い
Juliaはこうした問題を解決しつつ、比較的読みやすい言語を提供し、数学表記としばしばよく似ており、性能もかなり良い
f’やf’’のような手書き表記を可能にする後置表記機能など、一部のJuliaの機能は興味深かった個人的な経験では、最高の「微積分の本」はJuliaではなくHaskellを使い、グラフ描画用ライブラリだけに依存する Learn Physics with Functional Programming だと思う
https://www.lpfp.io/
Juliaは「数学のためのプログラミング言語」として知られており、その方向性が開発の多くを導いてきた
明示的には、手書きやLaTeX記号に合う多くの数学表記をサポートしている
暗黙的には、Python風に単純化された構文、広範な相互運用性、このチュートリアルで多くの処理を任せているSymPyの活用、組み込みの並列計算プリミティブ、そして高速な反復と探索を可能にするJITコンパイルを指しているように思う
https://computationalthinking.mit.edu/Spring21/
ごく短く言えば、Pythonとある程度似ていて同じように書きやすいが、数学を直接表現する構文がはるかに豊富な言語である
ノートブックもより豊かだ
核心的な違いは、Pythonのノートブックではセルを実行するのに対し、Juliaのノートブックは依存関係のようなものを処理する点である
xを数値やスライダーに変えると、依存しているものがすべて更新される
グラフを定義してスライダーを追加すれば、そのまま動作する
私もJuliaの専門家ではなく、ほとんどはPythonとJavaScriptで作業しているが、似たような授業では上の2点が非常にはっきり表れる
そこに非常によく使われるUnicode対応があり、多くの場合、意図的に擬似コードのように見せることができる
興味深いことに、MLを学びたくて最近、数学、つまり線形代数・微積分・統計を学び直し始めた
いろいろな内容を学ぶ間、簡単なPython実装も一緒に試しているのだが、恥ずかしながら以前はPythonを使ったことがなかった
ベクトルを回転させたり、matplotlibで関数を描画できたりするのはかなり良い
手でも描けるが、あれほどきれいには描けない
こういう課程を設計するときは少し注意が必要だ
おおむね、すでに微積分とプログラミングの両方をある程度知っている人にとって最も興味深い可能性が高く、本来想定される対象である、そのどちらか一方を学ぶ人は、こうした授業を受け入れる準備がまだ整っていないかもしれない
個人的に、微積分の授業にMaximaやSagemathのような少し風変わりなコンピュータ代数システムを入れてみようとしたときの反応は、よくても生ぬるいものだった
問題の一部は、1年生がコンピュータサイエンスの授業でもない科目のためにソフトウェアをインストールすることに、あまり関心がない点だったと思う
ただ、もう少し高いレベルの授業では選択要素としてかなりうまく機能し得るし、常微分方程式の授業でPythonプロジェクトによって非常に良い結果を得た
Pythonがニッチな言語ではないことも、確かに助けになった
それでも結局、その挑戦を引き受ける価値はあり、すべてを手計算して表から値を探させるよりは良いと思う
参考資料は何だったのか、講義ノート・コード・スライド・本など、何でも共有してもらえるとうれしい
関連して、Emacsを使っているなら、コンピュータ代数をサポートするCalcパッケージがある
最近、Calcをずっと使いやすくするインターフェースを公開し、ここに記事を書いた
http://yummymelon.com/devnull/mathing-in-emacs-with-casual.h...
https://www.emacswiki.org/emacs/MaximaMode
コンセプトは気に入っている
ただ、こういう資料は MOOCulus のようなものの上に作られているか、そこから出発していたら、ずっと良かっただろうと思う
https://ximera.osu.edu/mooculus/calculus1
全体としては MOOCulus のほうが好み
それでも Calculus with Julia が付け加えている価値は大きい
何らかの形で両者を統合できるとよいと思う
MOOCulus の肝は、文章の品質がより高く、はるかに冗長でなく、統合された演習問題のおかげで学生が内容を丁寧に追っていく点にある
授業でも広く使われており、かなり磨き込まれてもいる
フォークして Julia を補強すれば非常に大きな改善になるだろうし、応用例を追加しても同じだと思う
さらに、最初にクリックした「Equal or Not?」にも誤りがある
Maxima と Gnuplot、そして付属ドキュメントの組み合わせもかなり良い
Maxima については、かなり完成度の高い PDF の入門書/ガイドもあったと記憶している
Matlab を使っていた人にとって、Julia は有効な代替になり得るだろうか?
詳しい違いは https://docs.julialang.org/en/v1/manual/noteworthy-differenc... を見ればよい
地獄にいる人に氷水を一杯差し出すようなものだ
Steve Jobs が Windows 版 iTunes について言った言葉を借りればそういうことで、もちろん当時の iTunes は後にそうなったようなめちゃくちゃな状態ではなかった
Cleve Moler と Matlab が成し遂げたこと、特に LINPACK や EISPACK などを簡単に利用できるようにした点には大きな敬意を払っている
当初は行列という単一のデータ型しかなかった制約を克服しようとも大いに努力していた
しかし Julia は、現代的な汎用言語として作業がはるかに快適でありながら、Matlab の力をほぼすべて保っている
はるかに速く、一般にプログラミング言語としてより優れた機能が多く、並列化もずっと簡単
両方を仕事で使ってきた立場からは、今日では概して Julia のほうが良い選択だと言える
ただし Matlab や Stata のような言語には、すでに実装済みの既存アルゴリズムが非常に多く、Julia に対応する実装がない場合もある
求めているものがその一つなら、別の言語を使うことを正当化しにくい場合が多い
実際には、Matlab/Python/Stata のコードを Julia に移す作業は、たいていかなり簡単だった
Julia のコードは Matlab のコードよりずっと見やすく、性能もはるかに高くなり得る
そうでなければ、Julia は使い心地が良く、十分な代替になるだろう
構文はある程度似ており、MATLAB の配列まわりの便利機能も多く備えている
そのうえ、優れた型システムとはるかに良い汎用プログラミング機能を提供しており、たとえば関数の置き場所のようなものが妙な振る舞いをしない
実際に使ってみることを勧める
ページヘッダーの PDF リンクが 404 になっている
「このノートは Quarto を通じて PDF ファイルにコンパイルできる。出力はかなり大きいため、ダウンロード用のファイルは提供していない。関心のある読者はリポジトリを取得し、環境をインスタンス化したうえで、quarto サブディレクトリで quarto を実行して PDF としてレンダリングすれば、そのファイルが生成される。少し時間がかかる」
「計算とは、できるだけ長く抗うべき誘惑である」
— J.P. Boyd