我对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?我可以将所有参数放在列表中并传递吗?
谢谢!
答案 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
对其进行评估时,才能使用此构造。
文档:apply,join,list,math::optimize包,package,proc,puts,{{ 3}},return
答案 1 :(得分:1)
假设有问题的代码没有尝试做解决函数源优化等时髦的事情,最简单的方法是创建代理函数:
proc proxy {value} {
global A1 A2
F $value $A1 $A2
}
然后只需优化代理。
虽然您将不得不处理这样一个事实,即在更高维度上进行优化比在单维情况下更复杂。