【问题标题】:Maximize sum of absolute real parts of complex numbers最大化复数的绝对实部之和
【发布时间】:2016-02-28 06:11:10
【问题描述】:

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

任何想法都值得赞赏..

【问题讨论】:

    标签: math language-agnostic complex-numbers


    【解决方案1】:

    虽然存在解析解,但通常很难计算(对于少量输入变量可能可行 (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)。

    【讨论】:

    • @Galactic Ketchup:感谢您发现 sin/cos 错误。对于其他更改,请发布您自己的答案,因为这些会大大改变我的答案内容。
    • 超级晚,但如果有人有类似的问题,您可以尝试将abs 函数更改为平方函数(即(li cos(phii + phi))²,它变得更容易区分。顺便说一句,任何人都知道如何解析最大化/最小化复数的实部?使用l*cos(phi) 意味着两个变量...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多