python在数学计算方面的应用之常用模块的使用

内容目录
  • 环境安装
    推荐安装anaconda,怎么装很简单,百度。

sympy使用介绍

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

  1. 常用的sympy内置符号
自然对数 sympy.E
import sympy

display(sympy.E)
display(float(sympy.E))

sympy.log(sympy.E)
    e
    2.718281828459045
    1
无穷 sympy.oo
import sympy

1/sympy.oo
    0
圆周率\( \pi \) sympy.pi
sympy.sin(sympy.pi)
    0
  1. 用sympy进行初等运算

常见的运算函数有:

  • 求对数函数sympy.log
  • 正弦函数sympy.sin
  • 求平方根函数sympy.sqrt
  • 求n次方根函数sympy.root
  • 求阶乘sympy.factorial
    等等
  1. 表达式与表达式求值

sympy可以用一符号系统来表示一个表达式,如函数、多项式等,并且可以进行求值。

# 定义x为一个符号,表示一个变量
import sympy

x = sympy.Symbol('x')
fx = 2*x + 1 # fx是一个表达式
fx.evalf(subs={x:2}) # 用evalf函数,传入变量的值,对表达式进行求值
    5.0
x,y = sympy.symbols('x,y') # 注意:定义多变量的时候,这里的symbols方法首字母是小写的

f = 2*x + y
f.evalf(subs={x:1,y:2}) # 以字典的形式传入多个变量的值

# 如果只传入一个变量的值,则输出将值代入后的表达式
f.evalf(subs={y:2}) 
\( 2.0x + 2.0 \)
  1. 求极限用sympy.limit
  2. 求导用sympy.diff

numpy使用介绍

numpy的使用在前面的文章介绍过了(numpy基本使用),这里就是再提一下,在绘制三维图标时,需要使用numpy中的mgrid函数。它会返回一个密集的多维网格,一般形式为np.mgrid[start:end:step], 其中start表示开始值,end表示结束坐标(不包括此点),step表示步长

import numpy as np

np.mgrid[-1:4:2]
array([-1,  1,  3])
np.mgrid[-1:4:2,-3:1:1]
array([[[-1, -1, -1, -1],
        [ 1,  1,  1,  1],
        [ 3,  3,  3,  3]],

       [[-3, -2, -1,  0],
        [-3, -2, -1,  0],
        [-3, -2, -1,  0]]])
np.mgrid[-1:4:2,-3:1:2]
array([[[-1, -1],
        [ 1,  1],
        [ 3,  3]],

       [[-3, -1],
        [-3, -1],
        [-3, -1]]])

scipy的使用介绍

scipy是世界上著名的python开源科学计算库,构建于numpy之上,功能更为强大,是较numpy更高阶的科学计算库。

附:求导的几种方式

  1. 使用sympy的diff函数,可以得到\(f(x)\)的导数表达式,给出数学表达式里数学符号描述符
  2. 使用scipy.misc模块下的derivative函数。
import numpy as np
from scipy.misc import derivative

def f(x):
    return x**5

print(derivative(f,2,dx=1e-6))
80.00000000230045

C:\Users\xhs20\AppData\Local\Temp\ipykernel_2416\782970982.py:7: DeprecationWarning: scipy.misc.derivative is deprecated in SciPy v1.10.0; and will be completely removed in SciPy v1.12.0. You may consider using findiff: https://github.com/maroba/findiff or numdifftools: https://github.com/pbrod/numdifftools
  print(derivative(f,2,dx=1e-6))

这里提示我们scipy.misc.derivative被弃用了,推荐使用findiff或者numdifftools。

  1. 使用numpy模块里的poly1d函数构造[latexf(x)[/latex],poly1d函数的形参是多项式的系数,最左侧的是最高此项的系数,构造的函数为多项式。numpy的polyder函数和deriv函数的作用差不多,都是对多项式求导,可以得到函数导数的表达式和在某点的导数。

例:对多项式\(x^5+2x^4+3x^2+5\)求导

import numpy as np

p = np.poly1d([1,2,0,3,0,5]) # 构造多项式
print(p)
   5     4     2
1 x + 2 x + 3 x + 5
print(np.polyder(p,1)) # 求一阶导数
   4     3
5 x + 8 x + 6 x
print(np.polyder(p,1)(1.0)) # 求一阶导数在x=1处的值
19.0
print(p.deriv(1)) # 求一阶导数
   4     3
5 x + 8 x + 6 x
print(p.deriv(1)(1.0)) # 求一阶导数在x=1处的值
19.0
  1. 使用findiff
    待更

  2. 使用numdifftools
    待更

发表回复