[ADMB Users] semi-implicit differential equation codes

Saang-Yoon shyunuw at gmail.com
Sun Apr 1 11:29:35 PDT 2012


Dear all.
Following Dr. David Fournier's advice (e.g., ADMB manual version
10.0), I use a semi-implicit differential equation for the simple
logistic surplus production model; see my TPL codes below.  I
successfully did complie-link, and created the resultant executable
file (.exe). However, estimates of fishing mortality rates in years
are all zero, and I suspect something wrong in my TPL codes. Even
without DAT and PIN files, some of you may find what I have to do to
avoid the problem.  I could send you DAT and PIN files; here I don't
see the attachment function. I don't have data on fishing effort, and
my codes below are a little different from those in the ADMB manual.
My data are
time series only of commercial catch (or yield) and survey index.  I
would greatly appreciate your help.  Saang-Yoon



DATA_SECTION
  int i;  //for loop;
  int j;  //for loop;

  init_vector years(1,3);
  int nyrs;
  int ncol;  //data column
  !!nyrs=years(2)-years(1)+1;
  !!ncol=size_count(years);

  init_matrix yieldsurvey(1,nyrs,1,ncol);
  vector yrs(1,nyrs);
  vector Yt(1,nyrs);
  vector It(1,nyrs);

  !!yrs=trans(yieldsurvey)(1);
  !!Yt=trans(yieldsurvey)(2);  //yield;
  !!It=trans(yieldsurvey)(3);

  number minK;
  number maxK;
  !!minK=max(Yt)-max(Yt)*15/100;
  !!maxK=minK+minK*3000/100;

  number minY;
  number maxY;
  number meanY;
  !!minY=min(Yt);
  !!maxY=max(Yt);
  !!meanY=mean(Yt);

  !!cout<<"yrs: "<<yrs<<endl;
  !!cout<<"Yt: "<<Yt<<endl;
  !!cout<<"It: "<<It<<endl;
  !!cout<<"K range: "<<minK<<" "<<maxK<<endl;


PARAMETER_SECTION
  init_bounded_number q(0.0,1.0,1);
  init_bounded_number r(0.0,5,2);
  init_bounded_number K(minK,maxK,3);   //aka B_infinitive
  init_bounded_number b1(0.0,1.0,4);     //B1=b1*K;
  init_bounded_dev_vector F_devs(1,nyrs,-5.0,5.0,5);

  number B1;
  vector Bt(1,nyrs+1);
  vector Ft(1,nyrs);

  vector predYt(1,nyrs); //expected yield in year t
  vector predIt(1,nyrs);

  vector sig2It(1,nyrs);

  vector meanlogIt(1,nyrs);
  number varlogI;

  number varlogY;

  number Bpen;
  number bio_tmp; //biomass temporary
  number y_tmp; //yield temporary

  number Bmsy;
  number msy; //msy;
  number Fmsy;

  objective_function_value f;

PROCEDURE_SECTION
  B1=b1*K;

  f=0.0;
  Bpen=0;
  //cout<<"f1: "<<f<<endl;

  //Project B_t
  Bt(1)=B1;
  Bt(1)=posfun(Bt(1),Yt(1),Bpen); //keeps it above

  //Ft
  for(i=1;i<=nyrs;i++)
    Ft(i)=Ft(i)*exp(F_devs(i));

  //four time steps per year desired
  int nsteps=4;
  double delta=1.0/nsteps;
  //integrate the logistic dynamics over n time steps per year
  for(i=1;i<=nyrs;i++)   {
     bio_tmp=1.e-20+Bt(i);
	 y_tmp=0.0;  //yield
	 for(j=1;j<=nsteps;j++) {
	    bio_tmp=bio_tmp*(1.0+r*delta)/(1.0+(r*bio_tmp/K+Ft(i))*delta);
	    y_tmp=y_tmp+Ft(i)*bio_tmp*delta;
     };
     predYt(i)=y_tmp; //expected yield;
     Bt(i+1)=bio_tmp;
     Bt(i+1)=posfun(Bt(i+1),meanY,Bpen);  //keeps it above
  };
  f+=Bpen;

  //
  //survey as ROUTINE;
  for(i=1;i<=nyrs;i++)
	 predIt(i)=q*Bt(i);
  varlogI=norm2(log(It)-log(1.e-10+predIt))/nyrs;
  f+=0.5*nyrs*log(varlogI)+norm2(log(It)-log(1.e-10+predIt))/
(2.0*varlogI);
  cout<<"f3: "<<f<<endl;

  //
  //commerical yield as ROUTINE;
  varlogY=norm2(log(Yt)-log(1.e-10+predYt))/nyrs;
  f+=0.5*nyrs*log(varlogY)+norm2(log(Yt)-log(1.e-10+predYt))/
(2.0*varlogY);
  cout<<"f4: "<<f<<endl;


  //management references
  Bmsy=K/2;
  msy=r*K/4;  //MSY;
  Fmsy=msy/Bmsy;


REPORT_SECTION
  report<<"yr Yt It Bt predIt varlogI Ft Ft/Fmsy (Bt-Yt) f Bpen
max.grad"<<endl;
  for(i=1;i<=nyrs;i++)   {
    report<<yrs(i)<<" "<<Yt(i)<<" "<<It(i)<<" "<<Bt(i)<<"
"<<predIt(i)<<" ";
    report<<varlogI<<" "<<Ft(i)<<" "<<Ft(i)/Fmsy<<" ";
    report<<Bt(i)-Yt(i)<<" "<<f<<" "<<Bpen<<"
"<<objective_function_value::gmax<<endl;
  };


GLOBALS_SECTION
  #include <admodel.h>
  #include <math.h>
  #include <stdio.h>
  #include <stddef.h>
  #include <stdlib.h>




More information about the Users mailing list