#!/usr/bin/env python
# coding: utf-8
# # Table of Contents
#
#
#
#
# 微分(differential)
#
#
#
# file:/~/python/doing_math_with_python/differential.ipynb
#
# cc by Shigeto R. Nishitani 2017
#
# # 微分(Diff)-I
# ## 単純な微分(diff)
# 単純な一変数関数の一次微分は,以下の通り.
# In[2]:
from sympy import *
x,y = symbols('x y')
diff(x**2-3*x+2,x)
# 高次の微分は,微分変数を必要なだけ並べる.
# In[2]:
diff(sin(x),x,x)
# さらに高階微分は次のように.これはxについての3次微分を表わす.
# In[3]:
diff(x**4,x,3)
# ## 偏微分(PartialDiff)
# 複数の変数を持つ多変数の関数では,微分する変数を明示すれば偏微分が求められる.
# In[7]:
eq1=(x+y)/(x*y)
pprint(diff(eq1,x))
# ## 例題:関数の微分と増減表
#
# 次の関数とその1次導関数を同時にプロットし概形を確認し,さらに増減表を求めよ.
#
#
# $$
# \frac {x}{{x}^{2}-2x+4}
# $$
# ### 解答例
# In[1]:
from sympy import *
from sympy.plotting import plot
x = symbols('x')
f0 = x/(x**2 -2*x + 4)
pprint(f0)
pprint(diff(f0,x))
df0 = diff(f0,x)
p = plot(f0,df0, show=False)
p[0].line_color = 'b'
p[1].line_color = 'r'
p.show()
# ## 例題:接線(Tangent)
# 次の関数の$ x=3$での接線を求め,2つの関数を同時にプロットせよ.
#
# $$
# y={x}^{3}-2\,{x}^{2}-35\,x
# $$
# ### 解答例
# 与関数をf0と定義.
# In[8]:
from sympy import *
from sympy.plotting import plot
x = symbols('x')
f0 = x**3 -2*x**2 - 35*x
f0
# 微分関数をdfと定義
# In[9]:
pprint(diff(f0,x))
df0 = diff(f0,x)
# 接点(x0,f0(x0))で傾きdf(x0)の直線をf1と定義.
# In[10]:
x0 = 3
a = df0.subs({x:x0})
f1 = a*(x-x0)+f0.subs({x:x0})
pprint(f1)
# 2つの関数を同時にプロット.
# In[11]:
p = plot(f0,f1, show=False)
p[0].line_color = 'b'
p[1].line_color = 'r'
p.show()
# # 極限(limit)
# 微分の原理を理解する時に不可欠な極限(limit)について記す.
# In[5]:
from sympy import *
x = symbols('x')
print(limit(x, x, 0))
print(limit(x, x, oo))
print(limit(1/x, x, oo))
print(limit(x/sin(x), x, 0))
# In[6]:
d = symbols('d')
f = x**2
df = diff(f,x)
print(df.subs({x:2}))
limit((f.subs({x:x+d})-f.subs({x:x}))/d,d,0)
# # 微分(Diff)-II
# ## 級数展開(series)
# Taylor級数は以下のようにして,中心点(x=a),次数(4次)を指定する.
# In[1]:
from sympy import *
from sympy.plotting import plot
init_printing()
x,a = symbols('x a')
sin(x).series(x,a,4)
# Oはどれくらいのエラーがあるかの表示ですが,関数として取り込むにはOのところが邪魔です.これはremoveO(まんまやん!)で取り除けます.
# In[2]:
fs = series(sin(x),x,a,4)
f0 = fs.removeO()
pprint(f0)
f1 = f0.subs({a:pi})
pprint(f1)
# In[4]:
y = symbols('y')
p = plot(sin(x),f1, (x,0,2*pi), ylim=[-1,1], show=False)
p[0].line_color = 'b'
p[1].line_color = 'r'
p.show()
# ## 全微分(D)
# sympyでは全微分(total derivatives)は用意されてないようです.
#
# 下のMapleコマンドDを参照して,考えてください.
# ```maple
# > f:=unapply(x^4*exp(-y^2),(x,y));
# > D(f(x,y));
# > (D@@2)(f(x,y));
# ```
# $$
# f\, := \,( {x,y} )\mapsto {x}^{4}\exp(-{y}^{2}) \notag \\
# 4\, {D} \left( x \right) {x}^{3}\exp(-{y}^{2})+{x}^{4} {D} \left( \exp(-{y}^{2}) \right) \notag \\
# 4\, \left( D^{ \left( 2 \right) } \right) \left( x \right) {x}^{3}\exp(-{y}^{2})+12\, \left( {D} \left( x \right) \right) ^{2}{x}^{2}\exp(-{y}^{2})+8\, {D} \left( x \right) {x}^{3} {D} \left( \exp(-{y}^{2}) \right) +{x}^{4} \left( D^{ \left( 2 \right) } \right) \left( \exp(-{y}^{2}) \right) \notag
# $$
#
# ここで,D(x)などはxの全微分を表わす.これは,x,yを変数としているので
# ```maple
# > diff(x,x);
# > diff(exp(-y^2),y);
# ```
# $$
# 1 \notag \\
# -2\,y\exp(-{y}^{2}) \notag
# $$
# であるがMapleには分からない.そこで全微分の最終形を得るには,あらかじめD(x)などの結果を求めておき,subsで明示的に代入する必要がある.
# ```maple
# > dd:=D(f(x,y)):
# > eqs:={D(x)=diff(x,x),D(exp(-y^2))=diff(exp(-y^2),y)};
# > subs(eqs,dd);
# ```
# $$
# {\it eqs}\, := \, \left\{ {D} \left( x \right) =1, {D} \left( \exp(-{y}^{2}) \right) =-2\,y\exp(-{y}^{2}) \right\} \notag \\
# 4\,{x}^{3}\exp(-{y}^{2})-2\,{x}^{4}y\exp(-{y}^{2}) \notag
# $$
# ## 複合関数の微分
# ```maple
# > diff(f(x)*g(x),x);
# > diff(f(g(x)),x);
# ```
# $$
# \left( {\frac {d}{dx}}f \left( x \right) \right) g \left( x \right) +f \left( x \right) {\frac {d}{dx}}g \left( x \right) \notag \\
# \mbox {D} \left( f \right) \left( g \left( x \right) \right) {\frac {d}{dx}}g \left( x \right) \notag
# $$
#
# ```maple
# > f:=x->exp(x);
# > g:=x->cos(x);
# > diff(f(x)*g(x),x);
# > diff(f(g(x)),x);
# ```
# $$
# f\, := \,x\mapsto \exp(x) \notag \\
# g\, := \,x\mapsto \cos \left( x \right) \notag \\
# \exp(x)\cos \left( x \right) -\exp(x)\sin \left( x \right) \notag \\
# -\sin \left( x \right) \exp(\cos x ) \notag
# $$
# In[9]:
f = exp(x)
g = cos(x)
pprint(diff(f*g, x))
pprint(diff(f.subs({x:g}), x))
# ## 課題
# 1. 次の関数を微分せよ.
# 1. $ {x} \log x$,
# 1. $ \frac{1}{ \left( 1+x \right) ^{3}}$,
# 1. $ \sqrt{4\,x+3}$,
# 1. $ \frac{1}{ a^2+ \left( x-x_0 \right)^2 }$
# 1. 次の関数の1次から5次導関数を求めよ.
# 1. $\sin^2 x$,
# 1. ${e}^{x}$
# 1. 以下の関数をx0まわりで3次までテイラー展開し,得られた関数ともとの関数をプロットせよ.さらに5次まで展開した場合はどう変化するか.
# 1. $ y=\sin x, x_0=0 $,
# 1. $ y=\cos x, x_0=\frac{\pi}{2}$
# 1. (発展課題)$f \left( x,y \right) ={e}^{x}{\it log} \left( 1+y \right) $を$ x=0,\,y=0$のまわりで3次まで展開せよ.
# ## 解答例
# ### 幾つかの関数の微分
# ```maple
# > diff(x*log(x),x);
# > diff(1/(1 + x)^3,x);
# > diff(sqrt(4*x + 3),x);
# >diff(1/(a^2+(x-x0)^2),x);
# ```
# $$
# \ln \left( x \right) +1 \notag \\
# -3\, \left( 1+x \right) ^{-4} \notag \\
# 2\, \left( \sqrt{4\,x+3} \right) ^{-1} \notag \\
# -{\frac {2\,x-2\,{\it x0}}{ \left( {a}^{2}+ \left( x-{\it x0} \right) ^{2} \right) ^{2}}} \notag
# $$
# In[20]:
from sympy import *
x,a,x0 = symbols('x a x0')
pprint(diff(x*log(x),x))
pprint(diff(1/(1+x)**3,x))
print(diff(sqrt(4*x+3),x))
pprint(diff(1/(a**2+(x-x0)**2),x))
# ### 高階微分
# ```maple
# > diff(sin(x)^2,x);
# > diff(sin(x)^2,x$2);
# ```
#
# $$
# 2\,\sin \left( x \right) \cos \left( x \right) \notag \\
# 2\, \left( \cos \left( x \right) \right) ^{2}-2\, \left( \sin \left( x \right) \right) ^{2}\notag
# $$
# In[26]:
from sympy import *
x = symbols('x')
for i in range(0,5):
print(i)
pprint(diff(sin(x)**2,x,i))
# In[27]:
from sympy import *
x = symbols('x')
for i in range(0,5):
print(i)
pprint(diff(exp(x),x,i))
# ### 0以外での級数展開と表示
# テキストを参照して.
# ### 2次元関数の級数展開と3dplot
# In[2]:
from sympy import *
x,y = symbols('x y')
f = exp(x)*log(1+y)
fx = f.series(x,0,3).removeO()
fxy = fx.series(y,0,3).removeO()
fxy
# In[3]:
from sympy.plotting import plot3d
p = plot3d(f, fxy, (x, -0.5, 2), (y, -0.5, 2), show = False)
p[0].surface_color = 'r'
p[1].surface_color = 'b'
p.show()
# # きれいな微分表示
#
# 以下のようにすると表示がきれい.
# In[102]:
f = x**4*exp(-y**2)
pprint(f)
df = Derivative(f,x)
#df.doit()
df
# In[ ]: