我正在尝试优化我编写的代码来计算方程组的最小二乘并返回未知数的最佳值:(a1,a2,a3,z1,z2
并且pottemp
是zlevels
已知的)。
方程组如下(https://imgur.com/LQqeOgA):
我编写了以下代码,它就像一个魅力,但它不是很有效,你可以看到由于 for 循环的数量,如果我增加 and 的数量hstep
,astep
我的数组变得非常大并且需要很多时间从 计算最小二乘leastsquared
。
def leastsquared(zlevels,pottemp,z1,z2,a1,a2,a3):
dtot=0.0
for zi in range(len(zlevels)): #zvalue of obs points
if zlevels[zi]<=z1:
F=np.tan(a1)*zlevels[zi]+pottemp[0]
elif zlevels[zi]<=z2:
F=(np.tan(a1)*z1+pottemp[0]) + np.tan(a2)*(zlevels[zi]-z1)
else: #zlevels[zi]<=H
F=((np.tan(a1)*z1+pottemp[0]) + np.tan(a2)*(z2-z1) ) + np.tan(a3)*(zlevels[zi]-z2)
d=(pottemp[zi]-F)**2.0
dtot+=d
dtot=dtot/len(zlevels)
#print("dtot is" + str(dtot))
return dtot
def optm(hstep,astep,zlevels,pottemp):
sqdist=np.inf
for z1 in np.linspace(0,zlevels[-1],hstep):
for z2 in np.linspace(0,zlevels[-1],hstep):
for a1 in np.linspace(0,0.1,astep): # max angle
for a2 in np.linspace(0,0.01,astep):
for a3 in np.linspace(0,0.01,astep):
sqdist_new=leastsquared(zlevels,pottemp,z1,z2,a1,a2,a3)
if sqdist_new<sqdist:
sqdist=sqdist_new
optimalsetting=[z1,z2,a1,a2,a3]
return optimalsetting
代码本身非常简单但效率低下。我试图使用 实现此代码scipy.optimize.minimize
,但我无法运行它。有谁知道如何优化它?也许,scipy.optimize.minimize
这将是最简单的方法,但我不确定如何使我的代码适应它。