这是从Python编程的试卷中提取的。 我有以下代码:
import numpy as np
from math import sin, pi
#Part a:
def f(x):
return 2*x - x**2
def g(p,x):
return p*sin(pi*x/2)
def hsum(p):
s = 0
for i,j in zip(np.arange(0,3,2E-4),np.arange(2E-4,3,2E-4)):
delx = j - i
ab = abs(f(i)-g(p,i))
s += ab*delx
return s
#print hsum(1)
#print hsum(0)
#Part b:
h = hsum(0)
P = []
Q = []
for p in np.arange(0,1.1,1E-3):
k = hsum(p)
if k<h:
h = k
P.append(hsum(p))
Q.append(p)
print h
print min(P)
g = min(P)
t = P.index(g)
#print t
#print Q
print Q[t]
然而,在运行它时,程序返回所谓的最佳P的值0.001。根据问题陈述,该值应该接近1并且在1.1之前。
我认为浮点数可能存在问题,但我尝试的任何组合都给出了相同的答案。 有什么建议吗?
编辑:使用提供的所有建议,我编辑了原始代码和这个,虽然相当慢(运行时间为9:58 !!),提供了正确的答案1.071 谢谢你的帮助。 :d
答案 0 :(得分:0)
在hsum
中,您在每次循环迭代中将s
重置为0
。你可能应该在循环之外移动它。
在您的代码中找到最合适的,您将p值附加到P,但是您没有保留有关拟合质量的任何信息。 min(P)
找到最低的p,而不是最合适的p。存储(p, hsum(p))
元组,并通过H(p)值找到最小值。 min函数采用key
参数来帮助您。 (通过一些简化,你甚至不需要制作元组。)