SymPy:使用 Python 幫你導煩人的數學公式(三)

微積分(Calculus)

SymPy 也可以用於微積分的計算,這裡介紹在微積分中常用的運算。

SymPy 提供了ㄧ個 limit(function, variable, point) 函數可以計算函數的極限值。下面的這個指令可以計算 sin(x) 函數在 x 趨近於零的極限值。

>>> from sympy import limit, Symbol, sin, oo
>>> x = Symbol('x')
>>> limit(sin(x)/x, x, 0)
1


亦可計算無限大的極限值:

>>> limit(x, x, oo)
oo

>>> limit(1/x, x, oo)
0

>>> limit(x**x, x, 0)
1



再舉一個更複雜的例子:

>>> limit((1+1/x)**x, x, oo)
E

>>> limit((x**3-1)/(x**2-1), x, 1)
3/2

>>> limit(E**x/(1-x**3), x, 0)
1

這裡的 E 就是數學上的尤拉常數。

diff(func, var) 這個函數可以計算微分(differentiation):

>>> from sympy import diff, Symbol, sin, tan
>>> x = Symbol('x')
>>> diff(sin(x), x)
cos(x)

>>> diff(sin(2*x), x)
2*cos(2*x)

>>> diff(tan(x), x)
   2
tan (x) + 1

我們可以用下面的指令確認這個答案是正確的:

>>> from sympy import limit
>>> from sympy.abc import delta
>>> limit((tan(x + delta) - tan(x))/delta, delta, 0)
   2
tan (x) + 1


更高階的微分可以使用 diff(func, var, n):

>>> diff(sin(2*x), x, 1)
2*cos(2*x)

>>> diff(sin(2*x), x, 2)
-4*sin(2*x)

>>> diff(sin(2*x), x, 3)
-8*cos(2*x)


SymPy 的 Symbol 可以用 .series(var, point, order) 轉成泰勒展開式(Taylor series):

>>> from sympy import Symbol, cos
>>> x = Symbol('x')
>>> cos(x).series(x, 0, 10)
     2    4     6      8
    x    x     x      x      / 10\
1 - -- + -- - --- + ----- + O\x  /
    2    24   720   40320
>>> (1/cos(x)).series(x, 0, 10)
     2      4       6        8
    x    5*x    61*x    277*x     / 10\
1 + -- + ---- + ----- + ------ + O\x  /
    2     24     720     8064


另外一個例子:

>>> from sympy import Integral, pprint
>>> y = Symbol("y")
>>> e = 1/(x + y)
>>> s = e.series(x, 0, 5)
>>> print(s)
1/y - x/y**2 + x**2/y**3 - x**3/y**4 + x**4/y**5 + O(x**5)
>>> pprint(s)
          2    3    4
1   x    x    x    x     / 5\
- - -- + -- - -- + -- + O\x /
y    2    3    4    5
    y    y    y    y


summation(f, (i, a, b)) 這個函數可以計算 f 函數從 a 到 b 的加總,也就是下面這個


summation 函數如果沒辦法計算出總和,就會顯示原本的加總公式。下面是一些範例:

>>> from sympy import summation, oo, symbols, log
>>> i, n, m = symbols('i n m', integer=True)
>>> summation(2*i - 1, (i, 1, n))
 2
n
>>> summation(1/2**i, (i, 0, oo))
2
>>> summation(1/log(n)**n, (n, 2, oo))
  oo
 ___
 \  `
  \     -n
  /   log (n)
 /__,
n = 2
>>> summation(i, (i, 0, n), (n, 0, m))      3    2
m    m    m
-- + -- + -
6    2    3
>>>  from sympy.abc import x
>>>  from sympy import factorial
>>>  summation(x**n/factorial(n), (n, 0, oo))
 x
e


在積分方面,SymPy 支援定積分(definite integration)與不定積分(indefinite integration),而積分的計算是使用 integrate() 函數。


>>> from sympy import integrate, erf, exp, sin, log, oo, pi, sinh, symbols
>>> x, y = symbols('x,y')
>>> integrate(6*x**5, x)
 6
x
>>> integrate(sin(x), x)
-cos(x)
>>> integrate(log(x), x)
x*log(x) - x
>>> integrate(2*x + sinh(x), x)
 2
x + cosh(x)


更複雜的例子:

>>> integrate(exp(-x**2)*erf(x), x)
  ____    2
\/ pi *erf (x)
--------------
      4


計算定積分:

>>> integrate(x**3, (x, -1, 1))
0
>>> integrate(sin(x), (x, 0, pi/2))
1
>>> integrate(cos(x), (x, -pi/2, pi/2))
2


瑕積分(improper integral)也同樣支援:

>>> integrate(exp(-x), (x, 0, oo))
1
>>> integrate(log(x), (x, 0, 1))
-1


繼續閱讀:
SymPy -- 使用 Python 幫你導煩人的數學公式(一)
SymPy -- 使用 Python 幫你導煩人的數學公式(二)
SymPy -- 使用 Python 幫你導煩人的數學公式(三)
SymPy -- 使用 Python 幫你導煩人的數學公式(四)
SymPy -- 使用 Python 幫你導煩人的數學公式(五)
本站已經搬家了,欲查看最新的文章,請至 G. T. Wang 新網站

沒有留言:

張貼留言