最小化循环迭代的多变量函数

时间:2017-06-03 18:24:18

标签: python arrays loops wolfram-mathematica minimization

我试图最小化存储在f中的约80个变量的函数array。该函数由两个嵌套循环定义:外部索引由array索引i,而内循环执行array[i]次,并将计算结果添加到运行总计中。计算取决于某些条件xy,并且每次执行时都会略有变化,这就是我需要循环结构的原因。这是Python中的一个最小工作示例:

def f[array]:
    total = 0
    x = 0
    y = 0
    for i in range(len(array)):
        for j in range(array[i]):
            result = 2*x + y
            total = total + result
            x = x+1
        x = 0
        y = y+1
    return total

例如,print f([2,1])返回3,因为[(2 * 0)+ 0] + [(2 * 1)+ 0] + [(2 * 0)+ 1] = 0 + 2 + 1 = 3.

我想找到最小化array值的f条目。但是,当我告诉(例如)Mathematica最小化f([x1, x2, ..., x80])并吐出最小化器array时,程序会抱怨,因为它无法执行定义f的循环的不确定数量次。

鉴于此,我的问题如下:

  

如何最小化多变量函数,其参数描述给定循环迭代的次数?

我原本试图在Mathematica中实现这一点,但发现我无法通过上述过程定义f。我能做的最好的事情是告诉Mathematica执行上面的循环,然后在计算f[array_] := total之后定义total。当我运行我的代码时,Mathematica自然声称它无法评估f,甚至在它向NMinimize[{f[array] array ϵ Integers}, array]执行命令之前就抛出错误。 Mathematica在f中调用之前试图评估NMinimize这一事实表明我不太了解函数在Mathematica中是如何工作的。任何帮助解决这种情况的人都将不胜感激!

1 个答案:

答案 0 :(得分:2)

如上所述,您的函数具有分析最小值,无需进行数值优化。不幸的是,StackOverflow不会让我显示它的数学(如果你在MathExchange上问它我可以提供一个推导),但给定一个数组A = [a0 a1 ... an],其中每个ai是一个正整数,并且数组Y = [0 1 ... n]您发布的函数会缩减为以下矩阵乘法A * (A - 1 + Y)',其中'表示矩阵转置,*表示矩阵乘法。因此,当每个ai最小化时,函数被最小化。因此,如果这是更大优化的一部分,那么如果元素本身受到约束,您的任务应该集中在找到A的每个元素的最小值。