2. 計算はPythonにさせてしまおう¶
Pythonを用いて計算問題をときながら、「Python 勘」を取り戻していきましょう。
今回は、数学や物理を学ぶときにも「Pythonは便利だな」と思わず感じてしまう SymPy と代数計算を紹介します。
2.1. SymPyとは¶
SymPy は、Mathematica や Maple の代替を目指して開発が進められている Python の代数計算ライブラリです。
初歩的な数学の問題を解くときに重宝します。
2.1.1. 準備¶
最初に、SymPy のモジュールをインポートします。
[1]:
from sympy import *
Colab上では、数式をmathjax で表示できるように設定しておくとよいでしょう。
def custom_latex_printer(exp,**options):
from google.colab.output._publish import javascript
url = "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js"
javascript(url=url)
return printing.latex(exp,**options)
init_printing(use_latex="mathjax",latex_printer=custom_latex_printer)
2.2. 代数計算とは¶
代数操作とは、数式を数値として計算することなく、シンボル(代数)の操作として計算することです。
数値計算(従来)
[2]:
x = 1
y = 2
x + y + y + x + x
[2]:
7
代数計算では、変数はシンボルであると宣言します。 すると、変数に数値を代入することなく、シンボルのまま計算されます。
代数計算(SymPy)
[3]:
x = Symbol('x')
y = Symbol('y')
x + y + y + x + x
[3]:
x
もy
も代数式なので、代入されたz
も代数式となります。
[4]:
z = x + y + y + x + x
z
[4]:
また、代数式に対するPythonの演算は、代数操作となります。
[5]:
z ** 2
[5]:
2.2.1. 関数や定数¶
三角関数、 𝜋 などは、SymPyからインポートされたものを用います。
[6]:
sin(pi/3)
[6]:
2.2.2. 数値解の求め方¶
数値解を求めたいときは、float()
を用います。
[7]:
float(sin(pi/3))
[7]:
0.8660254037844386
例題(代数式)
次の式を書いてみよう
\(\sin{x}+\cos{y}\)
\(e^{x}\)
\(\frac{x+xy}{x}\)
[8]:
sin(x)+cos(y)
[8]:
[9]:
E**x
[9]:
[10]:
(x+x*y)/x
[10]:
2.3. 基本的な代数操作¶
数学でおなじみの代数操作(式の変形)を使ってみましょう。
展開 (expand)
因数分解(factor)
簡易化 (symplify)
代入 (substitution)
Pythonは英語
Pythonの関数名やメソッド名は、英語か英語の省略した名称になっています。 英語に強いと意味はすぐにわかりますが、英語だと認識しないとアルファベット列です。 関数を覚えるときは、(辞書で意味を調べて)英単語も同時に覚えるようにしましょう。
準備
x, y, z をシンボルとします。
[11]:
x = Symbol('x')
y = Symbol('y')
z = Symbol('z')
2.3.1. 式の展開¶
式を展開するときは、expand()
を用います。
例. \((x+y)^3\)の展開
[12]:
(x+y)**3
[12]:
[13]:
expand((x+y)**3)
[13]:
三角関数が含まれるときは、trig=True
を追加します。
例. \(cos(x+y)\)
[14]:
expand(cos(x + y), trig=True)
[14]:
部分分数への展開はapart()
を用います。
例. \(\frac{1}{x(x+1)}\)
[15]:
1/(x*(x+1))
[15]:
[16]:
apart(1/(x*(x+1)))
[16]:
2.3.2. 因数分解¶
式を因数分解するときは、factor()
を用います。
例. (受験でお馴染みの)\(x^3+y^3+z^3 - 3xyz\)の因数分解
[17]:
x**3 + y**3 + z**3 - 3*x*y*z
[17]:
[18]:
factor(x**3+y**3+z**3-3*x*y*z)
[18]:
2.3.3. 式の簡略化¶
式を簡易化するときはsimplify()
を用います。
例. \(\frac{x+xy}{x}\) の簡略化
[19]:
simplify((x + x*y)/x)
[19]:
三角関数を含む式を簡略化したいときは、trigsimp()
を用います。
例. \(\cos^2{x}-\sin^2{x}\)
[20]:
trigsimp(cos(x)**2 - sin(x)**2)
[20]:
2.3.4. 式の代入¶
式への代入は、subs()メソッドを用います。
例. \(x^3+y^3+z^3-3xyz\) の\(z\)に1を代入する
[21]:
(x**3+y**3+z**3-3*x*y*z).subs(z, 1)
[21]:
2.4. 方程式の解法¶
solve()
を用いると、方程式の解を求めることができる。
例. \(x^4=1\)のxの解
[22]:
solve(x**4-1, x)
[22]:
[-1, 1, -I, I]
連立方程式は、リストで与えます。
例. 連立方程式 𝑥+5𝑦=2,−3𝑥+6𝑦=15 の解
[23]:
solve([x+5*y-2, -3*x+6*y-15], [x,y])
[23]:
{x: -3, y: 1}
2.5. 初等解析¶
2.5.1. 極限¶
極限は、limit()
を用いて求めることができます。
例. \(\lim_{x \to 0} x^x\)
[24]:
limit(x**x, x, 0)
[24]:
無限大は、oo
と書きます。
例. \(\lim_{x \to \infty} \frac{1}{x}\)
[25]:
limit(1/x, x, oo)
[25]:
2.5.2. 微分¶
微分は、diff()
を用います。
例. :math:`frac{x}{dx}sin{x}`
[26]:
diff(sin(x), x)
[26]:
2.5.3. 積分¶
積分は、integrate(関数, 変数)
によって、初等関数, 特殊関数の積分が可能です。
例 \(\int \log x ~dx\)
[27]:
integrate(log(x), x)
[27]:
例 \(\int_{-\infty}^\infty e^{-x^2} dx\)
[28]:
integrate(exp(-x**2), (x, -oo, oo))
[28]:
2.6. コースワーク¶
Pythonの習得で重要なのは、習ったことを覚えてプログラミングすることではありません。 「こういうことはできるかな?」と調べて、ソースコードを参考にプログラミングすることです。 ぜひ、解いてみましょう。
演習(数式)
\(\int_{-\infty}^\infty \sin{x^2} dx\) を求めよ
\(\int_{0}^\infty (\sqrt{x^2+1}-1)^2 dx\) を求めよ
\(f(x)=\frac{4x^2+2x+1}{x^2+1}\)の極値を求めよ
大学入試の過去問からSymPyで解ける問題を探して解いてみよう
ヒント
色々な解き方があります。
SymPyを使っても解いてみましょう。
どうしても解けなければ、手で解いても構いません