Python 3 で数学を。

Python 3 とライブラリで数学の問題を解いていきます。統計学や機械学習はときどき。

Python (Python 3) で数学をやるにはどうしたらいいか。その10. 代数学超入門。"15歳とFor the crimes of violence against humanity"

このシリーズの過去記事は以下にまとめてある

py3math.hatenablog.com

当記事について

当ブログ筆者 (以下、筆者) も、Python で数学をやるにはどうしたらいいか悩んでいた時期があるから、昔の自分に向けて書いたような記事。

対象とする読者

Python の入門書を一冊か二冊、一通りやった人で、Python の基本的な構文や基本的な用語がだいたいわかっている人。

そして、公式サイトを読む努力をちゃんとする人。

代数学に超入門しよう

5x - 1 ただし、x = 1

という代数の問題がある場合、Python で解くにはどうしたらいいだろうか。

以下ですぐに示すが、まずはちょっとだけ考えてみてほしい。

複雑に考えてはいけない。

シンプルに考えよう。それも、極めてシンプルに。

では、Python の対話モードで示そう (当記事の Python コードはすべて対話モードで、1 例)。

>>> x = 1
>>> x
1

上のように 変数 x に 1 を代入しよう。

そして、そのまま数式にして実行しよう (enter キーや return キーを押すだけだ)。

>>> 5*x - 1
4

どうだったろうか。

驚くほど簡単だったろう。

数式の 5x - 1Python5*x - 1 の違いといえば、* が付くか付かないかといった点くらいだ (だが、この違いは大きいからよく覚えておこう)。

では、どんどんやっていこう。

2p + 11 ただし、p = -6 を上と同じように書いてみよう。

>>> p = -6
>>> 2*p + 11
-1

簡単だ。あまりに簡単過ぎて不安になるくらいだ。

(3/4)(3y - 1)(2y + 4) ただし、y = 3 はどうだろうか。

少し難しそうに見えるがやってみよう。

>>> y = 3
>>> (3/4)*(3*y - 1)*(2*y + 4)
60.0

複雑に見えるかもしれないが、やっていることは同じことだ。

数学のルールとして、(何か)(何か)(何か)(何か) の間には、* があるが、それは省略されていることを思い出そう (この説明の仕方は 1 例で、他にもいろいろな仕方がある)。

x + 2x + 3x - (6/x) ただし、x = 1 はどうだろうか。

x = 1 はすでに代入してある。

>>> x + 2*x + 3*x - (6/x)
0.0

数式が複雑になるとそれだけで難しそうに思えてしまうが、そういうときにはなるべくシンプルに考えよう。

プログラミングでもそれは同じだ。

問題が複雑で大きく思えるときには、シンプルに、そして小さく考えよう。

UNIXという考え方』という有名な本がある。古典的名著だ。『リーダブルコード』という本が、ここ数年、評判がいいが個人的にはまず『UNIXという考え方』を先に読んだほうがいいと思っている。未読の場合は、ぜひ読んでみてほしい。今となっては古くなってしまっているところもたくさんあるが、「考え方」自体は決して古くなってはいない。

さて、今回は、外部ライブラリ (サードパーティ製ライブラリ、パッケージ) の SymPy を使用したいと思う。

マシンに入っていない場合は、pip 等で入れてほしい。

では、SymPy をインポートしよう。

>>> import sympy as sym

これは、わざわざ比較的ちゃんとした日本語に訳せば、"SymPy を sym としてインポートする" といったくらいの意味だ。

ところで、英語はわざわざ上のように比較的ちゃんとした日本語に訳すべきなのだろうか。

モノを書く場合や他者にちゃんと伝えたい場合には、そうすべきだろう。

だが、自分の頭のなかだけで理解できればいい場合は、そうする必要はないだろう。

いわゆる学校英語の弊害かもしれないが、日本人の傾向として、英語を読む際にわざわざ日本語に訳していることが多いと思う。

筆者は、そのようなことをする必要はまったくないと思っている。

英語は英語のまま読めばいいだけだ。

どうしても日本語で理解したい場合、なるべく速く読もう。例えば、"import sympy as sym" なら、"インポートする、sympyを、symとして" というふうに読めば少しは速く読める。

と、いろいろ英語について語ってしまったが、筆者は英語があまり得意ではない。

いわゆるブロークン・イングリッシュだ。

だが、恐れずに使う。

英語の文法や単語の勉強はするべきだが、それよりも大切なことは、"文化"を理解するように努めることだろう。

