Changeset 3134
- Timestamp:
- 02/25/10 08:25:01 (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk/src/m/classes/public/parametercontroloptimization.m
r3129 r3134 10 10 % 11 11 % Example: 12 % md=parametercontroloptimization(md,'nsteps', 30)12 % md=parametercontroloptimization(md,'nsteps',6) 13 13 14 14 %process options … … 21 21 %variable 22 22 cmax_max=1000; 23 cm_maxs=linspace(cmax_max/10,cmax_max,3); 23 24 optscal_max=1000; 25 optscals=linspace(optscal_max/10,optscal_max,3); 26 fits=[0 2]; 24 27 %Kept constant 28 md2.verbose=0; 25 29 md2.cm_min=1; 26 md2. nsteps=5;30 md2.eps_cm=NaN; 27 31 md2.cm_noisedmp=0; 28 32 md2.cm_maxdmp_slope=0; 29 33 md2.cm_mindmp_slope=0; 30 md2.eps_cm=NaN; 34 md2.nsteps=getfieldvalue(options,'nsteps',5); 35 md2.control_type=getfieldvalue(options,'md2.control_type','drag'); 31 36 md2.maxiter=10*ones(md2.nsteps,1); 32 37 md2.cm_jump=0.99*ones(md2.nsteps,1); 33 md2.verbose=0;34 38 md2.control_analysis=1; 35 md2.control_type=getfieldvalue(options,'md2.control_type','drag');36 39 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 41 best=0; 42 count=1; 43 for 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); 42 49 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; 56 54 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; 71 64 end 72 65 end 73 66 end 74 %Plug best drag;75 md2.drag=drag;76 67 end 77 68 78 69 %load final parameters onto initial model 79 md.fit =fit_final (:);80 md.cm_max =cmmax_final (:);81 md.optscal=optscal_final (:);70 md.fit =fit_final; 71 md.cm_max =cmmax_final; 72 md.optscal=optscal_final;
Note:
See TracChangeset
for help on using the changeset viewer.