是否可以在Tcl中将具有多个固定参数的函数传递给:: math :: optimize :: min_bound_1d

时间:2016-06-03 13:17:39

标签: tcl

我对Tcl相当陌生,而且我被困在我必须做的任务/项目上。

所以我有一个函数F(x,A1,A2,...)= y。 x是一个自由变量,A1,A2等是一些预先知道的常数。当y是A1,A2等多个值的最小值时,我必须找到x。

我遇到了函数:: math :: optimize :: min_bound_1d,它看起来与我需要的完全一样(函数有一些约束)。问题是这个优化函数似乎只接受带有1个参数的函数。

所以在我的sudo代码中,我有类似的东西:

proc F {x arg1 arg1} {
    # Crunch numbers
    return $result
}

foreach arg1 $list_of_first_args {
    foreach arg2 $list_of_second_args {
        # Is it possible to pass $arg1 and $arg2 to the function below?
        puts [::math_optimize_min_bound_1d F $lower_limit $upper_limit]
    }
}

在Tcl中是否可以将$ arg1和$ arg2传递/绑定到上面示例中的函数F,以便当y是argN的每个排列的最小值时,我可以得到x?我可以将所有参数放在列表中并传递吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

是的,只要您重新安排一些事情。

F需要看起来像这样,最后放置x变量:

proc F {arg1 arg2 x} {
    # Crunch numbers
    return $result
}

(或者您可以使用代理命令重新排列参数顺序:)

proc F' {arg1 arg2 x} {
    tailcall F $x $arg1 $arg2
}

然后,在foreach结构内部:

puts [::math::optimize::min_bound_1d [list F $arg1 $arg2] $lower_limit $upper_limit]

[list F $arg1 $arg2]这是一种穷人的lambda,在Tcl中有很多高阶函数命令接受。如果在评估时,$arg1为1且$arg2为12,则“函数”{F 1 12}会传递到::math::optimize::min_bound_1d并评估为[concat {F 1 12} $x]

“真正的”lambda看起来像这样:

[list x [concat F \$x $arg1 $arg2]]

但只有在准备高阶函数命令以使用apply $func $x对其进行评估时,才能使用此构造。

文档:applyjoinlistmath::optimize包,packageprocputs,{{ 3}},return

答案 1 :(得分:1)

假设有问题的代码没有尝试做解决函数源优化等时髦的事情,最简单的方法是创建代理函数:

proc proxy {value} {
    global A1 A2
    F $value $A1 $A2
}

然后只需优化代理。

虽然您将不得不处理这样一个事实,即在更高维度上进行优化比在单维情况下更复杂。