最小化java中复杂的线性多变量函数

时间:2012-04-17 11:01:15

标签: java function constraints minimization

我需要在一些约束下最小化复杂的线性多变量函数。

x 为长度 L 的复数数组。

a [0],a [1],...,a [L-1] 是复系数

F 是复函数 F(x)= x [0] * a [0] + x [1] * a [1] + ... + x [L -1] * a [L-1] 必须最小化。

b [0],b [1],...,b [L-1] 是复系数,存在约束

1 = complexConjuate(x [0])* x [0] + complexConjuate(x [1])* x [1] + ... + complexConjuate(x [L-1])* x [ L-1] 必须履行。

我已经详细了解了http://math.nist.gov/javanumerics/并浏览了很多文档。但我找不到一个能够最小化复杂功能的库。

2 个答案:

答案 0 :(得分:1)

您希望在平滑超曲面f上最小化可微分实值函数S。如果存在这样的最小值 - 在编辑之后的情况下它保证存在,因为超曲面是紧凑的 - 它发生在f|Sf的限制S的临界点。

在限制为流形f的环境空间中定义的可微函数M的关键点是f T(M)与切线正交的点空间g(x) = 0到多方面。对于一般情况,请阅读gradient

在歧管是超曲面(它具有实际的维数1)的情况下,通过具有平滑函数g的等式f|S定义(局部),这是特别容易检测的,关键的x的点是S上的grad(f)|x点,其中grad(g)|xS共线。

现在问题实际上是一个真实的(如关注实数)问题,而不是一个复杂的问题(如复杂的数字)。

剥离不必要的虚部,我们有

  • 超曲面(x|x) = 1,方便地是单位范围,由(a|b)全局定义,其中a_1*b_1 + ... + a_k*b_k表示标量积gx的渐变2*x只是L(x) = (c|x) = c_1*x_1 + ... + c_k*x_k
  • 一个真正的线性函数Lc的渐变x独立于L

因此,球体上有c = 0的两个关键点(除非L c在这种情况下是{常数}}),直线与c/|c|之间的点}与球体相交,-c/|c|L(c/|c|) = 1/|c|*(c|c) = |c|

显然L(-c/|c|) = -1/|c|*(c|c) = -|c|-c/|c|,因此最低限度出现在-|c|,其值为{{1}}。

答案 1 :(得分:0)

每个复变量x可以被视为两个真实的变量,分别代表x的实部和虚部。

我的建议是,使用每个变量或系数的实部和虚部作为独立分量重新构造目标函数和约束。

根据评论,您只打算优化目标函数的实部,这样您最终可以得到一个受优化影响的单个目标函数。

约束可以分为两个,其中“实际”约束应该等于1,“虚构”约束应该等于0.

在以这种方式重新配置优化问题之后,您应该能够应用任何适用于重新形成问题的优化算法。例如,Apache Commons Math库中有一组不错的优化器,SuanShu库也包含一些优化算法。