我有一个数组有值,如果精确计算:[3.056565 3.924560]但是在python中它打印圆形数字,数组是[3.06,3.93]。该数组用于计算其他内容,结果与预期不同。如何使该数组停止舍入?
以下是您可以看到数组未精确计算的代码:
import datetime
import math
import numpy as np
def numGradient(f, x, h):
n = len(x)
g = [0]*n
g = np.array(g)
for i in range(n):
e = [0]*n
e[i] = 1
e=np.array(e)
g[i] = (f(x+e*h)-f(x-e*h))//(2*h)
return(g)
def myFun(x) :
return ( 0.6 + ((math.sin(x[0]**2-x[1]**2))**2-0.5)/((1+0.001*(x[0]**2+x[1]**2))**2) )
x_old=(3,4)
xthis = x_old - 0.01*numGradient(myFun, x_old, 10**(-6))
print(xthis)
答案 0 :(得分:3)
您的代码存在一些问题。它可能无法计算您期望计算的内容。
首先,这是初始化NumPy数组的错误方法
g = [0]*n
g = np.array(g)
将其替换为
g = np.zeros(n)
其次,对e
执行相同操作。
for i in range(n):
e = np.zeros(n)
e[i] = 1
最重要的是取代
g[i] = (f(x+e*h)-f(x-e*h))//(2*h)
与
g[i] = (f(x+e*h)-f(x-e*h))/(2*h)
毕竟这是浮点除法。 //
是Python 3中所谓的整数除法。
更改后,您将获得
[ 3.056565 3.92456 ]
这可能是你应该得到的。
以下是更改后的完整代码:
import datetime
import math
import numpy as np
def numGradient(f, x, h):
n = len(x)
g = np.zeros(n)
for i in range(n):
e = np.zeros(n)
e[i] = 1
g[i] = (f(x+e*h)-f(x-e*h))/(2*h)
return(g)
def myFun(x) :
return ( 0.6 +
((math.sin(x[0]**2-x[1]**2))**2-0.5)/((1+0.001*(x[0]**2+x[1]**2))**2) )
x_old=(3,4)
np.set_printoptions(precision=6)
xthis = x_old - 0.01*numGradient(myFun, x_old, 10**(-6))
print(xthis)