#!/usr/bin/env python # coding: utf-8 #
# First Leaf (基本操作) #
#
# cc by Shigeto R. Nishitani, 2017-10-31 #
# # * file: /Users/bob/python/doing_math_with_python/first_leaf.ipynb # # Table of Contents #

1  入力とヘルプ
1.1  よく使うkeyboard short cut
1.2  数式処理libraryのimport
1.3  restart
1.4  help
1.5  その他の参考サイト
2  print
2.1  その他の環境で
3  代数式
4  plot
4.1  scipyのplot
4.2  parametrix plotでaspect比=1
# # 入力とヘルプ # # pythonの動作環境としてnotebookを使っていきます.notebookは,文章フォーマット(title, head, 目次, 表),数式(tex記法), グラフ作成などreportを作成するための基本的な機能が備わっています.さらにhtml, latex, pdfなどへの出力が可能なため,科学技術に関連するすべての分野で社会人になっても標準的なツールとして使うことになります.read -> eval -> printというloopでcodingを進めていきます. # ## よく使うkeyboard short cut # 1. 入力はshift+enter # 1. 改行はenter # # 1. command mode(cellが青色) # 1. hでhelpを表示 # 1. escでedit modeへ # 1. ^jは下にcellを挿入 # 1. ^kは上にcellを挿入 # 1. ^xでcell cut # 1. ^yでcell paste # 1. ^mはcellをmarkdown cellに変更 # 1. yでcode cellに変更 # 1. edit mode(cellが緑色) # 1. emacsのkeybindが使える.うまくいかないときは,closeして再openするといい. # 1. escでcommand modeへ # ## 数式処理libraryのimport # # pythonはいろいろな用途に対応する汎用言語です.数式処理をさせるにはそれに必要なlibraryを読み込んでおく必要があります.sympy(symbolic python)がそれです.libraryのimportの仕方は幾つかありますが,全部読み込んでくれる # ``` python # from sympy import * # ``` # # から覚えてください. # ## restart # # 何回も入力を繰り返して,特にimportをいろいろしたり,変数への代入を繰り返すと,前のものが残っていて,挙動がおかしくなります.そういうときは,jupyter menu barにある[kernel]->[restart]で入力を一旦クリアしてもう一度関連するcode cellを入力しなおしてください. # ## help # helpの表示は関連するlibraryをimportしておいて,そのあと,「?」マークに続けてキーワードを打ち込めばいい. # In[1]: from sympy import * # In[2]: get_ipython().run_line_magic('pinfo', 'Rational') # ## その他の参考サイト # * [sympy tutorial](http://docs.sympy.org/latest/tutorial/index.html) # # # # 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 # ## その他の環境で # # 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)) # In[5]: pprint(com1) # # 代数式 # # 例えば, # $$ # (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 # In[6]: x = Symbol('a') x + x + 1 # In[7]: x.name # In[8]: x,y,z = symbols('x,y,z') s = x*y + y*x s # In[9]: p = x*(x+x) p # In[10]: pprint(p) # In[11]: p.integrate(x) # In[12]: integrate(p,x) # In[13]: print(p.subs({x:4})) print(p.integrate(x).subs({x:4})) # # plot # # 簡単なplotです. # # 1. 複数の関数のplot, 色の変更まで. # 1. parametric plotして円をaspect_ratio 1:1で.最後に追加. # 1. sin(x) * cos(y) ぐりぐりはできなさそう.Axes3Dでできることを確認. # # はじめの%matplotlib inlineはplotをnotebookのなかに表示させる呪文です. # In[5]: get_ipython().run_line_magic('matplotlib', 'inline') from sympy import * x = Symbol('x') plot(sin(x)) # 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]: get_ipython().run_line_magic('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)) # ## scipyのplot # # scipy lectureの[matplotlib](http://www.scipy-lectures.org/intro/matplotlib/matplotlib.html) # を参照しています. # In[9]: get_ipython().run_line_magic('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]: get_ipython().run_line_magic('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]: get_ipython().run_line_magic('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]: get_ipython().run_line_magic('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[ ]: