假设复数 a1..an ,那么角度 phi 这些数字必须旋转(=乘以exp(i * phi))才能最大化实部的绝对值之和?
in:=complex[N]
out:=in.*exp(i*phi)
f:=sum(abs(real(out)))
- >哪个phi最大化f?
是否有一个优雅的解决方案(如不在phi中迭代)?
要找到每个数字必须乘以的角度才能使其成为现实并不困难,但加权这些角度以找到所有这些角度的单个最佳角度很困难,因为旋转显然不是线性的 - 类似于
sum(phiN.*abs(in))/sum(abs(in))
不起作用(产生的总和低于通过迭代-pi到pi找到的角度)
任何想法都受到赞赏..
答案 0 :(得分:0)
虽然存在分析解决方案,但通常很难计算它(对于少量输入变量(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
。由于它的不连续性,我们不会尝试各种组合。因此,您最终得到2^n
f'
个变体。那么最佳值是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
。您需要2^n
f
种变体,每种变体都需要O(n^2)
时间来构建解决方案。
另一种选择是数值优化方法。挑战在于你的功能不凸。因此,如果您找到局部最大值,则不能说它是否是全局最大值。大多数算法需要良好的初始您可以通过对phi
的域进行抽样并选择最佳点来找到初始点。然后,尝试一些标准方法(Newton,Levenberg-Marquardt,BFGS)。