Python科学计算库SymPy初探
SymPy基础应用
SymPy基础应用¶
Rational值¶
SymPy 具有用于处理有理数的Rational。 有理数是可以表示为两个整数(分子 p 和非零分母 q)的商或分数 p / q 的任何数字。
In [1]:
from sympy import Rational
r = Rational(1/10)
val = r * 3
print(val.evalf())
val2 = 1/10 * 3
print(val2)
In [2]:
print(type(val))
print(type(val2))
In [3]:
print(val.evalf())
print(val2)
In [4]:
from sympy import pprint, Symbol, exp, sqrt
from sympy import init_printing
init_printing(use_unicode=True) # 对于某些字符,我们需要启用 unicode 支持
x = Symbol('x')
a = sqrt(2)
pprint(a)
print(a)
print("------------------------")
c = (exp(x) ** 2)/2
pprint(c)
print(c)
平方根¶
平方根是一个数字,乘以它会产生指定的数量。
In [5]:
from sympy import sqrt, pprint, Mul
x = sqrt(2)
y = sqrt(2)
pprint(Mul(x, y, evaluate=False)) # 使用evaluate属性推迟对乘法表达式的求值。
print('equals to ')
print(x * y)
In [6]:
Mul(x,y)
Out[6]:
SymPy 符号¶
符号计算适用于符号,以后可以对其进行求值。 使用符号之前,必须在 SymPy 中定义符号。
In [7]:
from sympy import Symbol, symbols
from sympy.abc import x, y
expr = 2*x + 5*y
print(expr)
a = Symbol('a')
b = Symbol('b')
expr2 = a*b + a - b
print(expr2)
i, j = symbols('i j')
expr3 = 2*i*j + i*j
print(expr3)
from sympy.abc import x, y
可以从sympy.abc模块导入符号。 它将所有拉丁字母和希腊字母导出为符号,因此我们可以方便地使用它们。
SymPy 规范表达形式¶
SymPy 会自动将表达式转换为规范形式。 SymPy 仅执行廉价操作; 因此,表达式可能无法求值为最简单的形式。
In [8]:
from sympy.abc import a, b
expr = b*a + -4*a + b + a*b + 4*a + (a + b)*3
print(expr)
SymPy 扩展代数表达式¶
使用expand()
,我们可以扩展代数表达式; 即该方法尝试消除幂和乘法。
In [9]:
from sympy import expand, pprint
from sympy.abc import x
expr = (x + 1) ** 2
pprint(expr)
print('-----------------------')
print('-----------------------')
expr = expand(expr)
pprint(expr)
SymPy 简化表达式¶
可以使用simplify()将表达式更改为更简单的形式。
In [10]:
from sympy import sin, cos, simplify, pprint
from sympy.abc import x,y
expr = sin(x+y) / (sin(y)*cos(x))
pprint(expr)
print('-----------------------')
expr = simplify(expr)
pprint(expr)
SymPy 比较表达式¶
SymPy 表达式与equals()
而不是==运算符进行比较。
In [11]:
from sympy import pprint, Symbol, sin, cos
x = Symbol('x')
a = cos(x)**2 - sin(x)**2
b = cos(2*x)
print(a.equals(b)) # 在应用该方法之前,SymPy 尝试简化表达式。
# we cannot use == operator
print(a == b)
SymPy 求值表达式¶
可以通过替换符号来求值表达式。
In [12]:
from sympy import pi
print(pi.evalf(10)) # 保留十位有效数字
In [13]:
# 通过用数字替换a和b符号来求值表达式
from sympy.abc import a, b
from sympy import pprint
expr = b*a + -4*a + b + a*b + 4*a + (a + b)*3
print(expr.subs([(a, 3), (b, 2)]))
SymPy 求解方程¶
用solve()
或solveset()
求解方程。
In [14]:
from sympy import Symbol, solve
x = Symbol('x')
sol = solve(x**2 - x, x)
print(sol)
solve()
的第一个参数是公式。 该公式以适合 SymPy 的特定形式编写; 即x**2 - x
代替x**2 = x
。 第二个参数是我们需要解决的符号。
或者,我们可以将Eq用于公式。
In [15]:
from sympy import pprint, Symbol, Eq, solve
x = Symbol('x')
eq1 = Eq(x + 1, 4)
pprint(eq1)
sol = solve(eq1, x)
print(sol)
In [16]:
from sympy.solvers import solveset
from sympy import Symbol, Interval, pprint
x = Symbol('x')
sol = solveset(x**2 - 1, x, Interval(0, 50))
print(sol)
使用solveset()
,我们找到了给定间隔的解决方案。
SymPy 序列¶
序列是其中允许重复的对象的枚举集合。 序列可以是有限的或无限的。 元素的数量称为序列的长度。 与集合不同,同一元素可以在序列中的不同位置出现多次。 元素的顺序很重要。
In [17]:
from sympy import summation, sequence, pprint
from sympy.abc import x
s = sequence(x, (x, 1, 10))
print(s)
pprint(s)
print(list(s))
print(s.length)
print(summation(s.formula, (x, s.start, s.stop)))
# print(sum(list(s)))
SymPy 极限¶
极限是函数(或序列)“接近”作为输入(或索引)“接近”某个值的值。
In [18]:
from sympy import sin, limit, oo
from sympy.abc import x,y
l1 = limit(1/x, x, oo)
print(l1)
l2 = limit(exp(x)/(y), x, 1)
print(l2)
In [19]:
from sympy import Matrix, pprint
M = Matrix([[1, 2], [3, 4], [0, 3]])
print(M)
pprint(M)
N = Matrix([2, 2])
print("---------------------------")
print("M * N")
print("---------------------------")
pprint(M*N)
SymPy 绘图¶
SymPy 包含用于绘图的模块。 它基于 Matplotlib 构建。
In [20]:
import sympy
from sympy.abc import x
from sympy.plotting import plot
plot(sin(x))
Out[20]:
一元函数的导函数¶
In [21]:
from sympy import *
x = symbols('x')
expr = sin(x) * exp(x)
pprint(diff(expr, x))
求不定积分¶
In [22]:
from sympy import *
x = symbols('x')
expr = exp(x) * sin(x) + exp(x) * cos(x)
pprint(integrate(expr, x))
求定积分¶
In [23]:
from sympy import *
x = symbols('x')
expr = exp(x) * sin(x) + exp(x) * cos(x)
pprint(integrate(expr, x, (x,-oo,oo)))
求微分方程的解¶
In [24]:
from sympy import *
y = Function('y')
t = Symbol('t')
sol = dsolve(Eq(y(t).diff(t, t) - y(t), exp(t)), y(t))
print(sol)
打印latex公式¶
In [25]:
from sympy import *
x = symbols('x')
expr = cos(x)**2
latex(Integral(expr, (x, 0, pi)))
Out[25]:
In [26]:
latex(expr)
Out[26]:
In [27]:
pprint(Integral(expr, (x, 0, pi)))