【发布时间】:2016-02-25 15:54:25
【问题描述】:
我有一个大问题我无法解决,我真的找不到错误。
我想使用这个功能:
来自 Apache 的示例测试代码是:
public void testSinMin() {
UnivariateFunction f = new Sin();
UnivariateOptimizer optimizer = new BrentOptimizer(1e-10, 1e-14);
Assert.assertEquals(3 * Math.PI / 2, optimizer.optimize(new MaxEval(200),
new UnivariateObjectiveFunction(f),
GoalType.MINIMIZE,
new SearchInterval(4, 5)).getPoint(), 1e-8);
所以我尝试用 Clojure 和另一个函数重现代码:
(defn atomic-apache-peak-value [x]
(let [lamb ((x :parameters) 0)
x0 ((x :parameters) 1)
f (D2Sigmoid. lamb x0)
optimizer (BrentOptimizer. 0.0001 0.0001)
maxeval (MaxEval. 1000)
of (UnivariateObjectiveFunction. f)
goal (GoalType/MINIMIZE)
interval (SearchInterval. x0 (* 2 x0))]
(-> (.optimize optimizer maxeval of goal interval)
(.getPoint))))
Clojure 告诉我“找不到匹配的方法:优化类 ....BrentOptimizer”
我尝试在let中逐行计算代码行,它可以工作,所以问题是优化。
该方法是在超类上实现的,所以我导入了它们
[org.apache.commons.math3.optim.univariate UnivariateOptimizer BrentOptimizer UnivariateObjectiveFunction SearchInterval]
[org.apache.commons.math3.optim BaseOptimizer MaxEval]
它不会改变任何东西。
你认为我有语法问题或错误或只是错误的方法吗?
谢谢
编辑:
忘了说
(.optimize optimizer)
version 从 Apache 抛出异常但被找到。所以我不认为 Clojure 找不到源代码。 可能语法有问题?
还尝试了不带括号的 Goaltype/MINIMIZE
编辑 2:
最终的工作代码
(defn atomic-apache-peak-value [x]
(let [lamb ((x :parameters) 0)
x0 ((x :parameters) 1)
f (D2Sigmoid. lamb x0)
optimizer (BrentOptimizer. 0.0001 0.0001)
maxeval (MaxEval. 1000)
of (UnivariateObjectiveFunction. f)
goal GoalType/MINIMIZE
interval (SearchInterval. x0 (* 2 x0))]
(-> (.optimize optimizer (into-array OptimizationData [maxeval of goal interval]))
(.getPoint))))
【问题讨论】:
-
你试过去掉
GoalType/MINIMIZE周围的括号吗? -
嗯.. 查看 javadoc,您可能想要
(.optimize (into-array OptimizationData [optimizer maxeval of goal interval]))之类的东西。您需要导入 org.apache.commons.math3.optim.OptimizationData 并丢失GoalType/MINIMIZE周围的括号 -
天哪,非常感谢,它成功了。不知道将 Optimizationdata ... 绑定到 OptimizationData[] !祝你有美好的一天
标签: clojure clojure-java-interop