SymPyの使い方#

SymPyとは?#

SymPyはPythonの代数計算ライブラリです。

拡張しやすいように保ちコードのシンプルに保ちつつ、MathematicaやMapleのようなシステムの代替となることを目指しています。

SymPyはすべてPythonで書かれていて外部ライブラリを必要としないことも特徴のひとつです。

「習うより慣れろ」の精神で、徒然なるままに用法を書き下していきます。

SymPyライブラリの読み込み#

SymPyは簡単に使えます。

もし環境に入っていない場合は適当にpipとかしてください。

import sympy

sympy.init_printing(use_unicode=False, wrap_line=True)

四則演算#

加算#

\[ 3+2 \]
3 + 2
../_images/0d59cc93dd8d09d23b8e5836d7b6685b00ee13e0e7bfad89c4327fd8f4992ae0.png

減算#

\[ 3-2 \]
3 - 2
../_images/8a18642cdad2710ffc9682e2118d1d4addafb043ee2084b7448269a123ba400a.png

乗算#

\[ 3\times2 \]
3 * 2
../_images/2cb689bfdc3cb5e00a83fb1c5af46c82c4060bcc257a21e440ed076e24bb3b02.png

除算#

\[ 3\div 2 \]
3 / 2
../_images/6072656098aa14f677fa2a979bff0c50605e2614e1894bc7f8109430d30ce07f.png

分数#

\[ 3\div 2 \]

を分数表記。

sympy.Rational(3, 2)
../_images/c880ad60844e5d4dc8f6619d535459d0852393550acba28e554091ffbce407ca.png

分母#

\[ \frac{3}{2} \]

の分母。

sympy.denom(sympy.Rational(3, 2))
../_images/f5e11ded90125a668db56f82fa7e695d7b9c53aa342e134fad0f8cc1d2fa2f45.png

分子#

\[ \frac{3}{2} \]

の分子。

sympy.numer(sympy.Rational(3, 2))
../_images/6e5dbab2d0f9d7409c3350ef9d4c7c0c6d2a738e48e7d0b9acd54b1bb23630fa.png

冪乗階乗#

冪乗#

\[ 3^2 \]
3**2
../_images/49bbbf57ef45fb65dec3a800a544d65f242cbb8c2b2ec27002003da6797b050b.png

階乗#

\[ 50! \]
sympy.factorial(50)
../_images/0ac16ebea83a76c7802ecdda96accc7347403700e67485b81563c7dc53fd749e.png

二重階乗#

二重階乗とは自然数\(n\)に対し一つ飛ばしに積を取る階乗のこと。
階乗の二回反復合成\((n!)!\)とは異なることに注意。

\[ 50!! \]
sympy.factorial2(50)
../_images/59a81e2da5492a30234c09b724ef348a0dd26efc493515d8dda1d015dff616e9.png

平方根#

\[ \sqrt{50} \]
sympy.sqrt(50)
../_images/63f1b7d418bf7af3f9356bbdd3fa7d03b3e98a72133d808abe9882f46208898a.png

特殊定数#

円周率#

\[ \pi \]
sympy.pi
../_images/1e06f28915a0b09b83d675637f65030a61d6ecde6671ba0c85782288cf8be588.png

ネイピア数#

\[ e \]
sympy.E
../_images/c0932843bf7aafa5e4c69fd852b5e98db8d94f895b676f1cf4014c5e34074867.png

無限大#

\[ \infty \]
sympy.oo
../_images/30d0e163a1ec8edd21877be920d2796b84e3b6303c6e7b4892a25eea717b160f.png

複素数#

虚数単位#

\[ i \]
sympy.I
../_images/7f16a0aba8ebbfdd1dffa0a7c2a32a3cfc8c0568de5e7211f9d2d31291ee8e35.png

複素共役#

