我一直在撰寫一些代碼,用于將我的纖維(其X、Y、Z位置由電機控制)自動對準光源。為此,我撰寫了axis.move_to(pos)方法來移動軸到一個位置,以及pm.meas_power()方法來從我的功率計測量光功率。
我的目標是找到最佳的(Y,Z)位置(X在這個階段不需要),以使光功率最大化。現在,與光斑大小相比,搜索區域相當大,因此,如果我從一個只發現噪音的區域開始,簡單的梯度搜索將無濟于事,所以我所做的是在搜索區域內隨機移動,一旦發現功率高于某個閾值,就轉到爬坡演算法。
這樣做的問題是,它的效率相當低。優化的第一種方法是以螺旋方式而不是隨機方式搜索第一道光,但從計算上看,這并沒有真正改善步驟的數量。
相反,我遇到了simplex演算法,據說它產生的結果要比爬山好得多。我發現 scipy 有一個 optimize.linprog() 方法,它有一個單純的演算法,但在我看來,這只適用于一維問題。
我試圖閱讀檔案并撰寫自己的代碼,但是我對優化知之甚少,所以我很難真正理解它是如何作業的。
我想知道你是否可以幫助我寫一個演算法,給定[ystart, zstart, yend, zend],即搜索區域的限制,以及我的兩個方法axis.move_to(pos)和pm. meas_power():
from labFunctions import PowerMeter, MotorAxis
pm = PowerMeter('pm_address')
y軸 = MotorAxis('y_address')
z軸 = MotorAxis('z_address')
limits = [ystart, zstart, yend, zend] # 如果需要的話,這些可以用不同的格式化。
uj5u.com熱心網友回復:
不幸的是,有兩種非常不同的Simplex方法:
Nelder-Mead。linprog是關于這個方法的。uj5u.com熱心網友回復:
我認為你的問題是物理問題,因此你在錯誤的論壇上提問。盡管如此,我將嘗試回答。
如果你試圖匹配激光器的TEM00模式,你在達到閾值功率后的爬坡演算法是一個非常好的細化策略,因為功率曲線沒有任何其他最大值。
關于隨機搜索,我認為如果你無法在物理上限制搜索空間,你不妨在一個等距網格上進行隨機搜索,網格點大約是激光光斑大小的一半。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/308828.html
標籤:
上一篇:以下關于O(n)的說法是否正確?
下一篇:尋找串列中的唯一陣列
