在科研过程中,我们需要使用大量使用数值计算来帮助研究的顺利进行,本文将重点介绍如何使用Sympy库进行常用的数值计算。
sympy是python的一个科学计算库,用强大的符号计算体系完成诸如多项式求值,求极限,求导,擅长求积分,解微分方程,级数展开,矩阵运算等功能。
sympy.E
sympy.oo
sympy.pi
sympy.I
import sympy
import numpy as np
print(np.double(sympy.log(sympy.E*sympy.pi))) # 2.1447298858494
sympy.sin(num)
sympy.log(num)
sympy.sqrt(num)
sympy.root(num,n)
sympy.factorial(num)
sympy.summation
sympy.diff(func,x,n)
sympy.integrate(func,(x,a,b))
基础案例一:
import sympy
import numpy as np
x = sympy.Symbol('x') # 定义一个符号,表示变量
fx = 2*x + 1 # 定义函数表达式
fx.evalf(subs={x:2}) # 使用evalf函数以传入变量的值,对函数表达式进行求解
# output:5.00000000000000
基础案例二:
import sympy
import numpy as np
x,y = sympy.symbols('x y') # 同时定义多个符号以表示变量
f = 2*x + y
f.evalf(subs={x:2}) # output:2.0x+y
f.evalf(subs={x:2,y:1}) # output:5.0
# 定义符号的方法也可使用sympy.abc方法
from sympy.abc import x,y
f2 = 2*x + y
print(f2) # output:2*x + y
import sympy
x = sympy.Symbol('x')
f1 = (x**2+2*x-1)/x
print(sympy.limit(f1,x,1)) # output:2
f2 = sympy.sin(x)/x
print(sympy.limit(f2,x,0)) # output:1
f3 = sympy.sin(x)/x
print(sympy.limit(f3,x,sympy.oo)) # output:0
# 为了方便观察,我们也可以直接导入sympy中的特定函数
from sympy import diff,asin,sqrt,sin
from sympy.abc import x,y # 这也是一种定义变量的方法
f1 = diff(asin(sqrt(sin(x))))
print(f1) # output:cos(x)/(2*sqrt(1 - sin(x))*sqrt(sin(x)))
# 求高阶导数
def func(x): # 定义x的函数
return x**3
print(diff(func(x),x,2)) # output:6*x
print(diff(func(x),x,2).subs(x,2)) # output:12 在x=2处求导
# 多元函数求偏导
def func(x,y): # 定义x,y的函数
return x**3+x**2*y
print(diff(func(x,y),x,2)) # output:2*(3*x + y)
import sympy
x = sympy.Symbol('x')
# 解方程:x^2-1 = 0
sympy.solve(x**2 - 1,x) # output:[-1, 1]
f = x**2-1
print(sympy.solve(f,x)) # 也可以将先对方程进行定义,再进行计算
# 解方程组
x,y = sympy.symbols('x y')
f1 = x + y - 1
f2 = x - y -3
sympy.solve([f1,f2],[x,y]) # output:{x: 2, y: -1}
求定积分
import sympy
x = sympy.Symbol('x')
f = 2 * x
# 传入函数表达式和积分变量、积分下限、上限
sympy.integrate(f,(x,0,1)) # output:1
求多重积分
∫ 0 3 ∫ 0 x 2 t d t d x \int_0^3 \int_0^x 2t dt dx ∫03∫0x2tdtdx
import sympy
t,x = sympy.symbols('t x')
f = 2 * t
g = sympy.integrate(f,(t,0,x)) # 分两次积分
print(sympy.integrate(g,(x,0,3))) # output:9
F ( x , y ) = ∫ 0 1 / 2 ∫ 0 1 x y d x d y F(x, y)=\int_{0}^{1 / 2} \int_{0}^{1} x y d x d y F(x,y)=∫01/2∫01xydxdy
import sympy
x, y = sympy.symbols('x y')
print(sympy.integrate(x*y, (x, 0, 1), (y, 0, 1/2))) # 0.0625000000000000
求不定积分 ∫ ( e x + 2 x ) d x \int (e^x+2x)dx ∫(ex+2x)dx
import sympy
x = sympy.Symbol('x')
f = sympy.E ** x + 2 * x
print(sympy.integrate(f,x)) # output:x**2 + exp(x)
求曲线积分 F ( x , y ) = ( x 2 ∗ y , y 3 ) F(x,y)=(x^2*y,y^3) F(x,y)=(x2∗y,y3)沿直线从原点到点(1,1)的积分
from sympy import *
def curv_integrate(f,c,x,t):
g = []
g.append(f[0].subs(x[0],c[0]).subs(x[1],c[1]))
g.append(f[1].subs(x[0],c[0]).subs(x[1],c[1]))
g.append(diff(c[0],t))
g.append(diff(c[1],t))
g.append(g[0]*g[2]+g[1]*g[3])
return integrate(g[4], t)
x = []
f = []
c = []
x.append(Symbol('x'))
x.append(Symbol('y'))
t = Symbol('t');
f.append(x[0]**2*x[1]) # 此处的x[0]为表达式中x,x[1]为表达式中y
f.append(x[1]**3)
#print(f) # f为积分式
c.append(t)
c.append(t)
#print(c) # c为积分路径,从[0,0]积分到[c[0],c[1]]
g = curv_integrate(f,c,x,t) # output:t**4/2
print(g.subs(t,1)-g.subs(t,0))