\[ \overline{2+3i} \]
sympy.conjugate(2 + 3 * sympy.I)
../_images/26dff902bc88fcf16155467a8622c9be2f15f0a794e109f94443bcc82ba3a7d5.png

実部#

\[ \mathrm{Re}(2+3i) \]
sympy.re(2 + sympy.I * 3)
../_images/f5e11ded90125a668db56f82fa7e695d7b9c53aa342e134fad0f8cc1d2fa2f45.png

虚部#

\[ \mathrm{Im}(2+3i) \]
sympy.im(2 + sympy.I * 3)
../_images/6e5dbab2d0f9d7409c3350ef9d4c7c0c6d2a738e48e7d0b9acd54b1bb23630fa.png

絶対値#

\[ |2+3i| \]
sympy.Abs(2 + sympy.I * 3)
../_images/5bb53d300310af7a78adedb8796d51fd762557b625ac9652acfecb1c17a7ca25.png

偏角#

\[ \mathrm{Arg}(2+3i) \]
sympy.arg(2 + sympy.I * 3)
../_images/dc9ed5e32a6cce6766e93b31e20e9113d5750277683eeb44859c24f843941e7e.png

変数#

変数宣言#

x = sympy.Symbol("x")
y = sympy.Symbol("y")
z = sympy.Symbol("z")
a = sympy.Symbol("a")
b = sympy.Symbol("b")
c = sympy.Symbol("c")

算術演算#

\[ x+y+x-y \]
x + y + x - y
../_images/05cfcb408f3b907c4e4376798d6b24e7917cce83937721c03dfbca9c10cd6811.png
\[ (x+y)^2 \]
(x + y) ** 2
../_images/58c973e713146ffa6582d8f9a2af50efab2dba056e9f1f0830217e7839944770.png

代数操作#

素因数分解#

\[ 10!=2^83^45^27^1 \]
sympy.factorint(sympy.factorial(10))
../_images/3dccbb0f5361a140325872adcae39f8ccf903b12531dc543005667e27cd3de80.png

因数分解#

\[ x^2-4x+3=(x-3)(x-1) \]
sympy.factor(x**2 - 4 * x + 3)
../_images/bcaf451e89752cf692aeca821f24f4c73bb8547aa65e17fb67319421524dac80.png

整数係数上既約の因数分解。

\[ (1+x-x^2)(1-x-x^2)=(x^2-x-1)(x^2+x-1) \]
sympy.factor((1 + x - x**2) * (1 - x - x**2))
../_images/c53f20678b802edc06318a9e161c8a1eb439cce6156af05240df1acc5ed8e416.png

円分多項式上(mod 5で)既約の因数分解。

\[ (1+x-x^2)(1-x-x^2)=(x-2)^2(x+2)^2\:\:\:\mathrm{mod}\:5 \]
sympy.factor((1 + x - x**2) * (1 - x - x**2), modulus=5)
../_images/3c2b4d8da5f671088c06f3b1afee6e210ba08e3b75a31a04cdef65a11673052f.png

簡単化#

\[ \frac{x+xy}{x}=y+1 \]
sympy.simplify((x + x * y) / x)
../_images/5c4eecce557b919eeb285ae03cd7547db5d6a804d9e1df1f19cc956e6d91e977.png
\[ \frac{\sin(x)}{\cos(x)}=\tan(x) \]
sympy.trigsimp(sympy.sin(x) / sympy.cos(x))
../_images/ca96b85cf2cc14fe4a104f86203152e0afe4562499b6c8031e5865969a9fbfd6.png
\[ \sin^2(x)+\cos^2(x)=1 \]
sympy.trigsimp((sympy.sin(a)) ** 2 + (sympy.cos(a)) ** 2)
../_images/8a18642cdad2710ffc9682e2118d1d4addafb043ee2084b7448269a123ba400a.png
\[ \sinh^2(a)+\cosh^2(a)=\cosh(2a) \]
sympy.trigsimp((sympy.sinh(a)) ** 2 + (sympy.cosh(a)) ** 2)
../_images/67693700924be2bdd64d70012e725ecb33e822bab709a24b5a1e0200d0be63c8.png

部分分数分解#

\[ \frac{1}{x^2-4x+3}=-\frac{1}{2(x-1)}+\frac{1}{2(x-3)} \]
sympy.apart(1 / (x**2 - 4 * x + 3))
../_images/248baa01d343d6dcbd6ef49e7071461e13a7cc5dd6a2219a6822a65921793aea.png
\[ \frac{1}{x^6-1}=\frac{x - 2}{6 \left(x^{2} - x + 1\right)} - \frac{x + 2}{6 \left(x^{2} + x + 1\right)} - \frac{1}{6 \left(x + 1\right)} + \frac{1}{6 \left(x - 1\right)} \]
sympy.apart(1 / (x**6 - 1))
../_images/6e348fcd9539190518379b327be3c5a1c7403202cbd1c68ccb3c4b6e822189a5.png

展開#

\[ (x+y)^6=x^{6} + 6 x^{5} y + 15 x^{4} y^{2} + 20 x^{3} y^{3} + 15 x^{2} y^{4} + 6 x y^{5} + y^{6} \]
sympy.expand((x + y) ** 6)
../_images/e5b540c3315b41434f52e5694735ac11ec845fdb708882850f2ab1b05616539d.png
\[ \tan(a+b)=\frac{\tan{\left(a \right)}}{- \tan{\left(a \right)} \tan{\left(b \right)} + 1} + \frac{\tan{\left(b \right)}}{- \tan{\left(a \right)} \tan{\left(b \right)} + 1} \]
sympy.expand(sympy.tan(a + b), trig=True)
../_images/7fbc9e779a056a8d3e37a4bd1907ddfe74f96515963264403623dd6da35013d9.png

通分#

\[ \frac{2x-2}{(x-1)^2(x-2)}=\frac{2}{(x-2)(x-1)} \]
sympy.simplify((2 * x - 2) / ((x - 1) ** 2 * (x - 2)))
../_images/d819142077c8a661bb4909f143206bdfceeb34237262a7d3ed1290fe2f5c0cf1.png
\[ \frac{1}{(x-1)^2}+\frac{1}{(x-1)(x-2)}=\frac{2x-3}{(x-2)(x-1)^2} \]
sympy.simplify(1 / (x - 1) ** 2 + 1 / ((x - 1) * (x - 2)))
../_images/f41460874a5e4c96df9c836b37bcf50a12045b7f7c836745b49d8694af3e07ff.png

通分展開#

\[ \frac{2x-2}{(x-1)^2(x-2)}=\frac{2}{x^2-3x+2} \]
sympy.cancel((2 * x - 2) / ((x - 1) ** 2 * (x - 2)))
../_images/1c248eba3d54d5fc8951d862c3b9d581e7ccd3ecb9e173c0ac461dfcadd97a24.png
\[ \frac{1}{(x-1)^2}+\frac{1}{(x-1)(x-2)}=\frac{2x-3}{x^3-4x^2+5x-2} \]
sympy.cancel(1 / (x - 1) ** 2 + 1 / ((x - 1) * (x - 2)))
../_images/8dfcd2f5f01d485db69807a9b5a93a79f61bb761aa6e9f2ea3fcc9dd377d72cb.png

係数#

\[ (x+y)^6 \]

について\(x^3\)の係数。

sympy.expand((x + y) ** 6).coeff(x, 3)
../_images/0f455c1a35f27a06e45654b8a2db51dd7a8fa35631da33cd11056eba6f232b19.png

代入#

