【数值计算库-超长笔记】Python-Mpmath库:高精度数值计算
原文链接:https://www.cnblogs.com/aksoam/p/18279394
更多精彩,关注博客园主页,不断学习!不断进步!
我的主页
csdn很少看私信,有事请b站私信
博客园主页-发文字笔记-常用
有限元鹰的主页 内容:
- ABAQUS数值模拟相关
- Python科学计算
- 开源框架,编程学习笔记
哔哩哔哩主页-发视频-常用
FE-有限元鹰的个人空间 内容:
- 模拟案例
- 网格划分
- 游戏视频,及其他搬运视频
文章目录
- 我的主页
- 博客园主页-发文字笔记-常用
- 哔哩哔哩主页-发视频-常用
- Python-Mpmath库:高精度数值计算
- 1. Introduction
- 1.2 Basic usage of mpmath
- 1.3 输出格式化
- 1.4 输出的小数点位数
- 2. BASIC FEATURES
- 2.1 Arbitrary-precision floating-point (mp)
- 2.2 Arbitrary-precision interval arithmetic (iv)
- 2.3 Double-precision arithmetic using Python’s builtin float and complex types (fp)
- 2.4 基本函数
- 2.4 实用函数
- 2.4.1 converion and printing
- 2.4.2 算术运算
- 2.4.3 复数相关函数
- 2.4.4 处理整数和小数
- 2.4.5 公差和近似比较
- 2.4.6 数组生成
- 2.5 plotting函数
- 2.5.1 2D plotting
- 3. 高级特性
- 3.1 矩阵
- 3.1.1 创建矩阵
- 3.1.2 向量
- 3.1.3 矩阵复制
- 3.1.4 矩阵运算
文章目录
- 我的主页
- 博客园主页-发文字笔记-常用
- 哔哩哔哩主页-发视频-常用
- Python-Mpmath库:高精度数值计算
- 1. Introduction
- 1.2 Basic usage of mpmath
- 1.3 输出格式化
- 1.4 输出的小数点位数
- 2. BASIC FEATURES
- 2.1 Arbitrary-precision floating-point (mp)
- 2.2 Arbitrary-precision interval arithmetic (iv)
- 2.3 Double-precision arithmetic using Python’s builtin float and complex types (fp)
- 2.4 基本函数
- 2.4 实用函数
- 2.4.1 converion and printing
- 2.4.2 算术运算
- 2.4.3 复数相关函数
- 2.4.4 处理整数和小数
- 2.4.5 公差和近似比较
- 2.4.6 数组生成
- 2.5 plotting函数
- 2.5.1 2D plotting
- 3. 高级特性
- 3.1 矩阵
- 3.1.1 创建矩阵
- 3.1.2 向量
- 3.1.3 矩阵复制
- 3.1.4 矩阵运算
Numpy 和 MpMath 都是 Python 中常用的数学库,它们都提供了许多数学函数和工具,但它们的设计目的和实现方式有所不同。Numpy 主要用于处理大规模的数值数据,而 MpMath 则专注于高精度计算和符号计算。
虽然 Numpy 和 MpMath 的设计目的不同,但它们之间可以进行互操作。具体来说,可以将 Numpy 数组转换为 MpMath 的高精度数值类型,然后使用 MpMath 的函数进行计算。同样地,也可以将 MpMath 的数值类型转换为 Numpy 数组,然后使用 Numpy 的函数进行计算。
Python-Mpmath库:高精度数值计算
Checking that it works
# import mpmath as mp
from mpmath import *
from icecream import ic
mp.dps = 50 # Set precision
print(mpf(2)**mpf('0.5'))
1. Introduction
1.2 Basic usage of mpmath
mpmath的数值类型: mpf(real float),mpc(complex float),matrix
print(mp.dps)
print(mp.cos(3.14))a1=mpf(4)
a2=mpf('4.0')
ic(a1,a2)
a3=mpf("1.25e6")
ic(a3)
a4=mpf("-inf")
ic(a4)a5=mpc(1,2)
ic(a5)
a6=mpc(complex(1,20))
ic(a6)ic(a5.conjugate()) # 共轭复数
ic(a5.real) # 实部
ic(a5.imag) # 虚部
Mpmath使用全局工作精度;它不跟踪单个数字的精度或准确性。执行算术运算或调用mpf()将结果舍入到当前的工作精度。工作精度由一个名为mp的上下文对象控制
print(mp)
# Mpmath settings:
# mp.prec = 169 [default: 53]
# mp.dps = 50 [default: 15]
# mp.trap_complex = False [default: False]# prec---二进制精度
# dps---十进制精度
# prec = 3.33*dps# 当创建一个新的mpf时,该值最多将与输入一样准确
#!!警告: 将mpmath数字与Python浮点数混合使用时要小心
mp.dps = 30
# bad
ic(mpf(10.8))# good
ic(mpf('10.8'))# also good
ic(mpf(108)/mpf(10))# ? 然而,0.5、1.5、0.75、0.125等通常作为输入是安全的,因为它们可以用Python浮点数精确地表示
1.3 输出格式化
# 设置 mp.pretty = True 可以输出更好看的结果mp.pretty = True
mpf(0.6)
# output: 0.599999999999999977795539507497mp.pretty = False
mpf(0.6)
# output: mpf('0.599999999999999977795539507496869')
1.4 输出的小数点位数
use mpmath.nstr() and mpmath.nprint() 函数.默认情况下打印数字的位数由工作精度决定。要指定要显示的位数,而不改变工作精度,
a=mpf(1)/6.0mp.nstr(a, 5)
# output: '0.16667'mp.nprint(a, 10)
# output: '0.1666666667'
2. BASIC FEATURES
mpmath中的高级代码是作为“上下文对象”上的方法实现的。上下文实现算术、类型转换和其他基本操作。上下文还保存诸如精度之类的设置,并存储缓存数据。提供了一些不同的上下文(具有基本兼容的接口),以便高级算法可以与底层算法的不同实现一起使用,从而允许不同的特性和速度-精度权衡。
目前,mpmath提供了以下上下文:
- Arbitrary-precision arithmetic (mp)
- A faster Cython-based version of mp (used by default in Sage, and currently only available there)
- Arbitrary-precision interval arithmetic (iv)
- Double-precision arithmetic using Python’s builtin float and complex types (fp)
2.1 Arbitrary-precision floating-point (mp)
mp支持任意精度,并且支持绝大多数函数,经过充分测试,充分优化.
2.2 Arbitrary-precision interval arithmetic (iv)
iv支持区间运算,但是在版本1.3.0中,iv还处于测试阶段,只支持少部分函数.
2.3 Double-precision arithmetic using Python’s builtin float and complex types (fp)
尽管mpmath通常是为任意精度算术设计的,但许多高级算法可以很好地处理普通的Python浮点数和复数,它们使用硬件双精度(在大多数系统上,这相当于53位精度).mp object的函数会把输入转换为mpmath numbers type. fp object则是将输入转换为Python的浮点数和复数类型.当需要进行大量的函数求值(数值积分、绘图等),并且当fp算法提供足够的精度时,这可以大大提高mp算法的速度。
基于以上优势,可以使用fp.func 进行运算.(使用func 或mp.func 都是mp的函数)
使用fp算法计算的结果可能比使用等效精度(mp)的mp计算的结果不那么精确.(mp.prec = 53),因为后者经常使用更高的内部精度。其精度高度依赖于:
- for some functions, fp almost always gives 14-15 correct digits; for others, results can be accurate to only 2-3 digits or even completely wrong.
- The recommended use for fp is therefore to speed up large-scale computations where accuracy can be verified in advance on a subset of the input set, or where results can be verified afterwards.
fp.pretty=True
u=fp.rand()print(u)
# 0.6473090346719316print(type(u))
# <class 'float'>m=fp.matrix([[1,2],[3,4]])**2print(m)
# [ 7.0 10.0]
# [15.0 22.0]print(type(m))
# <class 'mpmath.matrices.matrices.matrix'>
2.4 基本函数
fp bject 为基本函数 包装了Python的math和cmath模块。支持实数和复数,并自动为实数输入生成复数结果(数学会引发异常)
fp.sqrt(5)
# 2.23606797749979fp.sqrt(-5)
# 2.23606797749979jfp.sin(fp.pi/2)
# 1.0fp.power(-2,0.5)
# (8.659560562354934e-17+1.4142135623730951j)print(type(fp.power(-2,0.5)))
# <class 'complex'>
2.4 实用函数
2.4.1 converion and printing
# mp.mpmathify(x,strings=True)
# 能够将x转换为mpf or mpc类型fp.dps=15
fp.pretty = Truempmathify(3.5)
# mpf('3.5')mpmathify(3+4j)
#mpc(real='3.0', imag='4.0')mpmathify('3.5')
# mpf('3.5')# mpmath.nstr(x,n=6,**kwargs)
# 将mpf或mpc转换为具有n位有效数字的十进制字符串
# nprint(x,n=6) 会直接打印nstr()的字符串结果f=mp.mpf(1.53)
print(f)
nprint(f,n=12)
# 1.530000000000000026645352591
# 1.53
2.4.2 算术运算
包括加减乘除、取模、幂运算等。
# ! mpmath.fadd(x, y,**kwargs)
# 实现x+y,返回浮点数结果.可以自定义精度和舍入模式.默认精度是工作精度,
# kwargs中可以设置精度和舍入模式.:
# + prec,dps(int)--设置精度; exact=True--不四舍五入.
# + rounding(str)--设置舍入模式,可选'n'(default)--nearst,'f'--floor,'c'-ceiling,'d'-down,'u'-up.
x=mp.rand()
y=mp.rand()
ic(x,y)
nprint(mp.fadd(x,y,dps=5,rounding='u'))
# ic| x: mpf('0.936352251244129142275205120579475')
# y: mpf('0.118268786487759443295747691143063')
# 1.05462# ! mpmath.fsub(x, y,**kwargs)
# 实现x-y,返回浮点数结果.
x=mp.mpf(1.53)
y=mp.mpf(2.87)
print(x-y)
# -1.34000000000000007993605777301
print(mp.fsub(x,y))
# -1.34000000000000007993605777301# ! mpmath.fneg(x,**kwargs)
# 实现-x,返回浮点数结果.
print(mp.fneg(mp.mpf(2.5)))
# -2.5# ! mpmath.fmul(x, y,**kwargs)
# 实现x*y,返回浮点数结果.
x=mp.mpf(2.5)
y=mp.mpf(3.14)
print(x*y)
# 7.85000000000000031086244689504
print(mp.fmul(x,y))
# 7.85000000000000031086244689504a=mp.mpc(2,5)
b=mp.mpc(3,4)
print(a*b)
# (-14.0 + 23.0j)
print(mp.fmul(a,b))
# (-14.0 + 23.0j)# ! mpmath.fdiv(x, y,**kwargs)
# 实现x/y,返回浮点数结果.
x=mp.mpf(3)
y=mp.mpf(2)
print(x/y)
# 1.5
print(mp.fdiv(x,y))
# 1.5# ! mpmath.fmod(x,y)
# Converts 𝑦 and 𝑧 to mpmath numbers and returns 𝑦 mod 𝑧.
# For mpmath numbers, this is equivalent to x % y.
mp.fmod(100,3)
# mpf('1.0')
print(100%3)
# 1# ! mpmath.fsum(terms,absolute=False,squared=False,**kwargs)
# 计算一个array-like的terms的和.如果len(terms)>2,这会比python内置的sum函数快很多.
# + absolute=True--返回每一项的绝对值的总和.
# + squared=True--返回每一项的平方的总和.
mp.fsum([1,2,3,4,5])
# mpf('15.0')mp.fsum([1,-2,3,-4,5],absolute=True)
# mpf('15.0')
mp.fsum([1,-2,3,-4,5],absolute=False)
# mpf('3.0')mp.fsum([1,2,3,4,5],squared=True)
# mpf('55.0')# ! mpmath.fprod(factors)
# 计算一个array-like object的每一项的连续乘积.
# 如: fprod([1,2,3,4,5])=1*2*3*4*5=120
mp.fprod([1,2,3,4,5])
# mpf('120.0')# ! mpmath.fdot(A, B=None, conjugate=False)
# 接受两个array-like object A和B,计算A,B的点积. sum(A[i]*B[i]) ,i=0,...,len(A)-1.
# if conjugate is True, B is conjugated before multiplication.
# 如: fdot([1,2,3],[4,5,6])=1*4+2*5+3*6=32
mp.fdot([1,2,3],[4,5,6])
# mpf('32.0')
2.4.3 复数相关函数
fabs(x) :返回复数x的模或者实数x的绝对值.
arg(x):返回x的相位角(以弧度表示).-pi< arg(x) < pi .
sign(x) :返回x的符号,sign(x)=x/|x|.
re(x) :返回x的实部.
im(x) :返回x的虚部.
conj(x) :返回x的共轭复数 x ˉ \bar{x} xˉ
polar(x) :将复数x分解为极坐标形式(r,θ) x = r exp ( i θ ) x=r\exp(i\theta) x=rexp(iθ)
rect(r,θ) :将极坐标形式(r,θ)转换为复数形式 x = r ( cos θ + i sin θ ) x=r(\cos\theta+i\sin\theta) x=r(cosθ+isinθ)
>>> from mpmath import *
>>> mp.dps = 15; mp.pretty = True
>>> chop(rect(2, pi))
-2.0
>>> rect(sqrt(2), -pi/4)
(1.0 - 1.0j)
2.4.4 处理整数和小数
floor(x) : 向下取整数
ceil(x) : 向上取整数
nint(x) : 四舍五入取整数
frac(x) : 返回x的小数部分,frac(x)=x-floor(x)
>>> from mpmath import *
>>> mp.pretty = False
>>> frac(1.25)
mpf('0.25')
>>> frac(3)
mpf('0.0')
>>> frac(-1.25)
mpf('0.75')
2.4.5 公差和近似比较
chop(x, tol=None) : 去除小的实部或者虚部,或者将接近于0的转换为精确的0,x可以是数字或者iterable.The tolerance defaults to 100*eps.
almosteq(s, t, rel_eps=None, abs_eps=None) : 判断s-t是否小于给定的误差,rel_eps和abs_eps分别是相对误差和绝对误差.绝对误差=|s-t|,相对误差=|s-t|/max(|s|,|t|).
2.4.6 数组生成
fraction(p,q) ;给定两个整数p和q,返回分数p/q.比其他的精度更好
>>> from mpmath import *
>>> mp.dps = 15
>>> a = fraction(1,100)
>>> b = mpf(1)/100
>>> print(a); print(b)
0.01
0.01
>>> mp.dps = 30
>>> print(a); print(b) # a will be accurate
0.01
0.0100000000000000002081668171172
>>> mp.dps = 15
rand() : 随机生成一个mpf随机数,范围在[0,1)之间.
arrange(*args):返回mpf数组序列. 最后一个数不是b
- arrange(b):[0,1,2,…,x]
- arrange(a,b):[a,a+1,a+2,…,x]
b − 1 ≤ x < b b-1 \leq x < b b−1≤x<b
- arrange(a,b,h):[a,a+h,a+2h,…,x]
b − h ≤ x < b b-h \leq x < b b−h≤x<b
>>> from mpmath import *
>>> mp.dps = 15; mp.pretty = False
>>> arange(4)
[mpf('0.0'), mpf('1.0'), mpf('2.0'), mpf('3.0')]
>>> arange(1, 2, 0.25)
[mpf('1.0'), mpf('1.25'), mpf('1.5'), mpf('1.75')]
>>> arange(1, -1, -0.75)
[mpf('1.0'), mpf('0.25'), mpf('-0.5')]
linspace(start,end,num) :返回浮点数数组,从start到end均匀分成num个元素.默认包括end.元素之间的间隔 Δ = ( e n d − s t a r t ) / ( n u m − 1 ) \Delta=(end-start)/(num-1) Δ=(end−start)/(num−1)
>>> from mpmath import *
>>> mp.dps = 15; mp.pretty = False
>>> linspace(1, 4, 4)
[mpf('1.0'), mpf('2.0'), mpf('3.0'), mpf('4.0')]
使用 endpoint=False 可以排除end.此时: 元素之间的间隔 Δ = ( e n d − s t a r t ) / ( n u m + 1 ) \Delta=(end-start)/(num+1) Δ=(end−start)/(num+1)
>>> linspace(1, 4, 4, endpoint=False)
[mpf('1.0'), mpf('1.75'), mpf('2.5'), mpf('3.25')]
2.5 plotting函数
plot([cos, sin], [-4, 4]): 绘制cos和sin函数的图像,x轴范围为[-4,4].
2.5.1 2D plotting
This function requires matplotlib (pylab).
plot(f, xlim=[- 5, 5], ylim=None, points=200, file=None, dpi=None, singularities=[], axes=None)
给定一个函数f(x),或者一个函数序列[f1(x),f2(x),…,fn(x)],并指定x周范围xlim=[start,end],绘制2D图像
使用singularities可以在指定点,消除数值奇异或者无穷大值.例如tan函数
# 使用singularities绘制tan函数
from mpmath import *
plot(tan, [-2*pi, 2*pi],singularities=[-pi/2, pi/2,-1.5*pi,1.5*pi],points=10000)
# 不使用singularities绘制tan函数
from mpmath import *
plot(tan, [-2*pi, 2*pi],points=10000)
例如:
plot(lambda x: exp(x)*li(x), [1, 4])
plot([fresnels, fresnelc], [-4, 4])
plot([sqrt, cbrt], [-4, 4])
plot(lambda t: zeta(0.5+t*j), [-20, 20])
plot([floor, ceil, abs, sign], [-5, 5])
3. 高级特性
3.1 矩阵
3.1.1 创建矩阵
mpmath中的矩阵是使用字典实现的。只存储非零值,因此表示稀疏矩阵的成本很低。
最简单的矩阵创建方法是使用matrix()函数,指定矩阵维度,可以得到空矩阵;也可以基于列表创建矩阵,这在根据已知numpy数组创建矩阵时很有用.
# 创建空矩阵
>>> from mpmath import *
>>> mp.dps = 15; mp.pretty = False
>>> matrix(2)
matrix(
[['0.0', '0.0'],
['0.0', '0.0']])
>>> matrix(2, 3)
matrix(
[['0.0', '0.0', '0.0'],
['0.0', '0.0', '0.0']])
# 基于列表创建矩阵
>>> matrix([[1, 2], [3, 4]])
matrix(
[['1.0', '2.0'],
['3.0', '4.0']])
>>> mp.matrix(np.array([[1,2,5],[3,4,9]]))
matrix(
[['1.0', '2.0', '5.0'],['3.0', '4.0', '9.0']])
>>>mp.matrix(np.array([1,2,5,6]))
matrix(
[['1.0'],['2.0'],['5.0'],['6.0']])
>>>mp.matrix(np.array([[1,2,5,6]]))
matrix(
[['1.0', '2.0', '5.0', '6.0']])
访问matrix object的rows,cols属性可以得到矩阵的行数,列数.直接修改rows,cols可以改变矩阵的维度.(新增的元素为0,删除的元素会丢失)
>>> A = matrix(3, 2)
>>> A
matrix(
[['0.0', '0.0'],
['0.0', '0.0'],
['0.0', '0.0']])
>>> A.rows
3
>>> A.cols
2
>>> A.rows = 2
>>> A
matrix(
[['0.0', '0.0'],
['0.0', '0.0']])
索引矩阵元素的语法为:matrix[i,j],i表示行,j表示列.
>>> A = matrix(2)
>>> A[1,1] = 1 + 1j
>>> print(A)
[0.0 0.0]
[0.0 (1.0 + 1.0j)]
- 高级方法
zeros(rows, cols) : 创建rows行cols列的零矩阵
ones(rows, cols) : 创建rows行cols列的单位矩阵
eye(rows, cols) : 创建rows行cols列的单位矩阵
randmatrix(rows, cols) : 创建rows行cols列的随机矩阵
3.1.2 向量
向量也可以使用matrix表示(rows=1 or cols=1),行,列向量的创建方法:
# 创建列向量
>>> from mpmath import *
>>> a=matrix([1,2,3])
>>> a
matrix(
[['1.0'],['2.0'],['3.0']])
>>> a.rows
3
>>> a.cols
1
# 创建行向量
>>> b=matrix([[1,2,3]])
>>> b
matrix(
[['1.0', '2.0', '3.0']])
>>> b.rows
1
>>> b.cols
3
3.1.3 矩阵复制
- 直接打印矩阵,控制有效位数:
>>> print(randmatrix(3))
[ 0.782963853573023 0.802057689719883 0.427895717335467]
[0.0541876859348597 0.708243266653103 0.615134039977379]
[ 0.856151514955773 0.544759264818486 0.686210904770947]
>>> nprint(randmatrix(5), 3)
[2.07e-1 1.66e-1 5.06e-1 1.89e-1 8.29e-1]
[6.62e-1 6.55e-1 4.47e-1 4.82e-1 2.06e-2]
[4.33e-1 7.75e-1 6.93e-2 2.86e-1 5.71e-1]
[1.01e-1 2.53e-1 6.13e-1 3.32e-1 2.59e-1]
[1.56e-1 7.27e-2 6.05e-1 6.67e-2 2.79e-1]
由于matrix object属于mutable,因此可以直接修改元素的值,或者使用copy()方法复制矩阵.涉及到浅拷贝,深拷贝,赋值的概念,可以参考python的相关知识.
# 拷贝矩阵
>>> a=matrix([[1,2],[3,4]])
>>> a
matrix(
[['1.0', '2.0'],['3.0', '4.0']])
>>> b=a.copy()
>>> b
matrix(
[['1.0', '2.0'],['3.0', '4.0']])
>>> a[0,0]=0
>>> a
matrix(
[['0.0', '2.0'],['3.0', '4.0']])
>>> b
matrix(
[['1.0', '2.0'],['3.0', '4.0']])
# 直接赋值
>>> id(a)
2441463350224
>>> b=a
>>> id(b)
2441463350224 # 两个变量指向同一块内存空间
>>> b
matrix(
[['1.0', '2.0'],['3.0', '4.0']])
>>> b[1,1]=100
>>> a
matrix(
[['1.0', '2.0'],['3.0', '100.0']])
>>> b
matrix(
[['1.0', '2.0'],['3.0', '100.0']])
matrix object可以使用.tolist()方法转换为嵌套列表
>>> a
matrix(
[['0.0', '2.0'],['3.0', '100.0']])
>>> a.tolist()
[[mpf('0.0'), mpf('2.0')], [mpf('3.0'), mpf('100.0')]]
>>> import numpy as np
>>> np.array(a.tolist())
array([[mpf('0.0'), mpf('2.0')],[mpf('3.0'), mpf('100.0')]], dtype=object)
>>> np.array(a.tolist())[1,1]
mpf('100.0')
3.1.4 矩阵运算
- 矩阵和实数之间的加减乘除,次幂运算(A^n)
>>> A = matrix([[1, 2], [3, 4]])
>>> B = matrix([[-2, 4], [5, 9]])
# 矩阵相加
>>> A + B
matrix(
[['-1.0', '6.0'],
['8.0', '13.0']])
>>> A - B
matrix(
[['3.0', '-2.0'],
['-2.0', '-5.0']])
# 举着相加需要注意维度的一致性
>>> A + ones(3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "...", line 238, in __add__
raise ValueError('incompatible dimensions for addition')
ValueError: incompatible dimensions for addition
# 矩阵乘法
>>> A * 2
matrix(
[['2.0', '4.0'],
['6.0', '8.0']])
>>> A / 4
matrix(
[['0.25', '0.5'],
['0.75', '1.0']])
>>> A - 1
matrix(
[['0.0', '1.0'],
['2.0', '3.0']])
- 矩阵之间的加减乘除运算,维度必须一致,否则会报错.
>>> A * B
matrix(
[['8.0', '22.0'],
['14.0', '48.0']])
# 行向量*列向量
>>> matrix([[1, 2, 3]]) * matrix([[-6], [7], [-2]])
matrix(
[['2.0']])
>>> A**2
matrix(
[['7.0', '10.0'],
['15.0', '22.0']])
- 矩阵求逆:A**(-1)
>>> A
matrix(
[['1.0', '2.0'],['3.0', '4.0']])
>>> A**-1
matrix(
[['-2.0', '1.0'],['1.5', '-0.5']])
>>> A*A**-1
matrix(
[['1.0', '1.0842021724855e-19'],['-2.16840434497101e-19', '1.0']])
- 矩阵转置:A.T
>>> A
matrix(
[['1.0', '2.0'],['3.0', '4.0']])
>>> A.T
matrix(
[['1.0', '3.0'],['2.0', '4.0']])
- 矩阵行列式
对于一个方阵,mpmath.det(A)可以计算其行列式.
>>> from mpmath import mp
>>> A = mp.matrix([[7, 2], [1.5, 3]])
>>> print(mp.det(A))
18.0
- 计算范数
矩阵和向量无法直接比较大小,但可以用范数(norm)来衡量矩阵和向量的大小.
范数:将矩阵或向量映射到非负实数值,使得该值表示矩阵或向量的大小.
mpmath.norm(x,p=2):给定x(iterable),计算x的 p 范数 = ( ∑ k ∣ x k ∣ p ) 1 / p , 1 ≤ p ≤ ∞ p范数=(\sum_{k}|x_k|^p)^{1/p},\quad 1 \leq p \leq \infty p范数=(∑k∣xk∣p)1/p,1≤p≤∞.
特别的:如果x不是iterable,则返回absmax(x).
p=1: 绝对值范数,即 ∑ k ∣ x k ∣ \sum_{k}|x_k| ∑k∣xk∣
p=2: 二范数(标准欧几里得向量范数),即 ∑ k ∣ x k ∣ 2 \sqrt{\sum_{k}|x_k|^2} ∑k∣xk∣2
p=inf: 最大范数,即 max ∣ x k ∣ \max{|x_k|} max∣xk∣
需要注意的是: 如果x是矩阵,且p=2,则返回Frobenius范数,即 ∑ i , j ∣ A i j ∣ 2 \sqrt{\sum_{i,j}|A_{ij}|^2} ∑i,j∣Aij∣2. 对于算子矩阵规范,使用mnorm()代替
>>> A
matrix(
[['1.0', '2.0'],['3.0', '4.0']])
>>> 1+4+9+16
30
>>> sqrt(30)
mpf('5.4772255750516612')
>>> norm(A,p=2)
mpf('5.4772255750516612')
mpmath.mnorm(A, p=1): 计算矩阵A的矩阵(算子)p-范数.1.3.0版本支持p=1,inf.
特别的:
p=1: 矩阵(算子)max column sum 范数,即 m a x ∑ i ∣ A i j ∣ max{\sum_{i} |A_{ij}|} max∑i∣Aij∣.
p=inf: 矩阵(算子)max row sum 范数,即 m a x ∑ j ∣ A i j ∣ max{\sum_{j} |A_{ij}|} max∑j∣Aij∣.
p=‘f’: 矩阵(算子)Frobenius范数,相当于elementwise 2-norm.Frobenius范数是谱范数的近似值,且满足:
Frobenius范数缺乏一些范数应有的数学性质
>>> from mpmath import *
>>> mp.dps = 15; mp.pretty = False
>>> A = matrix([[1, -1000], [100, 50]])
>>> mnorm(A, 1)
mpf('1050.0')
>>> mnorm(A, inf)
mpf('1001.0')
>>> mnorm(A, 'F')
mpf('1006.2310867787777')
# 矩阵(算子)Frobenius范数与elementwise 2-norm的比较
>>> A
matrix(
[['1.0', '2.0'],['3.0', '4.0']])
>>> norm(A,p=2)
mpf('5.4772255750516612')
>>> mnorm(A,p='f')
mpf('5.4772255750516612')
未完待续…2024.07.02
相关文章:
【数值计算库-超长笔记】Python-Mpmath库:高精度数值计算
原文链接:https://www.cnblogs.com/aksoam/p/18279394 更多精彩,关注博客园主页,不断学习!不断进步! 我的主页 csdn很少看私信,有事请b站私信 博客园主页-发文字笔记-常用 有限元鹰的主页 内容…...
昇思25天学习打卡营第6天|函数式自动微分
函数式自动微分 相关前置知识复习 深度学习的重点之一是神经网络。而神经网络很重要的一环是反向传播算法,这个算法用于调整神经网络的权重。 反向传播算法 这里举例说明反向传播在做什么。 假设你是一个学生,一次考试过后,你收到了一份老…...
作业7.2
用结构体数组以及函数完成: 录入你要增加的几个学生,之后输出所有的学生信息 删除你要删除的第几个学生,并打印所有的学生信息 修改你要修改的第几个学生,并打印所有的学生信息 查找你要查找的第几个学生,并打印该的学生信息 1 /*…...
PCL 点云聚类(基于体素连通性)
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里的思路很简单,我们通过将点云转换为体素,基于体素的连通性实现对点云的聚类(有点类似于欧式聚类),不过这种方式进行的聚类有些粗糙,但聚类速度相对会快很多,具体的实现效果可以详细阅读代码。 二、实现代…...
python自动化运维--DNS处理模块dnspython
1.dnspython介绍 dnspython是Pyhton实现的一个DNS工具包,他几乎支持所有的记录类型,可以用于查询、传输并动态更新ZONE信息,同事支持TSIG(事物签名)验证消息和EDNS0(扩展DNS)。在系统管理方面&a…...
成人职场商务英语学习柯桥外语学校|邮件中的“备注”用英语怎么说?
在英语中,"备注"通常可以翻译为"Notes" 或 "Remarks"。 这两个词在邮件中都很常用。例如: 1. Notes Notes: 是最通用和最常见的表达,可以用在各种情况下,例如: 提供有关电子邮件内容的附加信息 列…...
AndroidStudio报错macMissing essential plugin
电脑重启后打开studio: Missing essential plugin: org.jetbrains.android Please reinstall Android Studio from scratch. 无法使用 对应Mac下disabled_plugins.txt位于如下目录: /Users/ACB/Library/Application Support/Google/AndroidStudio4.2 …...
doris集群物理部署保姆级教程
doris物理安装 1、安装要求 Linux 操作系统版本需求 查看CentOs版本(>7.1) cat /etc/redhat-release 1)设置系统最大打开文件句柄数 vi /etc/security/limits.conf soft nofile 65536hard nofile 65536 echo ‘’’ soft nofile 655360hard nofile 655…...
探囊取物之多形式登录页面(基于BootStrap4)
基于BootStrap4的登录页面,支持手机验证码登录、账号密码登录、二维码登录、其它统一登录 低配置云服务器,首次加载速度较慢,请耐心等候;演练页面可点击查看源码 预览页面:http://www.daelui.com/#/tigerlair/saas/pr…...
【ONLYOFFICE】| 桌面编辑器从0-1使用初体验
目录 一. 🦁 写在前面二. 🦁 在线使用感受2.1 创建 ONLYOFFICE 账号2.2 编辑pdf文档2.3 pdf直接创建表格 三. 🦁 写在最后 一. 🦁 写在前面 所谓桌面编辑器就是一种用于编辑文本、图像、视频等多种自媒体的软件工具,具…...
20、PHP字符串的排列(含源码)
题目: PHP字符串的排列? 描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列。 例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 输入描述: 输入一个字符串,长度不超过9(可…...
Linux 标准IO的fopen和fclose
getchar(),putchar() ‐‐‐‐ 一个字符 gets(buf),puts(buf) ‐‐‐‐ 一串字符 scanf(),printf() ‐‐‐‐ 一个字符,一串字符都可以 fopen函数的形式 FILE * fopen(constchar *path , cost char *mode) /* * description : 打开一个文件 * param ‐ path…...
一个计算密集小程序在不同CPU下的表现
本文比较了几款CPU对同一测试程序的比较结果,用的是Oracle公有云OCI上的计算实例,均分配的1 OCPU,内存用的默认值,不过内存对此测试程序运行结果不重要。 本文只列结果,不做任何评价。下表中,最后一列为测…...
圈子系统搭建教程,以及圈子系统的功能特点,圈子系统,允许二开,免费源码,APP小程序H5
圈子是一款社区与群组的交友工具。你可以在软件内创造一个兴趣的群组从而达到按圈子来交友的效果用户可以根据自己的兴趣爱好。 1. 创建圈子 轻松创建专属圈子,支持付费型社群。 2. 加入圈子 加入不同圈子,设置不同名片,保护隐私。 3. 定…...
递归算法练习
112. 路径总和 package Tree;import java.util.HashMap; import java.util.Map;class TreeNode {int val;TreeNode left;TreeNode right;public TreeNode(int val) {this.val val;} }/*** 求 树的路径和* <p>* 递归 递减* <p>* 询问是否存在从*当前节点 root 到叶…...
WebDriver 类的常用属性和方法
目录 🎍简介 🎊WebDriver 核心概念 🎉WebDriver 常用属性 🎁WebDriver 常用方法 🐷示例代码 🎪注意事项 🎐结语 🧣参考资料 🎍简介 Selenium WebDriver 是一个用…...
基于x86+FPGA+AI轴承缺陷视觉检测系统,摇枕弹簧智能检测系统
一、承缺陷视觉检测系统 应用场景 轴类零件自动检测设备,集光、机、软件、硬件,智能图像处理等先进技术于一体,利用轮廓特征匹配,目标与定位,区域选取,边缘提取,模糊运算等算法实现人工智能高…...
短剧小程序系统cps分销开发搭建
短剧小程序系统CPS分销开发搭建是一个相对复杂但具有广阔商业前景的过程。以下是关于短剧小程序系统CPS分销开发搭建的详细步骤和要点: 需求分析与市场调研: 深入了解市场需求、用户画像和竞品分析,明确产品定位和功能需求。研究目标用户的消…...
代理IP的10大误区:区分事实与虚构
在当今的数字时代,代理已成为在线环境不可或缺的一部分。它们的用途广泛,从增强在线隐私到绕过地理限制。然而,尽管代理无处不在,但仍存在许多围绕代理的误解。在本博客中,我们将探讨和消除一些最常见的代理误解&#…...
数组-长度最小的子数组
M长度最小的子数组(leetcode209) /*** param {number} target* param {number[]} nums* return {number}*/ var minSubArrayLen function(target, nums) {const n nums.length;let ans n 1;let sum 0; // 子数组元素和let left 0; // 子数组…...
深度学习之交叉验证
交叉验证(Cross-Validation)是一种用于评估和验证机器学习模型性能的技术,尤其是在数据量有限的情况下。它通过将数据集分成多个子集,反复训练和测试模型,以更稳定和可靠地估计模型的泛化能力。常见的交叉验证方法有以…...
使用 Python 五年后,我发现学 python 必看这三本书!少走一半弯路
第一本 《Python编程-从入门到实践》 适合零基础的读者 豆瓣评分:9.1 推荐指数:5颗星 推荐理由: 本书是针对所有层次的 Python 读者而作的 Python 入门书。全书分为两部分: 第一部分介绍使用Python 编程所必须了解的…...
React@16.x(45)路由v5.x(10)源码(2)- history
目录 1,作用1.1,createBrowserHistory1.2,createHashHistory1.3,createMemoryHistory 2,history 对象的属性2.1,action2.2,push / replace / go / goBack / goForward2.3,location2.…...
grpc学习golang版( 八、双向流示例 )
系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 第五章 多proto文件示例 第六章 服务器流式传输 第七章 客户端流式传输 第八章 双向流示例 文章目录 一、前言二、定义proto文件三、编写server服务端四、编写client客…...
SpringBoot学习05-[SpringBoot的嵌入式Servlet容器]
SpringBoot的嵌入式Servlet容器 嵌入式Servlet容器servlet容器-嵌入式servlet容器配置修改通过全局配置文件修改修改添加实现了WebServerFactoryCustomizer接口的bean来进行修改 servlet容器-注册servlet三大组件应该如何注册呢?servlet3.0规范提供的注解方式进行注…...
查看Oracle是哪个Oracle_home 下启动的
[rootrac1 ~]# ps -ef|grep smon root 413 24903 0 22:30 pts/0 00:00:00 grep --colorauto smon root 27165 1 0 22:11 ? 00:00:09 /u01/app/19.0.0/grid/bin/osysmond.bin grid 27784 1 0 22:12 ? 00:00:00 asm_smon_ASM1 oracl…...
重温react-06(初识函数组件和快速生成格式的插件使用方式)
开始 函数组件必然成为未来发展的趋势(个人见解),总之努力的去学习,才能赚更多的钱.加油呀! 函数组件的格式 import React from reactexport default function LearnFunction01() {return (<div>LearnFunction01</div>) }以上是函数式组件的组基本的方式 快捷生…...
【高考志愿】仪器科学与技术
目录 一、专业介绍 1.1 专业概述 1.2 专业方向 1.3 主要课程 二、专业技能与素质培养 三、就业前景 四、个人发展规划建议 五、仪器科学与技术专业排名 六、总结 一、专业介绍 1.1 专业概述 仪器科学与技术专业是一门综合性极强的学科,它融合了测量、控制…...
Elasticsearch的Mapping
Elasticsearch的Mapping Mapping是什么 Mapping定义了ES的索引结构、字段类型、分词器等,是索引的一部分。类似于关系型数据库中“表结构”的概念,在 Mapping 里也包含了一些属性,比如字段名称、类型、字段使用的分词器、是否评分、是否创建…...
【vocabulary in use (elementary)】6 Health and Illness
very well / fine 很好 ill sick 生病 I feel terrible 感觉很差 headache 头疼 toothache 牙疼 dentist medicine 药 pills 片药 caps 胶囊 aspirin 阿司匹林 antibiotic 抗生素 vitamin 维生素 painkiller 止痛药 dentist 牙医 got a cold 感冒 for many years 很多年 all th…...
探囊取物之多形式注册页面(基于BootStrap4)
基于BootStrap4的注册页面,支持手机验证码注册、账号密码注册 低配置云服务器,首次加载速度较慢,请耐心等候;演练页面可点击查看源码 预览页面:http://www.daelui.com/#/tigerlair/saas/preview/ly4gax38ub9j 演练页…...
【C++进阶学习】第五弹——二叉搜索树——二叉树进阶及set和map的铺垫
二叉树1:深入理解数据结构第一弹——二叉树(1)——堆-CSDN博客 二叉树2:深入理解数据结构第三弹——二叉树(3)——二叉树的基本结构与操作-CSDN博客 二叉树3:深入理解数据结构第三弹——二叉树…...
【RabbitMQ实战】Springboot 整合RabbitMQ组件,多种编码示例,带你实践 看完这一篇就够了
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、对RabbitMQ管理界面深入了解1、在这个界面里面我们可以做些什么? 二、编码练习(1)使用direct exchange(直连型交换机)&a…...
【你也能从零基础学会网站开发】理解DBMS数据库管理系统架构,从用户到数据到底经历了什么
🚀 个人主页 极客小俊 ✍🏻 作者简介:程序猿、设计师、技术分享 🐋 希望大家多多支持, 我们一起学习和进步! 🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注 其实前面我们也…...
Vue.js 中的API接口封装实战与详解
在开发Web应用的过程中,我们常常需要和服务器进行数据交互,这就涉及到了API接口的调用。在Vue.js项目中,为了提高代码复用性、可维护性和降低错误率,我们将API接口进行合理的封装显得尤为重要。本文将详细介绍如何在Vue.js项目中实…...
职场内卷、不稳定、没前景……怎么破?
经济下行期,大家普遍反映混职场艰难。 再深究下,发现造成职场艰难的原因主要有三个: 1.内卷:狼多肉少 2.不稳定:裁员总是不期而遇 3.没前景:明知过几年会被优化,但无法改变,死气沉沉…...
LeetCode 算法:将有序数组转换为二叉搜索树 c++
原题链接🔗:将有序数组转换为二叉搜索树 难度:简单⭐️ 题目 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。 示例 1: 输入:nums [-10,-3,0,5,9]…...
智慧公厕系统改变了人们对服务区公厕的看法
在过去,服务区公厕常常给人留下脏乱差的印象,成为人们在长途旅行途中不愿停留的地方。然而,随着智慧科技的不断发展和应用,智慧公厕系统的出现改变了人们对服务区公厕的看法,为公共卫生设施的提升注入了新的活力。 一、…...
终极指南:RNNS、Transformers 和 Diffusion 模型
一、说明 作为广泛使用这些工具和模型的人,我的目标是解开 RNN、Transformer 和 Diffusion 模型的复杂性和细微差别,为您提供详细的比较,为您的特定需求提供正确的选择。 无论您是在构建语言翻译系统、生成高保真图像,还是处理时间…...
WPF UI 3D 基本概念 点线三角面 相机对象 材质对象与贴图 3D地球 光源 变形处理 动作交互 辅助交互插件 系列三
WPF UI交互专题 平面图形 Path Drawing 绘图 渐变 Brush 矩阵 Transform 变形 阴影效果 模糊效果 自定义灰度去色效果 系列二-CSDN博客 1软件中的3D基本概念 WPF 中 3D 功能的设计初衷并非提供功能齐全的游戏开发平台。 WPF 中的 3D 图形内容封装在 Viewport3D 元素中&#x…...
分子AI预测赛Task2笔记
下面所述比较官方的内容都来自官方文档 Task2:赛题深入解析 - 飞书云文档 (feishu.cn) 赛题背景 强调了人工智能在科研领域&…...
剖析DeFi交易产品之UniswapV4:创建池子
本文首发于公众号:Keegan小钢 创建池子的底层函数是 PoolManager 合约的 initialize 函数,其代码实现并不复杂,如下所示: function initialize(PoolKey memory key, uint160 sqrtPriceX96, bytes calldata hookData)externalover…...
速盾:cdn内容分发服务有哪些优势?
CDN(Content Delivery Network)是指内容分发网络,是一种将网络内容分发到全球各个地点的技术和架构。在现代互联网架构中,CDN已经变得非常重要。CDN通过将内容分发到靠近用户的服务器上,提供高速、高效的服务。下面是C…...
如何利用React和Python构建强大的网络爬虫应用
如何利用React和Python构建强大的网络爬虫应用 引言: 网络爬虫是一种自动化程序,用于通过互联网抓取网页数据。随着互联网的不断发展和数据的爆炸式增长,网络爬虫越来越受欢迎。本文将介绍如何利用React和Python这两种流行的技术,…...
炎黄数智人:招商局集团推出AI数字员工“招小影”
引言 在全球数字化浪潮的推动下,招商局集团开启了一项具有里程碑意义的项目。招商局集团将引入AI数字员工“招小影”,这一举措不仅彰显了招商局集团在智能化转型方面的坚定决心,也为企业管理模式的创新注入了新的活力。 “招小影”是一款集成…...
【开发篇】明明配置跨域声明,为什么却仍可以发送HTTP请求
一、问题 在SpringBoot项目中,明确指定仅允许指定网站跨域访问: 为什么开发人员却仍旧可以通过HTTP工具调用接口? 二、为什么 在回答这个问题之前,我们首先要了解一下什么是CORS! 1、什么是CORS CORS的全称为跨域资源…...
单片机中有FLASH为啥还需要EEROM?
在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!! 一是EEPROM操作简单&…...
Qt的源码目录集合(V5.12.12版本)
目录 1.QObject实现源码 2.qml中的ListModel实现源码 3.qml中的JS运行时的环境和数据类型源码 1.QObject实现源码 .\Qt\Qt5.12.12\5.12.12\Src\qtbase\src\corelib\kernel\qobject.h .\Qt\Qt5.12.12\5.12.12\Src\qtbase\src\corelib\kernel\qobject.cpp .\Qt\Qt5.12.12\5…...
记因hive配置文件参数运用不当导致 sqoop MySQL导入数据到hive 失败的案例
sqoop MySQL导入数据到hive报错 ERROR tool.ImportTool: Encountered IOException running import job: java.io.IOException: Hive exited with status 64 报错解释: 这个错误表明Sqoop在尝试导入数据到Hive时遇到了问题,导致Hive进程异常退出。状态码…...
自动化邮件通知:批处理脚本的通讯增强
自动化邮件通知:批处理脚本的通讯增强 引言 批处理脚本在自动化任务中扮演着重要角色,无论是在系统管理、数据处理还是日常任务调度中。然而,批处理脚本的自动化能力可以通过集成邮件通知功能得到显著增强。当脚本执行完毕或在执行过程中遇…...
uniapp 封装请求
新建request文件夹 下新建index.js 和index.js 或者创建units文件放入index.js 和api文件夹放入index.js(api.js)//看公司规范 1. index.js // 全局请求封装 // const base_url http://localhost:8080/devapi var base_url process.env.NODE_ENV development ? http://…...
计算两个经纬度之间的球面距离(基于Mysql和PHP实现)
计算两个经纬度之间的球面距离 1、MySQL实现方式 - 基于空间函数(ST_Distance_Sphere)实现 前置条件:确保您使用的是 MySQL 8.0 或更高版本,因为较早的版本对地理空间的支持有限。 1.1 创建表和索引 说明:设置 location 为 point 类型 #…...
如何远程访问运行电脑上运行的程序?
远程访问运行电脑上运行的程序的实用指南 一、使用远程桌面协议(RDP)适用场景配置步骤 二、利用虚拟网络计算(VNC)适用范围配置过程 三、通过 SSH 隧道主要针对实现方式 四、借助 TeamViewer 等第三方工具特点使用方法 五、注意事…...
GuLi商城-商品服务-API-品牌管理-效果优化与快速显示开关
<template><div class"mod-config"><el-form :inline"true" :model"dataForm" keyup.enter.native"getDataList()"><el-form-item><el-input v-model"dataForm.key" placeholder"参数名&qu…...
论文浅尝 | 从最少到最多的提示可在大型语言模型中实现复杂的推理
笔记整理:王泽元,浙江大学博士 链接:https://openreview.net/forum?idWZH7099tgfM 1. 动机 尽管深度学习已经取得了巨大的成功,但它与人类智慧仍然存在一些明显差距。这些差距包括以下几个方面:1)学习新任…...
笔记本电脑部署VMware ESXi 6.0系统
正文共:888 字 18 图,预估阅读时间:1 分钟 前面我们介绍了在笔记本上安装Windows 11操作系统(Windows 11升级不了?但Win10就要停服了啊!来,我教你!),也介绍了…...
姜堰开发区紧扣“三个一”扎实开展防灾减灾宣传活动
近日,姜堰经济开发区结合区域特点,围绕“人人讲安全、个个会应急——着力提升基层防灾避险能力”宣传主题,开展“三个一”宣传活动,包括“一场防灾减灾科普宣教、一次防灾减灾应急演练和一次主题宣传进社区活动”,以点带面,全方位宣传灾害知识和防范技能,提升公众应急避…...
软件工程基础
软件工程基础 甘特图(Gantt Chart) 关键字:开始、结束时间,并行关系 皮特图(PERT Chart) 关键字:开始、结束时间,依赖关系 黑盒测试 黑盒测试是一种软件测试方法,它专…...
无线麦克风什么牌子的音质效果好?一文读懂无线领夹麦克风哪款好
在当今的数字时代,无线技术已经深入到我们生活的方方面面,无线领夹麦克风便是其中的佼佼者。它们为讲者、表演者以及那些需要在移动中讲话的人们提供了解放双手和自由移动的可能。本文旨在探讨无线领夹麦克风的多种用途,以及如何挑选最适合…...
LLM - 模型下载与 git-lfs 安装
目录 一.引言 二.安装 git lfs 1.使用 apt-get 安装 2.使用 Brew 安装 3.LFS 验证 三.总结 一.引言 在 HuggingFace 上下载模型时提供一个 git clone 的指令,执行后可以下载对应模型的模型文件: 但是本机还没有 git lfs 命令: git: lfs is not a git comman…...
mysql内存和磁盘的关系
mysql内存和磁盘的关系 1.MySQL的内存和磁盘之间的关系是密切的。MySQL的数据存储在磁盘上,但为了高效地执行查询操作,它也会将数据页(每个页通常为16KB)读入内存。MySQL的缓冲池(buffer pool)是在内存中的…...
一图读懂足坛反腐系列案时间线
【来源:检察日报正义网(ID:JCRB_ZYW)】...