1変数関数,特に(双曲線関数・逆双曲線関数を含む)初等関数の微分・積分。また,2変数関数に関する偏微分と2重責分,および2重積分に関連したガウス積分について。
SymPy の import
from sympy.abc import *
from sympy import *
1変数関数の微分 diff()
1階微分
SymPy で1変数関数 diff()
を使います。
diff(f(x), x)
(Derivative(f(x), x).doit()
)
高階微分
2階以上の高階微分は
diff(f(x), x, n)
参考:Derivative()
と diff()
Derivative()
は微分の表示をするだけで実際に微分は行いません。微分を実行するには,Derivative().doit()
のように .doit()
を追加します。
diff()
を使えば即微分を実行します。
例:
diff(x**3 + 5*x + 2, x)
何を計算させるのかを表示させてから答えを表示させるには…
y = x**3 + 5*x + 2
Eq(Derivative(y, x),
Derivative(y, x).doit())
Eq(Derivative(y, x, 2), diff(y, x, 2))
べき関数,平方根の微分
べき関数
diff(x**p, x)
直前の結果を _
で参照して簡単化 simplify()
してみます。
simplify(_)
ということで,
Eq(Derivative(x**p, x), diff(x**p, x).simplify())
偏微分記号が出てくるのは,
特に平方根
diff(sqrt(x), x)
Eq(diff(sqrt(x), x, evaluate = False),
diff(sqrt(x), x))
指数関数の微分
ネイピア数 exp(x)
の微分
diff(exp(x), x)
diff(exp(x), x)
対数関数の微分
自然対数 log(x)
の微分
diff(log(x), x)
diff(log(x), x)
三角関数の微分
Eq(Derivative(sin(x), x), diff(sin(x), x))
Eq(Derivative(cos(x), x), diff(cos(x), x))
Eq(Derivative(tan(x), x), diff(tan(x), x))
右辺を簡単化します。
diff(tan(x), x).simplify()
は simplify(diff(tan(x), x))
と同じ意味です。
Eq(Derivative(tan(x), x), diff(tan(x), x).simplify())
逆三角関数の微分
diff(asin(x), x)
Eq(Derivative(asin(x), x), diff(asin(x), x))
○練習: の微分
diff(acos(x), x)
や
diff(atan(x), x)
についても同様にやってみてください。
双曲線関数の微分
diff(cosh(x), x)
Eq(Derivative(cosh(x), x), diff(cosh(x), x))
○練習: の微分
diff(sinh(x), x)
や
diff(tanh(x), x)
についても同様に。
逆双曲線関数の微分
diff(acosh(x), x)
Eq(Derivative(acosh(x), x), diff(acosh(x), x))
本稿執筆時点では,SymPy は
○練習: の微分
1変数関数の積分 integrate()
不定積分
SymPy で1変数関数 integrate()
を使います。
integrate(f(x), x)
(Integral(f(x), x).doit()
)
不定積分の際,積分定数が省略された答えが出力されます。
定積分
定積分の際は以下のように積分範囲を (x, a, b)
のように指定します。
integrate(f(x), (x, a, b))
参考:Integral()
と integrate()
Integral()
は積分の表示をするだけで実際に積分は行いません。積分を実行するには,Integral().doit()
のように .doit()
を追加します。
integrate()
を使えば即積分を実行します。
べき関数の不定積分
integrate(x**p, x)
Eq(Integral(x**p, x), integrate(x**p, x))
指数関数の不定積分
integrate(exp(x), x)
Eq(Integral(exp(x), x), integrate(exp(x), x))
対数関数に関連した不定積分
Eq(Integral(1/x, x), integrate(1/x, x))
SymPy の積分 integrate()
では
○練習: の不定積分
integrate(log(x), x)
上記の結果は,いかにも部分積分をして答えを出しているようですね。
三角関数の不定積分
Eq(Integral(cos(x), x),
Integral(cos(x), x).doit())
Eq(Integral(sin(x), x),
Integral(sin(x), x).doit())
Eq(Integral(1/cos(x)**2, x),
integrate(1/cos(x)**2, x).simplify())
○練習: の不定積分
では,
逆三角関数に関連した不定積分
Eq(Integral(1/(sqrt(1 - x**2)), x),
integrate(1/(sqrt(1 - x**2)), x))
Eq(Integral(-1/(sqrt(1 - x**2)), x),
integrate(-1/(sqrt(1 - x**2)), x))
積分の答えが _
を .rewrite(acos)
つまり
_.rewrite(acos)
integrate(1/(1 + x**2), x)
○練習:逆三角関数の不定積分
双曲線関数の不定積分
Eq(Integral(cosh(x), x), integrate(cosh(x), x))
Eq(Integral(sinh(x), x), integrate(sinh(x), x))
Eq(Integral(1/cosh(x)**2, x), integrate(1/cosh(x)**2, x).simplify())
○練習: の不定積分
では
逆双曲線関数に関連した不定積分
diff(acosh(x), x)
Eq(Integral(1/sqrt(x**2 - 1), x),
integrate(1/sqrt(x**2 - 1), x))
acosh(x).rewrite(log).factor()
log(x + sqrt(x**2 - 1)).rewrite(log)
Eq(Integral(1/sqrt(1 + x**2), x),
integrate(1/sqrt(1 + x**2), x))
Eq(Integral(1/(1-x**2), x), integrate(1/(1-x**2), x))
Eq(Integral(asinh(x), x), integrate(asinh(x), x))
Eq(Integral(atanh(x), x), integrate(atanh(x), x))
integrate(acosh(x), x)
上記のように,本稿執筆時点では,SymPy は
SymPy がこの積分ができないのは,どうも以下のように…
Eq(Derivative(acosh(x), x), diff(acosh(x), x))
ためしに,
integrate(x/(sqrt(x-1)*sqrt(x+1)), x)
なんか意味不明の答えが出てくるであろう。
一方,
Eq(Integral(x/sqrt(x**2-1), x),
integrate(x/sqrt(x**2-1), x))
以上のことから
○練習: の不定積分
部分積分を使って,あらためて
偏微分:多変数(主に2変数)関数の微分
主に2変数関数
1階偏微分 diff()
SymPy での偏微分は(1変数関数の微分である「常微分」と同様の書き方で)以下のように書きます。
diff(f(x, y), x)
diff(f(x, y), y)
# 変数 x, y を初期化
var('x y')
# f を未定義関数として宣言
f = Function('f')
diff(f(x, y), x)
diff(f(x, y), y)
○練習:偏導関数を求める
関数
「偏導関数を求めよ」とは,
高階偏微分 diff(f(x, y), x, m, y, n)
2階以上の高階偏微分は以下のように書きます。
diff(f(x, y), x, 2)
diff(f(x, y), x, y)
diff(f(x, y), x, m, y, n)
○練習:高階導関数の計算
SymPy が2階偏導関数に関して
のように,偏微分の順序を変えてもよいことを知っているか確認します。
以下では,比較演算子 ==
を使って左辺と右辺が等しいかを確認しています。等しければ True
,等しくなければ False
を返します。
diff(f(x, y), x, y) == diff(f(x, y), y, x)
以下では,左辺から右辺を引いてゼロになるかどうかで,確認しています。
Eq(Derivative(f(x, y), x, y)-Derivative(f(x, y), y, x),
diff(f(x, y), x, y)-diff(f(x, y), y, x))
2重積分:2変数関数の積分
多変数関数の積分である多重積分のうち,2変数関数の積分である2重積分についてまとめておきます。
累次積分
2重積分の計算は,基本的に累次積分でやります。
ケース 1
領域
または
ケース 2
領域
ケース 3
領域
SymPy では2重積分は以下のように:
integrate(f(x, y), (x, x1, x2), (y, y1, y2))
○練習:累次積分による2重積分
累次積分の形にする。
領域
平方根の中がゼロ以上であることから
被積分関数は
ケース 2 の累次積分の形:
f = 1
x1 = -1
x2 = 1
y1 = -sqrt(1-x**2)
y2 = sqrt(1-x**2)
Integral(f, (y, y1, y2), (x, x1, x2))
確認のために,段階ごとに計算してみます。
まず,integrate(f, (y, y1, y2))
Eq(Integral(f, (y, y1, y2)),
integrate(f, (y, y1, y2)))
次に,
人力でこの積分を計算するには,以下の不定積分の項を参照のこと。
人力だと一手間も二手間もかかりますが,SymPy だと簡単に積分してくれます。
積分を続けて最終的な答えを求めなさい。
ガウス積分の準備としての2重積分
Eq(Integral(exp(-x**2-y**2), (x, -oo, oo), (y, -oo, oo)),
integrate(exp(-x**2-y**2), (x, -oo, oo), (y, -oo, oo)))
SymPy では上記のように苦もなく計算しているが,人力で積分するためには以下のように極座標に変換して積分することになる。
極座標に変換して積分
極座標に変換して計算する。
デカルト座標
であり,微小面積要素
ここで,ここで,
SymPy ではヤコビ行列を計算する機能があるが,簡単なのでここでは以下のように計算してみる。
x = r*cos(theta)
y = r*sin(theta)
jaco = diff(x, r)*diff(y,theta) - diff(y,r)*diff(x,theta)
simplify(jaco)
ヤコビアンが
となり,
であるから,この問題は
Eq(Integral(r*exp(-r**2), (r, 0, oo)),
integrate(r*exp(-r**2), (r, 0, oo)))
人力で積分する際はきっと
参考:敢えて置換積分 .transform()
せっかくだから,これを敢えて置換積分でやってみる。
まず,この積分を int1
として定義。
int1 = Integral(r*exp(-r**2), (r, 0, oo))
int1
int2 = int1.transform(r**2, t)
int2
この形なら暗算でも積分できるが,念のため .doit()
で実際に積分を実行させる。
Eq(int2, int2.doit())
したがって
ガウス積分
とすると,上で
ということがわかったので,
ということになる。SymPy がガウス積分
# 変数 x の初期化
var('x')
Eq(Integral(exp(-x**2), (x, -oo, oo)),
Integral(exp(-x**2), (x, -oo, oo)).doit())
被積分関数
Eq(Integral(exp(-x**2), (x, 0, oo)),
Integral(exp(-x**2), (x, 0, oo)).doit())
ガウス積分は,積分の上限が
… のだが,実際に SymPy でやってみると…
Eq(Integral(exp(-x**2), x),
Integral(exp(-x**2), x).doit())
参考:誤差関数
○練習:誤差関数の極限値
誤差関数
となるはずである。これを SymPy で確認してください。