pythonの動作環境としてnotebookを使っていきます.notebookは,文章フォーマット(title, head, 目次, 表),数式(tex記法), グラフ作成などreportを作成するための基本的な機能が備わっています.さらにhtml, latex, pdfなどへの出力が可能なため,科学技術に関連するすべての分野で社会人になっても標準的なツールとして使うことになります.read -> eval -> printというloopでcodingを進めていきます.
入力はshift+enter
改行はenter
command mode(cellが青色)
hでhelpを表示
escでedit modeへ
^jは下にcellを挿入
^kは上にcellを挿入
^xでcell cut
^yでcell paste
^mはcellをmarkdown cellに変更
yでcode cellに変更
edit mode(cellが緑色)
emacsのkeybindが使える.うまくいかないときは,closeして再openするといい.
escでcommand modeへ
pythonはいろいろな用途に対応する汎用言語です.数式処理をさせるにはそれに必要なlibraryを読み込んでおく必要があります.sympy(symbolic python)がそれです.libraryのimportの仕方は幾つかありますが,全部読み込んでくれる
from sympy import *
から覚えてください.
何回も入力を繰り返して,特にimportをいろいろしたり,変数への代入を繰り返すと,前のものが残っていて,挙動がおかしくなります.そういうときは,jupyter menu barにある[kernel]->[restart]で入力を一旦クリアしてもう一度関連するcode cellを入力しなおしてください.
helpの表示は関連するlibraryをimportしておいて,そのあと,「?」マークに続けてキーワードを打ち込めばいい.
from sympy import *
?Rational
出力が複雑な式だと,ひとめでわかるように見やすくprintしてくれると嬉しいです.jupyter notebookではmathjaxをつかってlatex形式から綺麗に表示してくれます.
from sympy import *
from IPython.display import display
init_printing(use_latex='mathjax')
x = Symbol('x')
com1 = Integral(sqrt(1/x),x)
com1
notebookではない環境ではprint(pretty(com1,use_unicode=False))が比較的綺麗.なにも明示せずにOutで帰ってくるmathjaxが一番読みやすいんですが,途中の経過を自動で表示してくれるわけではありません.そこで,比較的覚えやくて綺麗なpprintを多用します.
その他の明示的な出力コマンドは次の通り.
ptyhon
str(com1) # 文字列で
print(com1) #標準的な出力
pprint(com1,use_unicode=False)
print(pretty(com1,use_unicode=True))
print(latex(com1)) # latex表記
srepr(com1) # 内部での厳密な取り扱い(Advanced Expression Manipulationをgoogleへ)
print(pretty(com1,use_unicode=False))
/ | | ___ | / 1 | / - dx | \/ x | /
pprint(com1)
⌠ ⎮ ___ ⎮ ╱ 1 ⎮ ╱ ─ dx ⎮ ╲╱ x ⌡
例えば, $$ (x+y)^2 = x^2 + 2xy + y^2 $$ という展開をおこなったり,微分,積分,線形代数計算を$x,y, A, b$ なんかのシンボルでそのまま変形したい時があります.
こういうことをおこなってくれるシステムが数式処理システム(Computer algebra systems)と呼ばれるものです. 代表的な商用製品としては,Maple, Mathematicaがあります. 同じコンセプトでフリーのものには,Octave, Maxima, SciLabなどがあります.
これをpython上で実現しようとしたのが,sympy, sageです. sageのほうが入出力が綺麗なんですが,残念ながらwindowsでは動きません. したがって,sympyでしばらくどこまでできるかを試してみます.
x = Symbol('x')
x + x + 1
x = Symbol('a')
x + x + 1
x.name
'a'
x,y,z = symbols('x,y,z')
s = x*y + y*x
s
p = x*(x+x)
p
pprint(p)
2 2⋅x
p.integrate(x)
integrate(p,x)
print(p.subs({x:4}))
print(p.integrate(x).subs({x:4}))
32 128/3
簡単なplotです.
はじめの%matplotlib inlineはplotをnotebookのなかに表示させる呪文です.
%matplotlib inline
from sympy import *
x = Symbol('x')
plot(sin(x))
<sympy.plotting.plot.Plot at 0x10a9b76d8>
p = plot(sin(x), cos(x), (x, -pi, pi), ylim=[-0.5,1],
legend=True, show=False)
p[0].line_color = 'b'
p[1].line_color = 'r'
p.show()
%matplotlib inline
from sympy import *
from sympy.plotting import plot3d
x,y = symbols('x,y')
plot3d(sin(x)*cos(y), (x,-pi,pi),(y,-pi,pi))
<sympy.plotting.plot.Plot at 0x115c86fd0>
scipy lectureのmatplotlib を参照しています.
%matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt
X = np.linspace(-np.pi, np.pi, 256, endpoint=True)
C, S = np.cos(X), np.sin(X)
plt.plot(X, C)
plt.plot(X, S)
plt.show()
# Create a figure of size 8x6 inches, 80 dots per inch
plt.figure(figsize=(8, 6), dpi=80)
# Create a new subplot from a grid of 1x1
plt.subplot(1, 1, 1)
X = np.linspace(-np.pi, np.pi, 256, endpoint=True)
C, S = np.cos(X), np.sin(X)
# Plot cosine with a blue continuous line of width 1 (pixels)
plt.plot(X, C, color="blue", linewidth=1.0, linestyle="-")
# Plot sine with a green continuous line of width 1 (pixels)
plt.plot(X, S, color="green", linewidth=1.0, linestyle="-")
# Set x limits
plt.xlim(-4.0, 4.0)
# Set x ticks
plt.xticks(np.linspace(-4, 4, 9, endpoint=True))
# Set y limits
plt.ylim(-1.0, 1.0)
# Set y ticks
plt.yticks(np.linspace(-1, 1, 5, endpoint=True))
# Save figure using 72 dots per inch
# plt.savefig("exercice_2.png", dpi=72)
# Show result on screen
plt.show()
以下にしめした3DでぐりぐりさせるAxes3Dはsympyをimportしているとうまく動かない. どっかで,conflictが起こっている. notebookのmenu barのkernel->Restartで初期化する必要あり.
%matplotlib notebook
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
def f(x,y):
return 4*x+2*y-6*x*y
def g(x,y):
return 10*x-2*y+1
x = np.arange(-3, 3, 0.25)
y = np.arange(-3, 3, 0.25)
X, Y = np.meshgrid(x, y)
Z1 = f(X,Y)
Z2 = g(X,Y)
fig = plt.figure()
plot3d = Axes3D(fig)
plot3d.plot_surface(X,Y,Z1)
plot3d.plot_surface(X,Y,Z2, color='r')
plt.show()