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

Math 最大化复数的绝对实部之和,math,language-agnostic,complex-numbers,Math,Language Agnostic,Complex Numbers,假设复数a1..an,这些数字必须旋转的角度φ是多少(=乘以exp(i*φ))才能最大化实部绝对值之和 in:=complex[N] out:=in.*exp(i*phi) f:=sum(abs(real(out))) ->哪个phi使f最大 是否有一个优雅的解决方案(如不迭代phi) 要找到每个数字必须乘以的角度以使其成为现实并不困难,但加权这些角度以找到所有角度的单个最佳角度是困难的,因为旋转显然不是线性的——类似于 sum(phiN.*abs(in))/sum(abs(in)) 不

假设复数a1..an,这些数字必须旋转的角度φ是多少(=乘以exp(i*φ))才能最大化实部绝对值之和

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))
你只有一个自变量。因此,我们首先导出关于φ的函数:

f'(phi) = Sum_i (-li sin(phii + phi) * abs'(l cos(phii + phi))
abs'(x)
+1
-1
。由于它的不连续性,我们不会尝试每种组合。因此,您最终得到了
2^n
f'
变体。然后,最佳值是其中一个(通常是四个)参数,其中
f'(phi)=0
。这可以按如下方式计算。I用
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
域进行采样并选择最佳域来找到初始点。然后,尝试一些标准的方法(牛顿、莱文伯格·马夸特、BFGS)。

@Galactic Ketchup:感谢你发现了这个错误。对于其他的改变,请发布一个你自己的答案,因为这些会改变我答案的内容很多。