最大化复数的绝对实部之和
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
。您需要 f
的 2^n
个变体,每个变体都需要 O(n^2)
时间来构建解决方案。
数值解
另一种方法是数值优化方法。挑战在于您的功能不是凸的。因此,如果找到局部最大值,则不能说它是否是全局最大值。大多数算法都需要良好的初始化。您可以通过对 phi
的域进行采样并选择最佳点来找到初始点。然后,尝试一些标准方法(Newton、Levenberg-Marquardt、BFGS)。
假设复数 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
。您需要 f
的 2^n
个变体,每个变体都需要 O(n^2)
时间来构建解决方案。
数值解
另一种方法是数值优化方法。挑战在于您的功能不是凸的。因此,如果找到局部最大值,则不能说它是否是全局最大值。大多数算法都需要良好的初始化。您可以通过对 phi
的域进行采样并选择最佳点来找到初始点。然后,尝试一些标准方法(Newton、Levenberg-Marquardt、BFGS)。