我正在尝试在 R 中使用
DEoptim
来解决最小化问题。以前,我使用 Excel 的求解器工具,尤其是进化求解器技术。但是 DEoptim
的结果不匹配,并且经常提供接近给定参数上限的答案。
问题陈述 我通过最小化函数 $f(q_1,q_2, lpha_1, lpha_2)$
中表示的平方差来定义问题目标函数: $$f(q_1,q_2, lpha_1, lpha_2)= rac{1}{5}\sum\limits_{i = 1}^{5} (b_{i} - b_{mod_{i}})^ 2$$
有界限:
较低 = c(1000, 1000, 0.8, 1.4) 上 = c(1e10, 1e35, 1.5, 15.0)
在哪里, $$b_{mod,i} = q_{1} \lambda_i^{- lpha_1} + q_{2} \lambda_i^{- lpha_2}$$
和$\lambda_i = c(375, 470, 528, 625, 880)$是5个通道的波长, $b_i = c(228,124,98,67,44)$表示每个波长对应的光吸收量度
这里 $b_i$ 是来自设备的测量值,$b_{mod,i}$ 是通过优化过程实现的建模值。
查询
我正在尝试在 R 中使用这种技术来解决物理问题。
DEoptim
是定义问题的好选择吗?方法 1:Excel 求解器
在 Excel 求解器中,我使用了内置“进化”算法的非线性求解器函数。优化值 $q_1, lpha_1,q_2, lpha_2$ 似乎是合理的。
方法 2:在 R 中使用
DEoptim
我发现Excel中的进化算法是基于差分进化算法的,而在R中有一个名为
DEoptim
(Link)的包。此外,我需要为一个大型数据集运行优化过程,其中数据的每个时间戳代表 $b$。然而,DEoptim
结果被发现非常接近上限,并且通常对提供的界限非常敏感。
## Values:
b = c(858.3302, 523.2456, 429.2651, 310.0678, 222.0470)
## Define Objective Function
obj_fun = function(x){
return(0.2*((b[1] - (x[1]*(375^(-x[2])) + x[3]*(375^(-x[4]))))^2 +
(b[2] - (x[1]*(470^(-x[2])) + x[3]*(470^(-x[4]))))^2 +
(b[3] - (x[1]*(528^(-x[2])) + x[3]*(528^(-x[4]))))^2 +
(b[4] - (x[1]*(625^(-x[2])) + x[3]*(625^(-x[4]))))^2 +
(b[5] - (x[1]*(880^(-x[2])) + x[3]*(880^(-x[4]))))^2))
}
## Define Bounds
lower = c(1000, 1.5, 1000, 0.8)
upper = c(1e35, 15.0, 1e10, 1.4)
## Control Params
control.param = DEoptim.control(list(trace=0, parallelType = "parallel"))
## Run DEoptim
result = DEoptim(obj_fun, lower, upper, control.param)
## See Result
result$optim$bestmem
par1 par2 par3 par4
4.677653e+34 1.133396e+01 2.119513e+09 1.382064e+00
Excel 求解器结果: par1 par2 par3 par4 1.782904e+27 9.5913123 144797.964 0.9558152715