不是直接回答您的问题,但根据您提供的数据,我没有问题适合这个:
import sys
from scipy import optimize
import numpy as np
from matplotlib import pyplot as plt
height=np.array([34.75625407,126.90646855,369.02594015,321.33822843,100.89398254,119.73654933,421.4400502,98.09051003,72.61433571,626.54970675,45.97802204,741.65476066,39.13568217,67.21666378,58.44445182,31.9950751,32.74788721,168.3256637,149.57003524,1058.41323859])
weight=np.array([4.375,3.95833333,9.16666667,8.125,3.75,8.4375,7.91666667,7.5,5.,10.,6.25,7.625,5.,6.25,10.,3.75,4.375,6.66666667,6.25,8.28125])
fitfunc = lambda p, x: np.sqrt(p[0]* x + p[1]) +p[2] # Target function
errfunc = lambda p, x, y: fitfunc(p, x) - y
pp = [0.2, 0.3, 0.4]
sort_idx = np.argsort(height)
height = height[sort_idx]
weight = weight[sort_idx]
p0 = [0.2, 0.2, 0.3] # initial values
result = optimize.leastsq(errfunc, p0, args=(height, weight), maxfev=10000, full_output=1)
p1 = result[0]
print result[3]
plt.plot(height, weight, 'o')
plt.plot(height, fitfunc(p1, height), '-')
plt.show()
正如我在上面的代码中所做的那样,您可以做的一件事是设置full_output=1
并打印您收到的消息。请注意,我的success
值实际上是 2,而不是 4。所以有一些奇怪的差异。由于我们应该使用相同的数据,因此您的 scipy 设置中的某些内容可能不正确。那,或者您没有显示整个问题并且其他地方出现了问题。
看这个图,我确实看到这些值几乎分散在任何地方,所以无论如何都很难拟合(事实上,我不会!)。