Python数值计算

  • sympy介绍
  • sympy内置符号
  • sympy内置函数
  • sympy实战
  • 求解函数
  • 求极限
  • 求导数
  • 解方程
  • 求积分


数值计算指有效使用数字计算机求数学问题近似解的方法与过程,以及由相关理论构成的学科。数值计算主要研究如何利用计算机更好的解决各种数学问题,包括连续系统离散化和离散形方程的求解,并考虑误差、收敛性和稳定性等问题。

在科研过程中,我们需要使用大量使用数值计算来帮助研究的顺利进行,本文将重点介绍如何使用Sympy库进行常用的数值计算。

sympy介绍

sympy是python的一个科学计算库,用强大的符号计算体系完成诸如多项式求值,求极限,求导,擅长求积分,解微分方程,级数展开,矩阵运算等功能。

sympy内置符号

  1. 自然对数:sympy.E
  2. 无穷大:sympy.oo
  3. 圆周率π:sympy.py
  4. 虚数单位i:sympy.I.
import sympy
import numpy as np

print(np.double(sympy.log(sympy.E*sympy.pi)))  # 2.1447298858494

sympy内置函数

  1. 正弦函数sympy.sin(num)
  2. 对数函数sympy.log(num)
  3. 求平方根函数sympy.sqrt(num)
  4. n次方根函数sympy.root(num,n)
  5. 求阶乘sympy.factorial(num)
  6. 特定数值计数python python计算数值_函数表达式求和sympy.summation
  7. 求导sympy.diff(func,x,n)
  8. 求积分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

求多重积分

特定数值计数python python计算数值_特定数值计数python_02

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

特定数值计数python python计算数值_函数表达式_03

import sympy
x, y = sympy.symbols('x y')
print(sympy.integrate(x*y, (x, 0, 1), (y, 0, 1/2)))  # 0.0625000000000000

求不定积分 特定数值计数python python计算数值_数值计算_04

import sympy
x = sympy.Symbol('x')

f = sympy.E ** x + 2 * x

print(sympy.integrate(f,x))  # output:x**2 + exp(x)

求曲线积分 特定数值计数python python计算数值_函数表达式_05沿直线从原点到点(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))