First Leaf (基本操作)
cc by Shigeto R. Nishitani, 2017-10-31
  • file: /Users/bob/python/doing_math_with_python/first_leaf.ipynb

入力とヘルプ

pythonの動作環境としてnotebookを使っていきます.notebookは,文章フォーマット(title, head, 目次, 表),数式(tex記法), グラフ作成などreportを作成するための基本的な機能が備わっています.さらにhtml, latex, pdfなどへの出力が可能なため,科学技術に関連するすべての分野で社会人になっても標準的なツールとして使うことになります.read -> eval -> printというloopでcodingを進めていきます.

よく使うkeyboard short cut

  1. 入力はshift+enter
  2. 改行はenter

  3. command mode(cellが青色)

    1. hでhelpを表示
    2. escでedit modeへ
    3. ^jは下にcellを挿入
    4. ^kは上にcellを挿入
    5. ^xでcell cut
    6. ^yでcell paste
    7. ^mはcellをmarkdown cellに変更
    8. yでcode cellに変更
  4. edit mode(cellが緑色)
    1. emacsのkeybindが使える.うまくいかないときは,closeして再openするといい.
    2. escでcommand modeへ

数式処理libraryのimport

pythonはいろいろな用途に対応する汎用言語です.数式処理をさせるにはそれに必要なlibraryを読み込んでおく必要があります.sympy(symbolic python)がそれです.libraryのimportの仕方は幾つかありますが,全部読み込んでくれる

from sympy import *

から覚えてください.

restart

何回も入力を繰り返して,特にimportをいろいろしたり,変数への代入を繰り返すと,前のものが残っていて,挙動がおかしくなります.そういうときは,jupyter menu barにある[kernel]->[restart]で入力を一旦クリアしてもう一度関連するcode cellを入力しなおしてください.

help

helpの表示は関連するlibraryをimportしておいて,そのあと,「?」マークに続けてキーワードを打ち込めばいい.

In [1]:
from sympy import *
In [2]:
?Rational

その他の参考サイト

print

出力が複雑な式だと,ひとめでわかるように見やすくprintしてくれると嬉しいです.jupyter notebookではmathjaxをつかってlatex形式から綺麗に表示してくれます.

In [1]:
from sympy import *
from IPython.display import display
init_printing(use_latex='mathjax')
x = Symbol('x')
com1 = Integral(sqrt(1/x),x)
com1
Out[1]:
$$\int \sqrt{\frac{1}{x}}\, dx$$

その他の環境で

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へ)
In [4]:
print(pretty(com1,use_unicode=False))
  /          
 |           
 |     ___   
 |    / 1    
 |   /  -  dx
 | \/   x    
 |           
/            
In [5]:
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でしばらくどこまでできるかを試してみます.

In [6]:
x = Symbol('x')
x + x + 1
Out[6]:
$$2 x + 1$$
In [6]:
x = Symbol('a')
x + x + 1
Out[6]:
$$2 a + 1$$
In [7]:
x.name
Out[7]:
'a'
In [8]:
x,y,z = symbols('x,y,z')
s = x*y + y*x
s
Out[8]:
$$2 x y$$
In [9]:
p = x*(x+x)
p
Out[9]:
$$2 x^{2}$$
In [10]:
pprint(p)
   2
2⋅x 
In [11]:
p.integrate(x)
Out[11]:
$$\frac{2 x^{3}}{3}$$
In [12]:
integrate(p,x)
Out[12]:
$$\frac{2 x^{3}}{3}$$
In [13]:
print(p.subs({x:4}))
print(p.integrate(x).subs({x:4}))
32
128/3

plot

簡単なplotです.

  1. 複数の関数のplot, 色の変更まで.
  2. parametric plotして円をaspect_ratio 1:1で.最後に追加.
  3. sin(x) * cos(y) ぐりぐりはできなさそう.Axes3Dでできることを確認.

はじめの%matplotlib inlineはplotをnotebookのなかに表示させる呪文です.

In [5]:
%matplotlib inline

from sympy import *
x = Symbol('x')
plot(sin(x))
Out[5]:
<sympy.plotting.plot.Plot at 0x10a9b76d8>
In [11]:
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()
In [4]:
%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))
Out[4]:
<sympy.plotting.plot.Plot at 0x115c86fd0>

scipyのplot

scipy lectureのmatplotlib を参照しています.

In [9]:
%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()
In [10]:
# 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で初期化する必要あり.

In [1]:
%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()
In [7]:
%matplotlib notebook
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

def f(x,y):
    return np.sin(x)*np.cos(y)

x = np.arange(-np.pi, np.pi, 0.02)
y = np.arange(-np.pi, np.pi, 0.02)
X, Y = np.meshgrid(x, y)
Z1 = f(X,Y)

fig = plt.figure()
plot3d = Axes3D(fig)
plot3d.plot_surface(X,Y,Z1) 

plt.show()

parametrix plotでaspect比=1

inlineで表示するとaspect ratio <> 1だね.それを外すとうまく表示してくれる.

In [7]:
%matplotlib inline

import sympy as sp
p = plotting.plot_parametric(cos(t),sin(t),(t,0,2*pi))
ax = p._backend.ax
ax.set_aspect('equal')
fig.show()
In [ ]: