文章目录
前言
SymPy 是一个用 Python 编写的符号数学库,用于进行符号数学计算。可以进行符号化函数的创建,求导,解方程,微积分,微分方程等操作。
【注】:使用这个符号化库,最好使用jupyter演示效果最佳,打印出来的效果并不好,所以更加建议使用jupyter。
一、符号声明
创建数学上的符号,第一步就是要进行符号声明:
from sympy import symbols
x, y, z = symbols('x y z')
z
输出:
二、代数运算
进行函数的创建、表达式的展开、因式分解等
x, y, z = symbols('x y z')
f = (x+y+z)**2
f
输出:
g = x**2 + y**2 + z**2 + 2*x*y + 2*x*z + 2*y*z
g
输出:
f_ = f.expand() # 展开表达式
f_
输出:
g_ = g.factor() # 因式分解
g_
输出:
三、求解方程和方程组
1 求解一元方程
from sympy import symbols, Eq
x = symbols('x')
# 定义方程
eq1 = Eq(x**2 - 4, 0)
eq1
输出:
solutions = solve((eq1,), (x,))
solutions
输出:
2 求解方程组
from sympy import symbols, Eq, solve
x, y = symbols('x y')
# 定义方程组
eq1 = Eq(3*x + y, 1)
eq2 = Eq(x - 2*y, 3)
# 求解方程组
solutions = solve((eq1, eq2), (x, y))
solutions
输出:
四、微积分(求导(包括偏导)求积分等)
from sympy import diff, integrate
f = x**3 + 2*x**2 + x + 1
derivative = diff(f, x) # 求导数
integral = integrate(f, x) # 求不定积分
definite_integral = integrate(f, (x, 0, 1)) # 求定积分,从 0 到 1
1 求导(偏导)
from sympy import diff, integrate
x , y ,z = symbols('x y z')
f = x**2 + 2*x*y + y**2
df_dy = diff(f, y) # 对 y 求偏导
df_dy
输出:
2 求不定积分与定积分
from sympy import diff, integrate
x = symbols('x')
f = x**3 + 2*x**2 + x + 1
integral = integrate(f, x) # 求不定积分
integral
输出:
definite_integral = integrate(f, (x, 0, 1)) # 求定积分,从 0 到 1
definite_integral
输出:
五、解微分方程与微分方程组
1 解微分方程
from sympy import symbols, Function, dsolve
x = symbols('x')
y = Function('y')(x)
# 定义微分方程
ode = y.diff(x) - (x**2 + 1)
# 求解微分方程
solution = dsolve(ode)
solution
输出:
2 解微分方程组
from sympy import symbols, Function, Eq, dsolve
t = symbols('t')
x = Function('x')(t)
y = Function('y')(t)
# 定义微分方程组
eq1 = Eq(x.diff(t), -2*x + y)
eq2 = Eq(y.diff(t), x - 3*y)
# 求解微分方程组
solutions = dsolve((eq1, eq2))
solutions
solutions[0]
solutions[1]
下面我们玩个有意思的,机器学习中的损失函数
from sympy import symbols
J,w,b = symbols('J w b')
J = w**2 + b*w
J
输出:
dJ_dw = J.diff(w)
dJ_dw
输出:
dJ_dw.subs([(w,2),(b,3)])
输出:
总结
这个库完全就是完全数学符号化,很友好,很有意思。另外还有一些其他的数学操作,例如求极限或者求级数展开等。希望你能喜欢这个符号库,反正虽然用处不是很大的样子,但是我很喜欢。