对 Optim 设置限制
Placing Limits on Optim
我正在尝试使用一种算法来最小化模型的最小二乘法。我希望能够将所有参数限制在合理的范围内,但是当我 运行 此脚本出于某种原因无视我的限制时。更多的是调试问题。任何建议表示赞赏
Di<-c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,15, 15 ,15, 15 ,15 ,15 ,15,15 ,15 ,20, 20 ,20, 20 ,20, 20 ,20, 20 ,20 ,20 ,20 ,20 ,20 ,20, 20 ,20, 20 ,20, 20 ,20, 20)
Hi<-c(400 ,300 , 200, 0 ,-200 , -400 ,-600 , -800 ,-1000 ,-1000 ,-1200, -1220 ,-1300 ,-1400,-1400 ,-1500, -1600, -1700 ,-1700 ,-1800 ,-1900 , 400 , 200 , 0 ,-200, -400 ,-600 , -800,-1000 ,-1200, -1200 ,-1400 ,-1600 ,-1600 ,-1800 ,-2000 ,-2000 ,-2200 ,-2200 ,-2400 ,-2600 ,-2800,-3000 , 400 , 200 , 0 ,-200 ,-300 , -400 , -500 ,-600 ,-700 ,-800 ,-900 ,-1000 ,-1100,-1200 ,-1200 ,-1400, -1600 ,-1800 ,-1800 ,-2000 ,-2200 ,-2400 ,-2400 ,-2600 ,-2800 ,-3000 , 400,200 , 0, -200, -400 ,-600 ,-800, -1000 ,-1200 ,-1400 ,-1600 ,-1600 ,-1800 ,-2000, -2200,-2400 ,-2400, -2600, -2800 ,-3000 ,1000 , 800 , 600 , 400 , 200 , 0 ,-200 , -400 , -600, -800 ,-1000, -1200 ,-1400, -1600 ,-1800, -2000 ,-2200, -2400 ,-2600 ,-2800 ,-3000)
Val<-c(163301.080, 269704.110 ,334570.550, 409536.530, 433021.260 ,418962.060, 349554.460, 253987.570,124461.710, 140750.480 ,52612.790 , 54286.427 ,26150.025 ,14631.210 ,15780.244 , 8053.618, 4402.581, 2251.137 , 2743.511 , 1707.508 , 1246.894 ,176232.060 ,270797.240 ,323096.710,333401.080, 311949.900 ,272821.770 ,189571.850 ,114263.560 ,51939.070 ,62578.665 ,36905.438, 22625.515, 22940.591 ,14576.295 , 9686.653 , 10344.214 , 6912.779 , 7092.919 ,5366.797, 4058.492, 3270.734 , 2528.644 ,89311.555 ,116698.175 ,143588.620 ,139203.190, 145399.445, 145635.715, 134671.110 ,128931.160 ,119734.835 ,108708.815 , 90221.955 ,81692.585 , 64882.275,58215.735, 60443.190 ,44690.690 , 33224.152 , 24140.272 , 24913.280 ,19082.689 ,13920.669, 11074.718, 10015.653 ,8743.850 , 7516.880 , 6377.743 , 36888.842 ,43088.720 ,47904.490, 51298.710, 51120.887 ,47687.488 ,42238.912 , 38563.007 , 33902.918 ,28565.303 ,23700.862,24818.393, 21620.129 , 17816.061 ,15377.097 , 12992.321 ,12985.911 ,11177.941 ,9536.621,8357.279, 13052.178 , 14325.789 ,15120.314 , 16227.575 ,17226.307 ,18557.270 ,18680.326, 18844.544, 18205.607, 17770.311 ,16605.438 , 16062.309 ,14785.654 ,14324.493 ,13373.627,12135.392, 10632.699, 9155.762 , 8240.951, 6934.240 , 6475.927)
Function<-function(Hi,Di,param){
25*exp(
-((Hi)/(2 * param[1]))^2
- Di*(1/param[2] + 1/param[3])
)
}
ls<-function(param,Val,Hi,Di){
print(Hi)
eta<-Function(Hi,Di,param)
print(eta)
print(Val)
sum((Val - eta)^2)
}
startparam<-c(50,35,9)
optval<-optim((startparam,ls,NULL,method="L-BFGS-B",Val,Hi,Di), lower =c(20,10,0), upper =c(100,70,25))
print(optval)
这似乎工作正常:
opt1 <- optim(startparam,
fn=ls,method="L-BFGS-B",
Val=Val,Hi=Hi,Di=Di,
lower =c(20,10,0), upper =c(100,70,25))
请注意,Val
、Hi
、Di
的值通过 optim
传递给 objective 函数。
我正在尝试使用一种算法来最小化模型的最小二乘法。我希望能够将所有参数限制在合理的范围内,但是当我 运行 此脚本出于某种原因无视我的限制时。更多的是调试问题。任何建议表示赞赏
Di<-c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,15 ,15, 15 ,15, 15 ,15 ,15 ,15,15 ,15 ,20, 20 ,20, 20 ,20, 20 ,20, 20 ,20 ,20 ,20 ,20 ,20 ,20, 20 ,20, 20 ,20, 20 ,20, 20)
Hi<-c(400 ,300 , 200, 0 ,-200 , -400 ,-600 , -800 ,-1000 ,-1000 ,-1200, -1220 ,-1300 ,-1400,-1400 ,-1500, -1600, -1700 ,-1700 ,-1800 ,-1900 , 400 , 200 , 0 ,-200, -400 ,-600 , -800,-1000 ,-1200, -1200 ,-1400 ,-1600 ,-1600 ,-1800 ,-2000 ,-2000 ,-2200 ,-2200 ,-2400 ,-2600 ,-2800,-3000 , 400 , 200 , 0 ,-200 ,-300 , -400 , -500 ,-600 ,-700 ,-800 ,-900 ,-1000 ,-1100,-1200 ,-1200 ,-1400, -1600 ,-1800 ,-1800 ,-2000 ,-2200 ,-2400 ,-2400 ,-2600 ,-2800 ,-3000 , 400,200 , 0, -200, -400 ,-600 ,-800, -1000 ,-1200 ,-1400 ,-1600 ,-1600 ,-1800 ,-2000, -2200,-2400 ,-2400, -2600, -2800 ,-3000 ,1000 , 800 , 600 , 400 , 200 , 0 ,-200 , -400 , -600, -800 ,-1000, -1200 ,-1400, -1600 ,-1800, -2000 ,-2200, -2400 ,-2600 ,-2800 ,-3000)
Val<-c(163301.080, 269704.110 ,334570.550, 409536.530, 433021.260 ,418962.060, 349554.460, 253987.570,124461.710, 140750.480 ,52612.790 , 54286.427 ,26150.025 ,14631.210 ,15780.244 , 8053.618, 4402.581, 2251.137 , 2743.511 , 1707.508 , 1246.894 ,176232.060 ,270797.240 ,323096.710,333401.080, 311949.900 ,272821.770 ,189571.850 ,114263.560 ,51939.070 ,62578.665 ,36905.438, 22625.515, 22940.591 ,14576.295 , 9686.653 , 10344.214 , 6912.779 , 7092.919 ,5366.797, 4058.492, 3270.734 , 2528.644 ,89311.555 ,116698.175 ,143588.620 ,139203.190, 145399.445, 145635.715, 134671.110 ,128931.160 ,119734.835 ,108708.815 , 90221.955 ,81692.585 , 64882.275,58215.735, 60443.190 ,44690.690 , 33224.152 , 24140.272 , 24913.280 ,19082.689 ,13920.669, 11074.718, 10015.653 ,8743.850 , 7516.880 , 6377.743 , 36888.842 ,43088.720 ,47904.490, 51298.710, 51120.887 ,47687.488 ,42238.912 , 38563.007 , 33902.918 ,28565.303 ,23700.862,24818.393, 21620.129 , 17816.061 ,15377.097 , 12992.321 ,12985.911 ,11177.941 ,9536.621,8357.279, 13052.178 , 14325.789 ,15120.314 , 16227.575 ,17226.307 ,18557.270 ,18680.326, 18844.544, 18205.607, 17770.311 ,16605.438 , 16062.309 ,14785.654 ,14324.493 ,13373.627,12135.392, 10632.699, 9155.762 , 8240.951, 6934.240 , 6475.927)
Function<-function(Hi,Di,param){
25*exp(
-((Hi)/(2 * param[1]))^2
- Di*(1/param[2] + 1/param[3])
)
}
ls<-function(param,Val,Hi,Di){
print(Hi)
eta<-Function(Hi,Di,param)
print(eta)
print(Val)
sum((Val - eta)^2)
}
startparam<-c(50,35,9)
optval<-optim((startparam,ls,NULL,method="L-BFGS-B",Val,Hi,Di), lower =c(20,10,0), upper =c(100,70,25))
print(optval)
这似乎工作正常:
opt1 <- optim(startparam,
fn=ls,method="L-BFGS-B",
Val=Val,Hi=Hi,Di=Di,
lower =c(20,10,0), upper =c(100,70,25))
请注意,Val
、Hi
、Di
的值通过 optim
传递给 objective 函数。