最大化复数的绝对实部之和

Maximize sum of absolute real parts of complex numbers

假设复数 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 找到的角度)

欢迎任何想法..

虽然存在解析解,但通常很难计算(对于少量输入变量(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。您需要 f2^n 个变体,每个变体都需要 O(n^2) 时间来构建解决方案。

数值解

另一种方法是数值优化方法。挑战在于您的功能不是凸的。因此,如果找到局部最大值,则不能说它是否是全局最大值。大多数算法都需要良好的初始化。您可以通过对 phi 的域进行采样并选择最佳点来找到初始点。然后,尝试一些标准方法(Newton、Levenberg-Marquardt、BFGS)。