我试图最小化存储在f
中的约80个变量的函数array
。该函数由两个嵌套循环定义:外部索引由array
索引i
,而内循环执行array[i]
次,并将计算结果添加到运行总计中。计算取决于某些条件x
和y
,并且每次执行时都会略有变化,这就是我需要循环结构的原因。这是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中是如何工作的。任何帮助解决这种情况的人都将不胜感激!
答案 0 :(得分:2)
如上所述,您的函数具有分析最小值,无需进行数值优化。不幸的是,StackOverflow不会让我显示它的数学(如果你在MathExchange上问它我可以提供一个推导),但给定一个数组A = [a0 a1 ... an]
,其中每个ai
是一个正整数,并且数组Y = [0 1 ... n]
您发布的函数会缩减为以下矩阵乘法A * (A - 1 + Y)'
,其中'
表示矩阵转置,*
表示矩阵乘法。因此,当每个ai
最小化时,函数被最小化。因此,如果这是更大优化的一部分,那么如果元素本身受到约束,您的任务应该集中在找到A
的每个元素的最小值。