\[ \left. ax^2+bx+c\:\right|_{x=3} \]
(a * x**2 + b * x + c).subs(x, 3)
../_images/6598d129fc4426d34747516612e1d688cd37ea45bfb0e770f5ac18b63eea6e69.png
\[ ax^2+bx+c\:\left|_{x=\frac{-b+\sqrt{b^2-4ac}}{2a}}\right. \]
sympy.expand(
    (a * x**2 + b * x + c).subs(x, (-b + sympy.sqrt(-4 * a * c + b**2)) / (2 * a))
)
../_images/278031471b95362008ac3ceb40572100ef9df468ccfb1c20551362ea0728bfe5.png

総和#

\[ \sum_{x=1}^{10} x \]
sympy.summation(x, (x, 1, 10))
../_images/71619a937abc3abf7540be1d98fe2814361d864a6b9d0dac42bf10b93eafe1c0.png
\[ \sum_{x=1}^a x \]
sympy.factor(sympy.summation(x, (x, 1, a)))
../_images/5f1e423d6e4df3b91c381d1ae5bb96115131d1e6c5c9e0b8664f405c17df376a.png
\[ \sum_{x=1}^a x^3 \]
sympy.factor(sympy.summation(x**3, (x, 1, a)))
../_images/f5ebc48b25d00e7dff78e6ae16dd9b7ee0c7628b40269d872af6484cb4071069.png

総乗#

\[ \prod_{x=1}^{10}x \]
sympy.product(x, (x, 1, 10))
../_images/bc9a2f9eb4405f94721b984de3e16c04213b7640ebec2455dd24babe596c9f38.png

命題論理#

真偽判定#

\[ 0=\sqrt{2}-2^{\frac{1}{2}}\:\:\:? \]
0 == sympy.sqrt(2) - 2 ** (sympy.Rational(1, 2))
True
\[ 0=\sqrt{2}-2^{\frac{1}{3}}\:\:\:? \]
0 == sympy.sqrt(2) - 2 ** (sympy.Rational(1, 3))
False
\[ 10!=\prod_{x=1}^{10}x\:\:\:? \]
sympy.factorial(10) == sympy.product(x, (x, 1, 10))
True
\[ 50!=50\times49!\:\:\:? \]
sympy.factorial(50) == sympy.factorial2(50) * sympy.factorial2(49)
True

ただし数式を適当に処理しないとうまく判定しない場合も多いので注意。
こちらは失敗している例。

\[ x^2-2x+1=(x-1)^2\:\:\:? \]
x**2 - 2 * x + 1 == (x - 1) ** 2
False

例えば明示的に展開操作をすることで正しく真偽判定ができる。

\[ x^2-2x+1=(x-1)^2\:\:\:? \]
x**2 - 2 * x + 1 == sympy.expand((x - 1) ** 2)
True

論理式#

\[ x\land y=\mathrm{True}\:\:\:? \]
sympy.satisfiable(x & y)
{x: True, y: True}
\[ x\land \lnot x =\mathrm{True}\:\:\:? \]
sympy.satisfiable(x & ~x)
False

解析操作#

関数定義#

\[ f(x)=\frac{\log(x+1)}{x} \]
def f(x):
    return sympy.log(1 + x) / x


f(x)
../_images/4bc5e635128a65d6879e26d28c5cd258f83b32a33926de856ecc213b306e8953.png

極限#

\[ \lim_{x\to0}\frac{\sin(x)}{x}=1 \]
sympy.limit(sympy.sin(x) / x, x, 0)
../_images/8a18642cdad2710ffc9682e2118d1d4addafb043ee2084b7448269a123ba400a.png
\[ \lim_{x\to\infty}x=\infty \]
sympy.limit(x, x, sympy.oo)
../_images/30d0e163a1ec8edd21877be920d2796b84e3b6303c6e7b4892a25eea717b160f.png
\[ \lim_{x\to\infty}\frac{1}{x}=0 \]
sympy.limit(1 / x, x, sympy.oo)
../_images/278031471b95362008ac3ceb40572100ef9df468ccfb1c20551362ea0728bfe5.png
\[ \lim_{x\to0}x^x=1 \]
sympy.limit(x**x, x, 0)
../_images/8a18642cdad2710ffc9682e2118d1d4addafb043ee2084b7448269a123ba400a.png

