Python数值计算
- sympy介绍
- sympy内置符号
- sympy内置函数
- sympy实战
- 求解函数
- 求极限
- 求导数
- 解方程
- 求积分
数值计算指有效使用数字计算机求数学问题近似解的方法与过程,以及由相关理论构成的学科。数值计算主要研究如何利用计算机更好的解决各种数学问题,包括连续系统离散化和离散形方程的求解,并考虑误差、收敛性和稳定性等问题。
在科研过程中,我们需要使用大量使用数值计算来帮助研究的顺利进行,本文将重点介绍如何使用Sympy库进行常用的数值计算。
sympy介绍
sympy是python的一个科学计算库,用强大的符号计算体系完成诸如多项式求值,求极限,求导,擅长求积分,解微分方程,级数展开,矩阵运算等功能。
sympy内置符号
- 自然对数:
sympy.E
- 无穷大:
sympy.oo
- 圆周率π:
sympy.py
- 虚数单位i:
sympy.I.
import sympy
import numpy as np
print(np.double(sympy.log(sympy.E*sympy.pi))) # 2.1447298858494
sympy内置函数
- 正弦函数
sympy.sin(num)
- 对数函数
sympy.log(num)
- 求平方根函数
sympy.sqrt(num)
- n次方根函数
sympy.root(num,n)
- 求阶乘
sympy.factorial(num)
- 求和
sympy.summation
- 求导
sympy.diff(func,x,n)
- 求积分
sympy.integrate(func,(x,a,b))
sympy实战
求解函数
基础案例一:
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
求多重积分
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
import sympy
x, y = sympy.symbols('x y')
print(sympy.integrate(x*y, (x, 0, 1), (y, 0, 1/2))) # 0.0625000000000000
求不定积分
import sympy
x = sympy.Symbol('x')
f = sympy.E ** x + 2 * x
print(sympy.integrate(f,x)) # output:x**2 + exp(x)
求曲线积分 沿直线从原点到点(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))