筆者は、昔、あるアメリカ人にこのようなことを言われたことがある。「お前の英語はほんとに酷い。いや、酷いどころじゃない。でも、意味は俺わかるんだよね。俺が日本人の英語がわからないときって、文法がおかしいとかじゃないんだよね」と。

これは、筆者が、子どもの頃から英米の文学や映画や音楽が好きだったからかもしれない。

ちなみに、子どもの頃から音楽をやっていたから、10代の頃、その界隈で知り合う、いわゆる帰国子女たちから、「お前は、日本で暮らすよりアメリカで暮らしたほうがいいと思うよ。その気があるなら手伝うよ」などとよく言われ、アメリカ移住を奨められたが、何となくいつも断ってしまった。今思えば、移住しておけばよかったかもしれない。

さらにちなみに、筆者の好きなアメリカのエリアは、サンフランシスコのバークレーやその付近だった。

今でも頭のなかにある多くが、そこで生まれた文化からの影響だ。

さて、だいぶ脱線してしまった。SymPy に話を戻そう。

まずは、以下を読んでみてほしい。

>>> x = sym.Symbol('x')
>>> x
x

これは何かというと、'x' を代数で使用する記号とする、といったくらいの意味だ。

複数の文字を記号として使用したい場合には、以下のように書く。

>>> x, y = sym.symbols('x y')
>>> x
x
>>> y
y

上で解いた代数の問題を SymPy でやってみよう。

まず記号を用意する。

>>> p, x, y = sym.symbols('p x y')
>>> p
p
>>> x
x
>>> y
y

早速、式を作成しよう。

ざっと眺めてみてほしい。

>>> expr1 = 5*x - 4
>>> expr1
5*x - 4
>>> print(expr1)
5*x - 4
>>> sym.pprint(expr1)
5⋅x - 4

変数 expr1 というのは、expression の略だ。そして、これからいくつか式を作成するから、便宜的に 1 を付けている。

順に: 変数をそのまま出力。print() で出力。SymPy の pprint() で出力している。

pprint() の出力に注目してほしい。

5⋅x - 4 となっており、これは数式に近い表現だ。

5*x - 4 よりも読みやすいだろう。

次に、変数に数値を代入して、計算結果を出力してみよう。

>>> expr1.subs(x, 1)
1

変数 expr1 に続けて、.subs(x, 1) としている。

これは、変数 expr1 に入っている x に数値の 1 を代入する、といったくらいの意味だ。

どんどん書いてみよう。

>>> expr2 = 2*p + 11
>>> expr2.subs(p, -6)
-1
>>> expr3 = (3/4)*(3*y - 1)*(2*y + 4)
>>> expr3.subs(y, 3)
60.0000000000000
>>> expr4 = x + 2*x + 3*x - (6/x)
>>> expr4.subs(x, 1)
0

さて、上のように 1 つずつ書いていってもいいが、少し楽をするために少しだけ難しいことをしよう。

まず数式をひとつのリストにまとめてみよう。

expressions = [5*x - 4,
               2*p + 11,
               (3/4)*(3*y - 1)*(2*y + 4),
               x + 2*x + 3*x - (6/x)]

次に、記号のリストを作成しよう。

my_symbol_list = [x, p, y, x]

そして、代入する数値のリストも作成しよう。

n_list = [1, -6, 3, 1]

for 文で一気に出力してみよう。

>>> for expr, my_symbol, n in zip(expressions, my_symbol_list, n_list):
...     print(expr.subs(my_symbol, n))
...
1
-1
60.0000000000000
0

上の処理を難し過ぎると感じたら、最初に 1つずつ書いたことをまずは繰り返し書いてみよう。

そして、for 文の仕組みを理解するために、まずはどんな処理でもいいから for 文を書きまくろう。

ぜひ SymPy の公式サイトを読んでみてほしい。まずはチュートリアルを読んで、写経してみよう。

参考文献 (数式を参考)

マンガ 「代数学」超入門 足し算、引き算から2次方程式まで (ブルーバックス)

マンガ 「代数学」超入門 足し算、引き算から2次方程式まで (ブルーバックス)

今回は FIFTEEN というバンドを紹介したいと思う (公式な音源ではないが、以下を聴いて、いいと思ったら正規の音源を探して購入してほしい):

www.youtube.com

FIFTEEN (と CRIMPSHRINE) の Jeff からはほんとうにたくさんの大切なことを学んだ。

(つづく)。