#!/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
#
# # 入力とヘルプ
#
# 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[ ]: