kaeken(嘉永島健司)Techブログ

主に情報科学/情報技術全般に関する知見をポストします。(最近は、特にData Science、機械学習、深層学習、統計学、Python、数学、ビッグデータ)

『Pythonからはじめる数学入門』7章(前半) 初等解析問題を解く

f:id:kaeken:20171205234404p:plain

Pythonからはじめる数学入門』7章(前半) 初等解析問題を解く

に関する解説です。

7.1 関数とは何か

7.1.1 関数の定義域と値域

数学そのものの説明は省略しますが、用語を記しておきます。

写像mapping
定義域domain
値域range

7.1.2 よく使われる数学関数

sin()などよく使われる数学関数の書き方です。

#7.1.2 よく使われる数学関数

import math
print(math.sin(math.pi/2))

import sympy
print(sympy.sin(math.pi/2))

from sympy import Symbol
theta = Symbol('theta')
sympy.sin(theta) + sympy.sin(theta)

結果

1.0
1.00000000000000
2*sin(theta)

7.2 SymPyでの仮定

変数の正負など仮定を指定する場合です。

#7.2 SymPyでの仮定assumption
from sympy import Symbol
#正値だけ仮定する場合は、positive=Trueと指定
x = Symbol('x', positive=True)
if (x+5) > 5:
  print('x+5 : plus')
else:
  print('x+5 : minus')

#負値だけ仮定する場合は、negative=Trueと指定
x = Symbol('x', negative=True)
if (x+5) > 5:
  print('x+5 : plus')
else:
  print('x+5 : minus')

結果

x+5 : plus
x+5 : minus

7.3 関数の極限を求める

#Limitクラスのオブジェクトで関数の極限を求めます。
from sympy import Limit, Symbol, S #S:無限大や特別な値を定義するための使用する
x = Symbol('x')
print(Limit(1/x, x, S.Infinity)) #S.Infinity:無限大
print(Limit(1/x, x, 0, dir='-').doit()) #doit()で極限値を求める。dir='-'で負の方向を指定
print(Limit(1/x, x, 0, dir='+').doit()) #doit()で極限値を求める。dir='+'で正の方向を指定

結果

Limit(1/x, x, oo, dir='-')
-oo
oo

7.3.1 連続複利(Continuous Compound Interest)

7.3.2 瞬間変化率

7.4 関数の微分を求める

#7.4 関数の微分を求める

from sympy import Symbol, Derivative
t = Symbol('t')
St = 5*t**2 + 2*t + 8
print(Derivative(St, t))
print(Derivative(St, t).doit())
print(Derivative(St, t).doit().subs({t:1}))

結果

Derivative(5*t**2 + 2*t + 8, t)
10*t + 2
12

7.4.1 微分電卓

#微分電卓
from sympy import Symbol, Derivative, sympify, pprint
from sympy.core.sympify import SympifyError

def derivative(f, var):
  var = Symbol(var)
  d = Derivative(f, var).doit()
  pprint(d)


if __name__=='__main__':
  
  f = input('Enter a function: ')
  var = input('Enter the variable to differentiate with respect to: ')
  
  try:
    f = sympify(f)
  except SympifyError:
    print('Invalid input')
  else:
    derivative(f, var)

結果

# エラーになったが、以下が正しい結果で、再検証
Enter a function: 2*x**2 + 3*x + 1
Enter the varlable tO differentiate with respect to: x
4*x+3

7.4.2 偏微分を求める

結果

Enter a function: 2*x*y + x*y**2
Enter the varlable tO differentiate with respect to: x
4*x+3