虽然存在解析解,但通常很难计算(对于少量输入变量可能可行 (n))。我将首先介绍此解决方案,然后提出替代方案。
解析解
给定输入数字(l1, phi1), (l2, phi2), ... (ln, phin),其中li 是长度,phii 是数字的角度,您要查找:
arg max_phi Sum_i abs(li cos(phii + phi))
你只有一个自变量。所以,我们首先推导关于phi的函数:
f'(phi) = Sum_i (-li sin(phii + phi) * abs'(l cos(phii + phi))
abs'(x) 是 +1 或 -1。由于它的不连续性,我们不会尝试每种组合。所以你最终会得到f' 的2^n 变体。那么最优值是f'(phi)=0 的(通常是四个)参数之一。这可以计算如下。我用si 表示第i 项的符号,您需要对其进行修改:
numerator = Sum_i si li sin(phii)
denominator = (Sum_i li^2) + (Sum_i Sum_{j>i} 2 * li * lj * si * sj
cos(phii - phij))
那么,四个候选解决方案是:
phi* = -arc cos( numerator / sqrt(denominator))
phi** = -arc cos(-numerator / sqrt(denominator))
phi*** = arc cos( numerator / sqrt(denominator))
phi**** = arc cos(-numerator / sqrt(denominator))
找到每个变体的所有候选者,并选择最大 f(phi) 的那个。但是,如前所述,这种方法不适用于大型n。您需要f 的2^n 变体,每个变体都需要O(n^2) 时间来构建解决方案。
数值解
另一种方法是数值优化方法。挑战在于您的函数不是凸函数。因此,如果你找到一个局部最大值,你不能说它是否是全局最大值。大多数算法都需要良好的初始化。您可以通过对phi 的域进行采样并选择最好的一个来找到初始点。然后,尝试一些标准方法(Newton、Levenberg-Marquardt、BFGS)。