0

i'm trying to use an algorithm to minimise the least squares of models. I'd like to be able to confine all the parameters to within sensible ranges however when i run this script for whatever reason it is disregarding my limits. More of a debugging issue than anything else. Any advice is appreciated

 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)
AW1991
  • 61
  • 5
  • There seem to be typos in your optim call. I won't edit it because I am not sure what you intended. But it will not run if you copy and paste. You should also copy the results of "print(optval)" in there to make it easier for people. It seems to run for me but it runs to the edge of the bounds and stops. – Mike Wise May 31 '15 at 14:30

1 Answers1

1

This seems to work fine:

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))

note that the values of Val, Hi, Di get passed through optim to the objective function.

Ben Bolker
  • 211,554
  • 25
  • 370
  • 453