大家好,
我试图使用 JSL 中的最小化函数来获取两个(或更多)变量的值,以最小化大型模型的误差均方。 即使我知道它应该收敛到哪个值(通过反复试验),我也无法让它收敛。
我使用的基本语法是:
minfun = Minimize( min_test, {kD( 0.4, 0.8 ), wshc( 0.1, 1.5 )}, <<DETAILS></DETAILS>我尝试过不同的消息,但它们没有改变任何东西。
这里的目标是找到 kD 和 wshc 的值,从而最小化表达式 min_test,该表达式本身就是一个评估表达式的序列,如下所示
min_test = Expr(
Eval( light );
Eval( parafile );
Eval( runprg );
Eval( reshandling2 );
Eval( SSE2 );
);
改变的 kD 和 wshc 值修改“light”和“parafile”表达式,然后运行可执行程序(在 runprg 表达式中),其结果被操纵,并且均方误差(MSE)是最后的结果在 SSE2 表达式中求值。 对于上下文,“runprg”表达式将创建的多个文件提交到模拟湖泊热演化的独立可执行文件。 “runprg”表达式的每次传递都需要大约 10-20 秒的计算,其结果会重新引入 JSL 中以计算 MSE。
该过程本身似乎工作正常,因为它在每一步都正确读取目标函数值,并且似乎将参数值正确传递给表达式。 问题在于,算法相对于我给定的初始值,对 kD 和 wshc 参数的“移动”非常小(仅在小数点后第五位),以至于无法收敛。 例如,如果我分别从 0.8 和 0.5 的初始值开始,我通常会得到类似的结果
0.8
0.49999945654133
在下一次迭代中,因此不会显着影响生成的 MSE。 根据我在最小化函数中给出的参数界限,参数有足够的移动空间。 我知道我的情况与典型的简单可微函数相差甚远。 然而,通过“手动”运行具有不同参数值的程序,我知道目标函数相对于参数非常凸,因此认为最小化函数可以正常工作,特别是使用 <
在这种情况下有什么建议可以帮助解决问题吗?
预先非常感谢,伊夫