我不知道我的问题是编码错误还是精度问题。
基本上,我正在做一个最小化的问题。我正在尝试使用特定的算法来查找函数的最小化器。除了要尝试从[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
一如既往地叠加在流专家中,谢谢!
答案 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