这是我有史以来第一篇关于叠加的帖子 - 经过一周的搔痒,我觉得是时候问互联网了。
我正在尝试最小化复杂Python函数的输出,该函数为多项式提供3个(或更多)系数,并返回绘图的斜率平方,在理想情况下,该平方应表示平坦线。
该函数不仅仅是数学函数 - 它使用提供的多项式来修改(通过乘法)天文滤波器吞吐量曲线(例如https://www.sdss3.org/images/camera_filters.jpg),然后将其与模型恒星大气一起用于计算辐射热校正,以及最终绘制一组恒星计算和观测到的天文数量(dm)之间的差异,作为颜色(gr)的函数。
本质上,此函数“getSlope()”是一个黑盒子,大约需要12秒来计算任何给定输入多项式的输出斜率。
我一直在使用scipy.optimize.minimize来最小化函数并找到返回最平坦图的多项式参数。不幸的是,当多项式在感兴趣的范围内返回负值时,似乎产生最平坦的图。这会产生一个有时低于零的过滤器吞吐量曲线,这不仅是非物理的,而且还会破坏一些黑盒计算。
我认为我可以使用COBYLA不等式约束来找到不使用负多项式评估的最小值,但它似乎没有帮助。
使用函数isValid(),当多项式在给定限制内为OK时返回+1,在返回负值时返回-1。 E.g:
def isValid(poly):
p=Polynomial(poly)
x=np.linspace(startWL,endWL,2000)
y=p(x)
if np.any(y<0):
print "returning minus one"
return -1
else:
return 1
然后我设置约束来评估这个函数“isValid()”。
poly = [1,0.0001,0.000000001] # polynomial parameters a1 + a2*x + a3*x^2
cons = ({'type':'ineq','fun':isValid})
res = minimize(getSlope,poly,method='COBYLA',constraints=cons,tol=1E-11)
print res
我曾希望这会找到一个在约束限制范围内的最小值,即多项式在我感兴趣的时间间隔内从未被评估为负数。但是,它似乎只是找到一个超出我的约束的最小值,然后告诉我这样。即:
1.97336588518e-07
returning minus one
2.16503874744e-06
returning minus one
2.40318933164e-07
returning minus one
status: 4
nfev: 80
maxcv: 1.0
success: False
fun: 2.4031893316449186e-07
x: array([ 9.96886224e-01, 2.59958641e-01, -6.85767425e-05])
message: 'Did not converge to a solution satisfying the constraints. See `maxcv` for magnitude of violation.'
这似乎不是特别有用!我可以很容易地说出这个解决方案超出了我的限制。我是否正确实施了此约束过程? 有没有办法强制最小化函数在约束条件下找到最小的最小值,即使在约束之外有一个较低的最小值?我不是统计或编程的专家,所以我是感觉很丢失。任何和所有提示赞赏!