Matlab: In function "fminsearch(fun,x0)" x0 not getting accepted as matrix -
in matlab documentation function fminsearch(fun,x0) , x0
can scalar, vector, or matrix. trying call function :
weight=2; delta_obj=@(k_to_perturb_annealing) gibbs_sampling_sisim_well_testing(k_to_perturb_annealing); k_to_perturb_annealing=fminsearch(delta_obj,k_to_perturb_annealing_initial);
where, k_to_perturb_annealing_initial 101x82 matrix. getting stuck error on line k_to_perturb_annealing=fminsearch(delta_obj,k_to_perturb_annealing_initial);
error message:
??? subscripted assignment dimension mismatch. error in ==> fminsearch @ 195 fv(:,1) = funfcn(x,varargin{:}); error in ==> optimizing_by_perturbing_sisim_perm @ 31 k_to_perturb_annealing=fminsearch(delta_obj,k_to_perturb_annealing_initial);
the function gibbs_sampling_sisim_well_testing(k_to_perturb_annealing) calling above is:
function[obj_fun]=gibbs_sampling_sisim_well_testing(k_to_perturb_annealing) %% parameters ncell=40000; a=((sqrt(ncell)*500*sqrt(ncell)*500))/43560; % area of reservoir in acres nw=5; % number of production wells xy_wells=[170,130,70,40,20;50,125,190,100,20]; % 1st , 2nd rows represent x , y coordinates respectively r_investigation=sqrt((a*43560)/(pi*nw)); % in ft r_inv_cells=ceil(r_investigation/500); %% loading testing permeability values both drawdown , buildup k_well_testing_dd_sisim=load('k_well_testing_dd_sisim'); k_well_testing_bup_sisim=load('k_well_testing_bup_sisim'); k_dd=struct2cell(k_well_testing_dd_sisim); k_dd=k_dd{1}; k_bup=struct2cell(k_well_testing_bup_sisim); k_bup=k_bup{1}; %% computing k_eff using testing perms , k_geomean using reference model of sisim simulated perms %# computing effective permeability value testing k_eff=mean([mean(k_dd),mean(k_bup)]); %# geomean value of permeability taken geomean of 2 times r_inv_cells perm values in x , y direction around 1 k_geomean=geomean(geomean(k_to_perturb_annealing)); %# storing coordinates of k_to_perturb_annealing x=max(xy_wells(1,1)-r_inv_cells,1):min(xy_wells(1,1)+r_inv_cells,sqrt(ncell)); y=max(xy_wells(2,1)-r_inv_cells,1):min(xy_wells(2,1)+r_inv_cells,sqrt(ncell)); i=1:length(x) xcoord_k_to_perturb_annealing(1:length(y),i)=x(i); ycoord_k_to_perturb_annealing(1:length(y),i)=y; end xcoord_k_to_perturb_annealing=reshape(xcoord_k_to_perturb_annealing,(length(y)*length(x)),1); ycoord_k_to_perturb_annealing=reshape(ycoord_k_to_perturb_annealing,(length(y)*length(x)),1); %# changing gridded k_to_perturb_annealing vector form vector_k_to_perturb_annealing=reshape(k_to_perturb_annealing,(length(y)*length(x)),1); %% reading perm_sampledata_for_annealing gslib .dat file using `gslib_file_to_mat_general.mat' function nmodel_sampledata=3; ncell_sampledata=20; nmodel_want_sampledata=3; [perm_sampledata_for_annealing]=gslib_file_to_mat_general(nmodel_sampledata,ncell_sampledata,nmodel_want_sampledata,'perm_sampledata_5wells_sisim_for_annealing_gslib_format'); %# separating contents of file perm values , coordinates xcoord_perm_sampledata_for_annealing=perm_sampledata_for_annealing(:,1); ycoord_perm_sampledata_for_annealing=perm_sampledata_for_annealing(:,2); values_perm_sampledata_for_annealing=perm_sampledata_for_annealing(:,3); %% using variogram.mat function compute variogram values , lag distances %# perm_sampledata_for_annealing variogram_perm_sampledata=variogram([xcoord_perm_sampledata_for_annealing ycoord_perm_sampledata_for_annealing],values_perm_sampledata_for_annealing,'plotit',false,'nrbins',50,'anisotropy',true); variogram_perm_sampledata=struct2cell(variogram_perm_sampledata); gamma_perm_sampledata=variogram_perm_sampledata{1}; theta_perm_sampledata=(variogram_perm_sampledata{2})*(180/pi); h_perm_sampledata=variogram_perm_sampledata{4}; %# k_to_perturb_annealing memory_cells=randperm(2000); % due lack of memory space, have use maximum of 2000 points variogram_k_to_perturb_annealing=variogram([xcoord_k_to_perturb_annealing(memory_cells) ycoord_k_to_perturb_annealing(memory_cells)],vector_k_to_perturb_annealing(memory_cells),'plotit',false,'nrbins',50,'anisotropy',true); variogram_k_to_perturb_annealing=struct2cell(variogram_k_to_perturb_annealing); gamma_k_to_perturb_annealing=variogram_k_to_perturb_annealing{1}; theta_k_to_perturb_annealing=(variogram_k_to_perturb_annealing{2})*(180/pi); h_k_to_perturb_annealing=variogram_k_to_perturb_annealing{4}; %% optimization , perturbation weight=2; obj_fun=((gamma_perm_sampledata-gamma_k_to_perturb_annealing).^ weight)+((k_geomean-k_eff).^weight);
i think problem
obj_fun=((gamma_perm_sampledata-gamma_k_to_perturb_annealing).^ weight)+((k_geomean-k_eff).^weight);
you need change ((gamma_perm_sampledata-gamma_k_to_perturb_annealing).^ weight) scalar k_geomean scalar
try use (norm((gamma_perm_sampledata-gamma_k_to_perturb_annealing),2)^weight), or (norm((gamma_perm_sampledata-gamma_k_to_perturb_annealing),'fro')^weight) or ...
Comments
Post a Comment