#!/usr/bin/env python # coding: utf-8 # # Table of Contents #

1  微分(Diff)-I
1.1  単純な微分(diff)
1.2  偏微分(PartialDiff)
1.3  例題:関数の微分と増減表
1.3.1  解答例
1.4  例題:接線(Tangent)
1.4.1  解答例
2  極限(limit)
3  微分(Diff)-II
3.1  級数展開(series)
3.2  全微分(D)
3.3  複合関数の微分
3.4  課題
3.5  解答例
3.5.1  幾つかの関数の微分
3.5.2  高階微分
3.5.3  0以外での級数展開と表示
3.5.4  2次元関数の級数展開と3dplot
4  きれいな微分表示
#
# #
# 微分(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[ ]: