Math 最大化复数的绝对实部之和
假设复数a1..an,这些数字必须旋转的角度φ是多少(=乘以exp(i*φ))才能最大化实部绝对值之和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)) 不
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:感谢你发现了这个错误。对于其他的改变,请发布一个你自己的答案,因为这些会改变我答案的内容很多。