微分#

\[ \frac{\partial}{\partial x}(x+y)^3=3(x+y)^2 \]
sympy.diff((x + y) ** 3, x)
../_images/1577bec05ab0efe9becf3f88c4e0e09f80bd512e9011c4837d0205c83f6ba80a.png
\[ \frac{\partial^2}{\partial y^2}(x+y)^3=6(x+y) \]
sympy.diff((x + y) ** 3, y, 2)
../_images/be0b831bf91b0f0e6e3c00961cf8f5fea8307ec0ab5a6e0470ef7720573156cc.png
\[ \frac{d}{d x}\tan(x)=\tan^2(x)+1 \]
sympy.diff(sympy.tan(x), x)
../_images/be11fbad85c3247b906d8416ae12772fea0f5525d398785f7fe994fce4512534.png
\[ \lim_{y\to0}\frac{\tan(x+y)-\tan(x)}{y}=\tan^2(x)+1 \]
sympy.limit((sympy.tan(x + y) - sympy.tan(x)) / y, y, 0)
../_images/be11fbad85c3247b906d8416ae12772fea0f5525d398785f7fe994fce4512534.png
\[ \frac{d}{dx}f(x)=\frac{d}{dx}\frac{\log(x+1)}{x}=\frac{1}{x(x+1)}-\frac{\log(x+1)}{x^2} \]
sympy.diff(f(x), x, 1)
../_images/cb014db522adfbafffa99be1375ce9b3968186501e3249a8fec0d409eb7c7c15.png

級数展開#

\[ \cos(x)=1 - \frac{x^{2}}{2} + \frac{x^{4}}{24} + O\left(x^{6}\right) \]
sympy.series(sympy.cos(x), x)
../_images/593fb66111df9274dcef4611fe814a5dbb8bc5ab1e955dddf6be1416ba6726d7.png
\[ \frac{1}{\cos(x)}=1 + \frac{x^{2}}{2} + \frac{5 x^{4}}{24} + O\left(x^{6}\right) \]
sympy.series(1 / sympy.cos(x), x)
../_images/76d0a19711c23104331a56f9cb8af0bec26e2fb8dcbbee8020a995189bd7e295.png

先ほどの\(f(x)\)\(x=0\)の周りで7次未満の項まで展開してみる。

\[ f(x)=\frac{\log(x+1)}{x}=1 - \frac{x}{2} + \frac{x^{2}}{3} - \frac{x^{3}}{4} + \frac{x^{4}}{5} - \frac{x^{5}}{6} + \frac{x^{6}}{7} + O\left(x^{7}\right) \]
sympy.series(f(x), x, 0, 7)
../_images/7dcb9acae49d2976abd0e20c64fb920d326067ab5d946af86ebf7dac924a941a.png

積分#

\[ \int(x+y)dx=\frac{x^2}{2}+xy \]
sympy.integrate(x + y, x)
../_images/c70b6ebbef6a4419fb42e262081f5b904903cc97362f4d1cdc1e186c1e178240.png
\[ \int(2x+\sinh(x))dx=x^2+\cosh(x) \]
sympy.integrate(2 * x + sympy.sinh(x), x)
../_images/2260a3ee95f2649c1546e4264973ab240255159ad00dd4d4e0b94442ef82280e.png
\[ \int_0^6(x+y)^3dx=6y^3+54y^2+216y+324 \]
sympy.integrate((x + y) ** 3, (x, 0, 6))
../_images/1b07707e5a65dfd788132c9c383b670e5679efe31a4dfe1ad2c635beb3b641fe.png
\[ \int_{-\infty}^{\infty}e^{-x^2}dx=\sqrt{\pi} \]
sympy.integrate(sympy.exp(-(x**2)), (x, -sympy.oo, sympy.oo))
../_images/894fc3e916baf4b5b0873603ff9d5fa6dc2f0b4a6d21cf6decd0b64252fd9562.png
\[ \int e^{-x^2}\mathrm{erf}(x)dx=\frac{\sqrt{x}\mathrm{erf}^2(x)}{4} \]

