我一直在编写一些代码,用于自动对齐我的光纤(其X, Y, Z位置由电机控制)到光源。为此,我编写了axis.move_to(pos)
方法将轴移动到一个位置,pm.meas_power()
方法从我的功率计中测量光功率。
我的目标是找到最佳(Y, Z)位置(在这个阶段不需要X)以最大化光功率。现在,与光斑大小相比,搜索区域相当大,所以如果我从只发现噪声的区域开始,简单的梯度搜索将没有帮助,所以我所做的是随机移动整个搜索区域,并在找到高于某个阈值的功率时立即移动到爬山算法。
这样做的问题是效率很低。优化的第一种方法是在螺旋中搜索第一束光,而不是随机搜索,但从计算上讲,它并没有真正改善步骤的数量。
我遇到了,相反,单纯形算法,据说产生比爬山更好的结果。我发现scipy有一个optimize.linprog()
方法,它有一个单纯形算法,但在我看来,这只适用于一维问题。
我试着阅读文档并编写自己的代码,但我对优化知之甚少,所以我很难真正理解它是如何工作的。
我想知道你是否可以帮我写一个给定[ystart, zstart, yend, zend]
的算法,即搜索区域限制,以及我的两个方法axis.move_to(pos)
和pm.meas_power()
:
from labFunctions import PowerMeter, MotorAxis
pm = PowerMeter('pm_address')
yaxis = MotorAxis('y_address')
zaxis = MotorAxis('z_address')
limits = [ystart, zstart, yend, zend] # These can be formatted differently if needed
不幸的是,有两种非常不同的Simplex方法:
- 无约束非线性问题的Nelder-Mead单纯形法。你所链接到的论文中提到了这种方法。https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html包含这个方法作为
Nelder-Mead
。 线性规划问题的单纯形法。
linprog
是关于这个方法的。我认为你的问题是身体上的,因此你问错了论坛。尽管如此,我还是要试着回答。
如果你试图匹配激光的TEM00模式,你的算法在达到阈值功率后爬坡是一个非常好的改进策略,因为功率曲线没有任何其他最大值。
关于随机搜索,我认为如果你无法物理限制搜索空间,你不妨在等距网格上随机搜索,网格点约为激光光斑大小的一半。