Python 如何提高matplotlib的精度?
我试图绘制一组需要高精度的极端浮点值。在我看来,matplotlib中存在精度限制。它不能超过1e28的规模 这是我用来显示图形的代码Python 如何提高matplotlib的精度?,python,numpy,matplotlib,precision,Python,Numpy,Matplotlib,Precision,我试图绘制一组需要高精度的极端浮点值。在我看来,matplotlib中存在精度限制。它不能超过1e28的规模 这是我用来显示图形的代码 import matplotlib.pyplot as plt import numpy as np x = np.array([1737100, 38380894.5188064386003616016502, 378029000.0], dtype=np.longdouble) y = np.array([-761889466548890634207433
import matplotlib.pyplot as plt
import numpy as np
x = np.array([1737100, 38380894.5188064386003616016502, 378029000.0], dtype=np.longdouble)
y = np.array([-76188946654889063420743355676.5, -76188946654889063419450832178.0, -76188946654889063450098993033.0], dtype=np.longdouble)
plt.scatter(x, y)
#coefficients = np.polyfit(x, y, 2)
#poly = np.poly1d(coefficients)
#new_x = np.linspace(x[0], x[-1])
#new_y = poly(new_x)
#plt.plot(new_x, new_y)
plt.xlim([x[0], x[-1]])
plt.title('U vs. r')
plt.xlabel('Distance r')
plt.ylabel('Total gravitational potential energy U(r)')
plt.show()
我希望中间点的位置高于其他两点。它需要非常高的精度。如何配置它?您当前的问题可能不是matplotlib,而是
np.longdouble
。要发现是否是这种情况,请运行np.finfo(np.longdouble)
。这将取决于机器,但在我的机器上,这表示我正在使用具有以下描述的float128
Machine parameters for float128
---------------------------------------------------------------
precision = 18 resolution = 1.0000000000000000715e-18
machep = -63 eps = 1.084202172485504434e-19
negep = -64 epsneg = 5.42101086242752217e-20
minexp = -16382 tiny = 3.3621031431120935063e-4932
maxexp = 16384 max = 1.189731495357231765e+4932
nexp = 15 min = -max
---------------------------------------------------------------
精度只是一个估计值(由于二进制和十进制表示),但18位是float128限制,并且您的特定数字只有在这之后才开始变得有趣
一个简单的测试是打印y[1]-y[0]
并查看是否得到了0.0
以外的内容
一个简单的解决方案是使用Pythonint
s,因为Python具有无限精度int
s,所以您可以捕获10*y
的大部分差异(或int
)。比如说:
x = np.array([1737100, 38380894.5188064386003616016502, 378029000.0], dtype=np.longdouble)
y = [-76188946654889063420743355676, -76188946654889063419450832178, -76188946654889063450098993033]
plt.scatter(x, [z-y[0] for z in y])
另一种解决方案是从一开始就表示数字,以便它们需要更容易接近的精度(即,去除大部分偏移)。另一个是使用高精度浮点库。这取决于你想走哪条路
还值得注意的是,至少对于我认为是典型的系统,默认的np.float
是float64
。对于float64
来说,浮点mantisaa是52位,而对于float128
来说,它只有63位。或十进制,从大约15位到18位。因此,从np.float
到np.float128
的精度没有很大提高。(为什么np.longdouble
(或者np.float128
)听起来会增加很多精度,但是没有。)
(最后,因为这可能会引起一些人的混淆,如果
np.longdouble
或np.float128
对这个问题有用,那么值得注意的是,问题中设置初始数组的行不会给出np.longdouble
的预期精度。也就是说,y=np.array([-76188946654889063420743355676.5],dtype=np.longdouble)
首先创建Python浮点数组,然后从中创建numpy数组,但是Python数组中的精度将丢失。因此,如果解决方案是longdouble
,则需要使用不同的方法初始化数组。)这里最简单的方法是绘制值减去它们的平均值(或类似的数字)。有理由不这样做吗?最后,你必须用偏移量绘制一些点,唯一的问题是偏移量在绘图中显示在哪里。@tom10如果你是指添加这行y-=np.mean(y)
,它仍然会产生相同的结果。