Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何提高matplotlib的精度?_Python_Numpy_Matplotlib_Precision - Fatal编程技术网

Python 如何提高matplotlib的精度?

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

我试图绘制一组需要高精度的极端浮点值。在我看来,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([-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
以外的内容

一个简单的解决方案是使用Python
int
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)
,它仍然会产生相同的结果。