为什么当我从数组中减去时什么也没发生?如何从python中获得更好的精度?

时间:2019-03-10 22:18:45

标签: python python-3.x optimization precision

我不知道我的问题是编码错误还是精度问题。

基本上,我正在做一个最小化的问题。我正在尝试使用特定的算法来查找函数的最小化器。除了要尝试从[1.2,1,2]中减去[-2.65765056e-22 9.20132910e-23]之外,我正在做的事情并不很重要,而当我这样做时,我得到的只是[1.2,1.2]。

我认为这是一个精度问题,所以我寻找了一种方法来允许python中超过64位的精度,但它不允许我这样做。

我尝试过将所有内容转换为float64类型的变量,但这仍然没有效果。为了便于阅读,我删除了该代码

请帮助,我真的很想用python编写此文件,而不是使自己陷入使用matlab:P(jk)的麻烦。

但是说真的,是我的代码还是精度还是两者兼而有之? 可以用Python完成吗?

这是我的代码:

import numpy as np

def f(x):
    return 100*(x[0]-x[1]**2)**2+(1-x[0])**2

def df(x):
    return np.array([-400*x[0]*(x[1]-x[0]**2)*x[0]-2*(1-x[0]), 200*(x[1]-x[0]**2)])

def ndf(x):
    return x[0]**2 + x[1]**2



alpha=1
row=.999
c=.5

epsilon =.0004
y=[1.2,1.2]
while ndf(df(y)) > epsilon:
   print(ndf(df(y))) 
   alpha=1 
   while f(y - alpha*df(y)) > f(y)-c*alpha*(ndf(df(y)))**2:

       alpha = row*alpha


   y=y-alpha*df(y)
   print(-alpha*df(y))
   print(y-alpha*df(y))

以下是输出: Outputs and variable types

一如既往地叠加在流专家中,谢谢!

1 个答案:

答案 0 :(得分:1)

我正在将问题简化为精度:使用Decimal时,您可以获得很好的精度。

>>> import numpy as np
>>> from decimal import Decimal
>>> a = [1.2,1.2]
>>> b = [-2.65765056e-22,9.20132910e-23]
>>> a = [Decimal(i) for i in a]
>>> b = [Decimal(i) for i in b]
>>> a
[Decimal('1.1999999999999999555910790149937383830547332763671875'), Decimal('1.1999999999999999555910790149937383830547332763671875')]
>>> 
>>> 
>>> b
[Decimal('-2.657650560000000049520705664376562101548279121350202517182008919716107442354768863879144191741943359375E-22'), Decimal('9.2013290999999997555711266729024269198128893250699076740068186285037565852462648763321340084075927734375E-23')]
>>>
>>> a[0]-b[0]
Decimal('1.199999999999999955591344780')

替代解决方案:使用np.float128

>>> a = [1.2,1.2]
>>> b = [-2.65765056e-22,9.20132910e-23]
>>>np.float(a[0]-b[0])
1.2
>>>np.float128(a[0]-b[0])
1.1999999999999999556