(ただし\(\mathrm{erf}\)は誤差関数。)

sympy.integrate(sympy.exp(-(x**2)) * sympy.erf(x), x)
../_images/6668a1e4d11214c35b0e2da5d26a2bcfa3a496837d2463e2b1f3a93fe2587128.png
\[ \int f(x)dx=\int\frac{\log(x+1)}{x}dx=-\mathrm{Li}_2(xe^{i\pi}) \]

(ただし\(\mathrm{Li}_s\)は多重対数関数。)

sympy.integrate(f(x), x)
../_images/fe34a1637cba47aa2fdcbd6b64a790c854f5f7422e158343707e61b0de1dc153.png

代数方程式#

求解#

\[ x^4-1=0 \]

\(x\)について解く。

sympy.solve(x**4 - 1, x)
../_images/092fe294637d34d62afcd0e19cc8cf7f75c090befe11307e9661fbda8c877624.png
\[\begin{split} \left\{ \begin{array}{l} x+5y-2=0\\ -3x+6y-15=0 \end{array} \right. \end{split}\]

を連立させて\((x,y)\)について解く。

sympy.solve([x + 5 * y - 2, -3 * x + 6 * y - 15], [x, y])
../_images/a36612ff869b2fc3b9e605bbba846d4fd721f5e56ff6c9a17a46c67a8b84dee2.png
\[ e^x+1=0 \]

\(x\)について解く。

sympy.solve(sympy.exp(x) + 1, x)
../_images/e6213dd5c6c721aa4df5093d60ae1fa07dec2a53e3fe1c2dd80da52e46bd8e39.png
\[ ax^2+bx+c=0 \]

\(x\)について解く。

sympy.solve(a * x**2 + b * x + c, x)
../_images/0dc087f21c63a4a18bfae5a5e91cb5f398ddc59e151533aa8b964dd85e2b174f.png

等式#

\[ x+1=\frac{x+1}{(x^2+x-2)} \]

\(x\)について解く。
ここでsympy.Eqは第1引数=第2引数の方程式を返す。

equation = sympy.Eq(x + 1, (x + 1) / (x**2 + x - 2))
sympy.solve(equation, x)
../_images/e25271a25076c4dfa4a07438a7b2363d2bfc314072f478c15c0ff9bfef35e091.png
\[ x+1=\frac{x+1}{(x^2+x-2)} \]

の右辺。

equation.rhs
../_images/1790115e38f1e8a041bd1247b9b46e6cbb8d2a32fcf27f7c0aaeb519f694e5e8.png
\[ x+1=\frac{x+1}{(x^2+x-2)} \]

の左辺。

equation.lhs
../_images/f35fe7061f8592e3441815e5fe038ea978a299ee2f51b5344399f2cc2033dfc3.png

線形代数#

行列#

\[\begin{split} \left[ \begin{array}{cc} 1&x\\ y&1 \end{array} \right] \end{split}\]
sympy.Matrix([[1, x], [y, 1]])
\[\begin{split}\displaystyle \left[\begin{matrix}1 & x\\y & 1\end{matrix}\right]\end{split}\]
\[\begin{split} \left[ \begin{array}{cc} 1&x\\ y&1 \end{array} \right]^2=\left[ \begin{array}{cc} xy+1&2x\\ 2y&xy+1 \end{array} \right] \end{split}\]
sympy.Matrix([[1, x], [y, 1]]) ** 2
\[\begin{split}\displaystyle \left[\begin{matrix}x y + 1 & 2 x\\2 y & x y + 1\end{matrix}\right]\end{split}\]

基本操作#

\[\begin{split} \left[ \begin{array}{c} 1&0&1&3\\ 2&3&4&7\\ -1&-3&-3&-4 \end{array} \right] \end{split}\]

の(行)階段形。

sympy.Matrix([[1, 0, 1, 3], [2, 3, 4, 7], [-1, -3, -3, -4]]).rref()
\[\begin{split}\displaystyle \left( \left[\begin{matrix}1 & 0 & 1 & 3\\0 & 1 & \frac{2}{3} & \frac{1}{3}\\0 & 0 & 0 & 0\end{matrix}\right], \ \left( 0, \ 1\right)\right)\end{split}\]

零空間#

\[\begin{split} \mathrm{Ker}\left(\left[ \begin{array}{c} 1&2&3&0&0\\ 4&10&0&0&1 \end{array} \right]\right) \end{split}\]
sympy.Matrix([[1, 2, 3, 0, 0], [4, 10, 0, 0, 1]]).nullspace()
\[\begin{split}\displaystyle \left[ \left[\begin{matrix}-15\\6\\1\\0\\0\end{matrix}\right], \ \left[\begin{matrix}0\\0\\0\\1\\0\end{matrix}\right], \ \left[\begin{matrix}1\\- \frac{1}{2}\\0\\0\\1\end{matrix}\right]\right]\end{split}\]

列空間#

\[\begin{split} \left[ \begin{array}{c} 1&1&2\\ 2&1&3\\ 3&1&4 \end{array} \right] \end{split}\]

の列空間。

sympy.Matrix([[1, 1, 2], [2, 1, 3], [3, 1, 4]]).columnspace()
\[\begin{split}\displaystyle \left[ \left[\begin{matrix}1\\2\\3\end{matrix}\right], \ \left[\begin{matrix}1\\1\\1\end{matrix}\right]\right]\end{split}\]

特性方程式#

\[\begin{split} \left[ \begin{array}{c} 3&-2&4&-2\\ 5&3&-3&-2\\ 5&-2&2&-2\\ 5&-2&-3&3 \end{array} \right] \end{split}\]

の特性方程式。

sympy.factor(
    sympy.Matrix(
        [[3, -2, 4, -2], [5, 3, -3, -2], [5, -2, 2, -2], [5, -2, -3, 3]]
    ).charpoly()
)
../_images/7d5e59be30e8c2a43ca6ecc0ce6afe15745c6c02858dd62568022f832db405a6.png

固有値固有ベクトル#

\[\begin{split} \left[ \begin{array}{c} 3&-2&4&-2\\ 5&3&-3&-2\\ 5&-2&2&-2\\ 5&-2&-3&3 \end{array} \right] \end{split}\]

の固有値。

sympy.Matrix(
    [[3, -2, 4, -2], [5, 3, -3, -2], [5, -2, 2, -2], [5, -2, -3, 3]]
).eigenvects()
\[\begin{split}\displaystyle \left[ \left( -2, \ 1, \ \left[ \left[\begin{matrix}0\\1\\1\\1\end{matrix}\right]\right]\right), \ \left( 3, \ 1, \ \left[ \left[\begin{matrix}1\\1\\1\\1\end{matrix}\right]\right]\right), \ \left( 5, \ 2, \ \left[ \left[\begin{matrix}1\\1\\1\\0\end{matrix}\right], \ \left[\begin{matrix}0\\-1\\0\\1\end{matrix}\right]\right]\right)\right]\end{split}\]

対角行列#

\[\begin{split} \left[ \begin{array}{c} 3&-2&4&-2\\ 5&3&-3&-2\\ 5&-2&2&-2\\ 5&-2&-3&3 \end{array} \right] \end{split}\]

の対角化。

P, D = sympy.Matrix(
    [[3, -2, 4, -2], [5, 3, -3, -2], [5, -2, 2, -2], [5, -2, -3, 3]]
).diagonalize()
P, D
\[\begin{split}\displaystyle \left( \left[\begin{matrix}0 & 1 & 1 & 0\\1 & 1 & 1 & -1\\1 & 1 & 1 & 0\\1 & 1 & 0 & 1\end{matrix}\right], \ \left[\begin{matrix}-2 & 0 & 0 & 0\\0 & 3 & 0 & 0\\0 & 0 & 5 & 0\\0 & 0 & 0 & 5\end{matrix}\right]\right)\end{split}\]
P * D * P**-1
\[\begin{split}\displaystyle \left[\begin{matrix}3 & -2 & 4 & -2\\5 & 3 & -3 & -2\\5 & -2 & 2 & -2\\5 & -2 & -3 & 3\end{matrix}\right]\end{split}\]

微分方程式#

未知関数の定義#

\[ f(x) \]
f = sympy.symbols("f", cls=sympy.Function)
f(x)
../_images/2e6c04c0cef31fb7eeaae20a6e99b6e0d6433316dcfee12b991426f93444b4f1.png

微分方程式の求解#

\[ \frac{d^2}{dx^2}f(x)+f(x)=0 \]

を満たす関数\(f(x)\)を求める。

sympy.dsolve(f(x).diff(x, x) + f(x), f(x))
../_images/d245ca5cf113fc6b9dedd11d1718a46c1663286e02f4a1c8e0754ba683e1ecfc.png
\[ x\frac{d}{dx}f(x)+f(x)-f^2(x)=0 \]

を満たす関数\(f(x)\)を求める。

sympy.dsolve(x * f(x).diff(x) + f(x) - f(x) ** 2)
../_images/6e668a1d075f56971568beebb682fcc50b51e385b5f5ec8a03260c37da8f9a44.png
\[ x\frac{d}{dx}f(x)+f(x)-f^2(x)=0 \]

を満たす関数\(f(x)\)を求める。
この際にベルヌーイ型微分方程式であることをヒントとして与えることができる。

sympy.dsolve(x * f(x).diff(x) + f(x) - f(x) ** 2, f(x), hint="Bernoulli")
../_images/6817b19ebeef315cd39cd46f59181ed03ecbbd375902236503721bd46b793265.png

Tex形式出力#

コンパイル#

equation = sympy.Eq(a * x**2 + b * x + c, 0)
solution = sympy.solve(equation, x)
sympy.init_printing()
solution
../_images/0dc087f21c63a4a18bfae5a5e91cb5f398ddc59e151533aa8b964dd85e2b174f.png

Tex出力#

print(sympy.latex(solution))
\left[ \frac{- b + \sqrt{- 4 a c + b^{2}}}{2 a}, \  - \frac{b + \sqrt{- 4 a c + b^{2}}}{2 a}\right]

小括#

PythonにおけるSymPyはStand Aloneであるにも関わらず、代数計算システムとして充実した機能を備えています。

まさにPythonの無限の可能性と、邪な開発意欲を感じさせるライブラリです。

【邪な例】

次の定積分を求めよ。

\[ \int_0^1\left(x^2+\frac{x}{\sqrt{1+x^2}}\right)\left(1+\frac{x}{(1+x^2)\sqrt{1+x^2}}\right)dx \]

東京大学 平成31年度 第2次学力試験 数学(理科)第1問より抜粋

sympy.integrate(
    (x**2 + x / sympy.sqrt(1 + x**2)) * (1 + x / (1 + x**2) / sympy.sqrt(1 + x**2)),
    (x, 0, 1),
)
../_images/a60669a4b7960d6db43b12d8d131174dc8d138426265cf55c08f1e39a50467e2.png

PythonにはSymPyのような楽しいライブラリがたくさん眠っているので、自ら発掘してみるのもとても楽しいかもしれません。

※(筆者の)必要に応じて今後も加筆する予定です。

参考文献#