分享

sympy 的练习

 战神之家 2018-07-25

sympy 符号运算学习笔记

6.1 符号运算的初步例子

import sympy
  • 1
sympy.E**(sympy.I*sympy.pi) + 1
  • 1
0
  • 1
  • 2

函数的展开 sympy.expand()

x = sympy.symbols("x", real=True)
y = sympy.expand(sympy.exp(sympy.I*x), complex=True)
y
  • 1
  • 2
  • 3
I*sin(x) + cos(x)
  • 1
  • 2

泰勒级数 sympy.series()

tmp1 = sympy.series(sympy.cos(x), x, 0, 10)
tmp1
  • 1
  • 2
1 - x**2/2 + x**4/24 - x**6/720 + x**8/40320 + O(x**10)
  • 1
  • 2
tmp2 = sympy.series(sympy.sin(x), x, 0, 10)
tmp2
  • 1
  • 2
x - x**3/6 + x**5/120 - x**7/5040 + x**9/362880 + O(x**10)
  • 1
  • 2

定积分 sympy.integrate()

tmp3 = sympy.integrate(x*sympy.sin(x), x)
tmp3
  • 1
  • 2
-x*cos(x) + sin(x)
  • 1
  • 2

不定积分 sympy.integrate()

tmp4 = sympy.integrate(x*sympy.sin(x), (x, 0, 2*sympy.pi))
tmp4
  • 1
  • 2
-2*pi
  • 1
  • 2

利用定积分计算球的面积

x, y = sympy.symbols("x, y")
r = sympy.symbols("r", positive=True)
circle_area = 2*sympy.integrate(sympy.sqrt(r**2 - x**2), (x, -r, r))
circle_area
  • 1
  • 2
  • 3
  • 4
pi*r**2
  • 1
  • 2

对表达式中的符号进行替换 sympy.subs()

  • subs()的调用方式:
    expression.subs(x, y): 将计算式中的x替换成y
    expression.subs({x:y, u:v}): 使用字典进行多个替换
    expression.subs([(x,y), (u,v)]): 使用列表进行替换
circle_area = circle_area.subs(r, sympy.sqrt(r**2 - x**2))
circle_area
  • 1
  • 2
pi*(r**2 - x**2)
  • 1
  • 2
tmp4 = sympy.integrate(circle_area, (x, -r, r))
tmp4
  • 1
  • 2
4*pi*r**3/3
  • 1
  • 2

数值微分

  • 这里我们先定义三个符号对象x, h和f.其中定义f时设置cls参数为Function表示它是数学函数的符号。
x = sympy.symbols("x", real=True)
h = sympy.symbols("h", positive=True)
f = sympy.symbols("f", cls=sympy.Function)
  • 1
  • 2
  • 3
  • f是表示函数的符号,而f(x)是自变量为x的函数。
f_diff = f(x).diff(x, 1)
f_diff
  • 1
  • 2
Derivative(f(x), x)
  • 1
  • 2

调用as_finite_diff(),将一阶倒数转换为使用f(x), f(x-h), f(x-2h), f(x-3h)表达的四点公式:

expr_diff = sympy.Derivative.as_finite_difference(f_diff, [x, x-h, x-2*h, x-3*h])
expr_diff
  • 1
  • 2
11*f(x)/(6*h) - f(-3*h + x)/(3*h) + 3*f(-2*h + x)/(2*h) - 3*f(-h + x)/h
  • 1
  • 2

下面进行符号求导的运算

sym_dexpr = f_diff.subs(f(x), x*sympy.exp(-x**2)).doit()
sym_dexpr
  • 1
  • 2
-2*x**2*exp(-x**2) + exp(-x**2)
  • 1
  • 2

6.2 数学表达式

  • 符号
    数学符号用Symbol对象表示,符号对象的name属性是符号名,符号名在显示由此符号构成的表达式时使用。如下面的例子
x = sympy.symbols("我是X", real=True)
x.name
  • 1
  • 2
'我是X'
  • 1
  • 2
  • 数学公式中的符号一般都有特定的假设,例如m, n通常是整数,而z经常用来表示复数,在使用symbols()创建符号的时候可以通过关键字指定所创符号的假定。例如:
m, n = sympy.symbols("m, n", integer=True)
x = sympy.symbols("x", positive=True)
  • 1
  • 2

符号属性的查看

每个符号都有很多is_*属性,用来判断符号的各种假设条件。

[attr for attr in dir(x) if attr.startswith("is_") and attr.lower() == attr]
  • 1
['is_algebraic',
 'is_algebraic_expr',
 'is_antihermitian',
 'is_commutative',
 'is_comparable',
 'is_complex',
 'is_composite',
 'is_constant',
 'is_even',
 'is_finite',
 'is_hermitian',
 'is_hypergeometric',
 'is_imaginary',
 'is_infinite',
 'is_integer',
 'is_irrational',
 'is_negative',
 'is_noninteger',
 'is_nonnegative',
 'is_nonpositive',
 'is_nonzero',
 'is_number',
 'is_odd',
 'is_polar',
 'is_polynomial',
 'is_positive',
 'is_prime',
 'is_rational',
 'is_rational_function',
 'is_real',
 'is_symbol',
 'is_transcendental',
 'is_zero']
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

数值

  • sympy内部有一整套数值运算系统,sympy提供了一个S对象以方便用户将python的数值类型转换为sympy的数值类型。例如下面的例子
1/2 + 1/3
  • 1
0.8333333333333333
  • 1
  • 2
sympy.S(1)/2 + 1/sympy.S(3)
  • 1
5/6
  • 1
  • 2
  • 浮点数的转换 sympy.N()
print(sympy.N(sympy.pi, 50))
  • 1
3.1415926535897932384626433832795028841971693993751
  • 1
  • 2

输出格式的latex控制 %sympy_latex (此处有问题)

x, y = sympy.symbols("x, y")
expr = sympy.expand((x+y)**3)
expr
  • 1
  • 2
  • 3
x**3 + 3*x**2*y + 3*x*y**2 + y**3
  • 1
  • 2

运算符号

**S**ympy重新定义了所有的数学运算符和数学函数。

  • Add类表示加法
  • Mul表示乘法
  • Pow表示指数

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多