是否可以将具有多个固定参数的函数传递给 Tcl 中的 ::math::optimize::min_bound_1d
Is it possible to pass a function with multiple fixed arguments to ::math::optimize::min_bound_1d in Tcl
我是 Tcl 的新手,我被困在 assignment/project 我必须做的事情上。
所以我有一个函数 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 中是否有可能 pass/bound $arg1 和 $arg2 到上面示例中的函数 F 以便当 y 是 argN 的每个排列的最小值时我可以得到 x?我可以将所有参数放在一个列表中并传递吗?
谢谢!
假设有问题的代码不会尝试做一些时髦的事情,比如解析函数的源代码以进行优化,最简单的方法是制作一个代理函数:
proc proxy {value} {
global A1 A2
F $value $A1 $A2
}
然后优化代理即可。
虽然您将不得不处理这样一个事实,即在更高维度中进行优化比在单维情况下要复杂得多。
是的,只要你稍微重新安排一下。
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,则 "function" {F 1 12}
被传递到 ::math::optimize::min_bound_1d
并求值为 [concat {F 1 12} $x]
。
一个 "real" lambda 可能如下所示:
[list x [concat F $x $arg1 $arg2]]
但是只有在高阶函数命令准备好使用 apply $func $x
.
对其求值时才能使用此构造
文档:apply, join, list, math::optimize package, package, proc, puts, return, tailcall
我是 Tcl 的新手,我被困在 assignment/project 我必须做的事情上。
所以我有一个函数 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 中是否有可能 pass/bound $arg1 和 $arg2 到上面示例中的函数 F 以便当 y 是 argN 的每个排列的最小值时我可以得到 x?我可以将所有参数放在一个列表中并传递吗?
谢谢!
假设有问题的代码不会尝试做一些时髦的事情,比如解析函数的源代码以进行优化,最简单的方法是制作一个代理函数:
proc proxy {value} {
global A1 A2
F $value $A1 $A2
}
然后优化代理即可。
虽然您将不得不处理这样一个事实,即在更高维度中进行优化比在单维情况下要复杂得多。
是的,只要你稍微重新安排一下。
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,则 "function" {F 1 12}
被传递到 ::math::optimize::min_bound_1d
并求值为 [concat {F 1 12} $x]
。
一个 "real" lambda 可能如下所示:
[list x [concat F $x $arg1 $arg2]]
但是只有在高阶函数命令准备好使用 apply $func $x
.
文档:apply, join, list, math::optimize package, package, proc, puts, return, tailcall