Changeset 3134


Ignore:
Timestamp:
02/25/10 08:25:01 (15 years ago)
Author:
Mathieu Morlighem
Message:

simplified parametercontroloptimization

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk/src/m/classes/public/parametercontroloptimization.m

    r3129 r3134  
    1010%
    1111%   Example:
    12 %      md=parametercontroloptimization(md,'nsteps',30)
     12%      md=parametercontroloptimization(md,'nsteps',6)
    1313
    1414%process options
     
    2121%variable
    2222cmax_max=1000;
     23cm_maxs=linspace(cmax_max/10,cmax_max,3);
    2324optscal_max=1000;
     25optscals=linspace(optscal_max/10,optscal_max,3);
     26fits=[0 2];
    2427%Kept constant
     28md2.verbose=0;
    2529md2.cm_min=1;
    26 md2.nsteps=5;
     30md2.eps_cm=NaN;
    2731md2.cm_noisedmp=0;
    2832md2.cm_maxdmp_slope=0;
    2933md2.cm_mindmp_slope=0;
    30 md2.eps_cm=NaN;
     34md2.nsteps=getfieldvalue(options,'nsteps',5);
     35md2.control_type=getfieldvalue(options,'md2.control_type','drag');
    3136md2.maxiter=10*ones(md2.nsteps,1);
    3237md2.cm_jump=0.99*ones(md2.nsteps,1);
    33 md2.verbose=0;
    3438md2.control_analysis=1;
    35 md2.control_type=getfieldvalue(options,'md2.control_type','drag');
    3639
    37 %Get nsteps
    38 nsteps=getfieldvalue(options,'nsteps',50);
    39 if mod(nsteps,5)~=0,
    40         error('''nsteps'' option should be a multiple of 5')
    41 end
     40%loop over the set of parameters
     41best=0;
     42count=1;
     43for fit=fits,
     44        md2.fit=fit*ones(md2.nsteps,1);
     45        for cm_max=cm_maxs;
     46                md2.cm_max=cm_max;
     47                for optscal=optscals;
     48                        md2.optscal=optscal*ones(md2.nsteps,1);
    4249
    43 %loop over the set of 5 steps
    44 fit_final=[];
    45 cmmax_final=[];
    46 optscal_final=[];
    47 for i=1:nsteps/5,
    48         disp(['Step ' num2str(i) '/' num2str(floor(nsteps/5))]);
    49         best=0;
    50         for fit=[0 2],
    51                 md2.fit=fit*ones(md2.nsteps,1);
    52                 for cm_max=linspace(cmax_max/10,cmax_max,3),
    53                         md2.cm_max=cm_max;
    54                         for optscal=linspace(optscal_max/10,optscal_max,3),
    55                                 md2.optscal=optscal*ones(md2.nsteps,1);
     50                        %current run
     51                        disp(sprintf('\n   Step %i/%i, fit=%i, cm_max=%g, optscal=%g\n',count,length(cm_maxs)*length(optscals)*length(fits),fit,cm_max,optscal))
     52                        md2=solve(md2,'analysis_type','diagnostic');
     53                        count=count+1;
    5654
    57                                 %current run
    58                                 md2=solve(md2,'analysis_type','diagnostic');
    59 
    60                                 %Check misfit difference
    61                                 rel=(md2.results.diagnostic.J(1)-md2.results.diagnostic.J(end))/md2.results.diagnostic.J(1);
    62                                 disp(['   ΔJ/J=' num2str(rel*100) '% for fit=' num2str(fit) ',cm_max=' num2str(cm_max) ', and optscal=' num2str(optscal) ]);
    63                                 if (rel>best),
    64                                         disp(['   --> best for this step']);
    65                                         fit_final(:,i)    =md2.fit;
    66                                         cmmax_final(:,i)  =md2.cm_max;
    67                                         optscal_final(:,i)=md2.optscal;
    68                                         drag=md2.results.diagnostic.parameter;
    69                                         best=rel;
    70                                 end
     55                        %Check misfit difference
     56                        rel=(md2.results.diagnostic.J(1)-md2.results.diagnostic.J(end))/md2.results.diagnostic.J(1);
     57                        disp(['   ΔJ/J=' num2str(rel*100) '% for fit=' num2str(fit) ',cm_max=' num2str(cm_max) ', and optscal=' num2str(optscal) ]);
     58                        if (rel>best),
     59                                disp(sprintf('   --> current best'))
     60                                fit_final    =md2.fit;
     61                                cmmax_final  =md2.cm_max;
     62                                optscal_final=md2.optscal;
     63                                best=rel;
    7164                        end
    7265                end
    7366        end
    74         %Plug best drag;
    75         md2.drag=drag;
    7667end
    7768
    7869%load final parameters onto initial model
    79 md.fit    =fit_final(:);
    80 md.cm_max =cmmax_final(:);
    81 md.optscal=optscal_final(:);
     70md.fit    =fit_final;
     71md.cm_max =cmmax_final;
     72md.optscal=optscal_final;
Note: See TracChangeset for help on using the changeset viewer.