官方链接:https://pypi.org/project/pynverse/
安装
使用pip安装库:
pip install pynverse
用法
Pynverse提供了一个主要函数inversefunc
,它计算作为第一个参数以callable形式传递的函数f
的数值逆。
from pynverse import inversefunc
它可用于计算某些y_values
点的反函数:
cube = (lambda x: x**3)
invcube = inversefunc(cube, y_values=3)
# array(3.0000000063797567)
或者,如果未提供y_values
,则获得一个可计算任何其他点的逆值的可调用对象:
invcube = inversefunc(cube)
invcube(27)
# array(3.0000000063797567)
它要求函数在函数的范围内必须是连续且严格单调的(即纯递减或纯递增)。默认情况下,域包括所有实数,但是可以使用domain
参数限制其区间:
import numpy as np
inversefunc(np.cos, y_values=[1, 0, -1], # Should give [0, pi / 2, pi]
... domain=[0, np.pi])
# array([ 0. , 1.57079632, 3.14159265])
此外,参数open_domain
可用于指定开闭区间:
inversefunc(np.log10, y_values=-2, # Should give 0.01
... domain=0, open_domain=[True, False])
# array(0.0099999999882423)
或同时在两端设置开区间:
invtan = inversefunc(np.tan,
... domain=[-np.pi / 2, np.pi / 2],
... open_domain=True)
invtan([1, 0, -1]) # Should give [pi / 4, 0, -pi / 4]
array([ 7.85398163e-01, 1.29246971e-26, -7.85398163e-01])
可以使用args
参数将其他参数传递给函数,以更轻松地重用可调用项:
invsquare = inversefunc(np.power, args=(2), domain=0)
invsquare([4, 16, 64])
# array([ 2., 4., 8.])
在以下情况下,也可以提供间隔中函数的图像:在打开间隔结束时函数不连续且带有image
参数的情况下:
invmod = inversefunc(np.mod, args=(1), domain=[5,6],
... open_domain=[False,True], image=[0,1])
invmod([0.,0.3,0.5])
# array([ 5. , 5.3, 5.5])
另外,可以使用一个参数来检查结果中准确度的位数,如果不满足要求,则会发出警告:
inversefunc(np.log10, y_values=-8, # Should give 0.01
... domain=0, open_domain=True, accuracy=6)
pynverse\inverse.py:195: RuntimeWarning: Results obtained with less than 6 decimal digits of accuracy
# array(9.999514710830838e-09)
由于它与数组兼容,因此可以很容易地用于获得宽范围的逆。这些是将返回的数字逆可调用量与数组一起使用以绘制图表并将其与解析逆进行比较的一些示例,每个计算都简单地如下:
log = lambda x: np.log10(x)
invlog = scipy.misc.inversefunc(log, domain=0, open_domain=True)
x1=np.linspace(0.00001,10,100)
x2=np.linspace(-5,1,100)
ax1.plot(x1,log(y1),'b-')
ax2.plot(x2,invlog(x2),'b-')
invlog_a = lambda x: 10**x
ax2.plot(x2,invlog_a(x2),'r--')
特别是,对于分段函数的定义,提供了一个piecewise
效用函数,该函数可解决在处理标量和数组时的np.piecewise问题。例如,最后一个图的逆获得为:
from pynverse import inversefunc, piecewise
pw=lambda x: piecewise(x,[x<1,(x>=1)*(x<3),x>=3],[lambda x: x, lambda x: x**2, lambda x: x+6])
invpw =inversefunc(pw)