0

В документации Matlab для функции fminsearch(fun,x0), x0 может быть скаляр, вектор или матрица. Однако я пытаюсь вызвать эту функцию:Matlab: В функции «fminsearch (fun, x0)» x0 не принимается в качестве матрицы

weight=2; 
[email protected](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); 

Где k_to_perturb_annealing_initial является 101x82 матрицей. Я застрял с ошибкой в ​​строке k_to_perturb_annealing = fminsearch (delta_obj, k_to_perturb_annealing_initial);

Сообщение об ошибке:

??? Subscripted assignment dimension mismatch. 
Error in ==> fminsearch at 195 
fv(:,1) = funfcn(x,varargin{:}); 
Error in ==> optimizing_by_perturbing_SISIM_perm at 
31 
k_to_perturb_annealing=fminsearch(delta_obj,k_to_perturb_annealing_initial); 

Функция gibbs_sampling_sisim_well_testing (k_to_perturb_annealing) Я зову выше:

function[obj_fun]=gibbs_sampling_sisim_well_testing(k_to_perturb_annealing) 

%% Well 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 and 2nd rows represent x and y coordinates respectively 
r_investigation=sqrt((A*43560)/(pi*Nw)); % in ft 
r_inv_cells=ceil(r_investigation/500); 

%% Loading the well testing permeability values for both drawdown and 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 the k_eff using well testing perms and k_geomean using reference model of SISIM simulated perms 

%# Computing effective permeability value from well testing 
k_eff=mean([mean(k_dd),mean(k_bup)]); 

%# geomean value of permeability is taken as geomean of 2 times r_inv_cells perm values in X and Y direction around well 1 
k_geomean=geomean(geomean(k_to_perturb_annealing)); 

%# Storing the 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)); 

for 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 the gridded k_to_perturb_annealing to a vector form 
vector_k_to_perturb_annealing=reshape(k_to_perturb_annealing,(length(y)*length(x)),1); 

%% Reading perm_sampledata_for_annealing from 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 the contents of file perm values and their 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 to compute variogram values and lag distances 

%# for 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}; 

%# for k_to_perturb_annealing 

memory_cells=randperm(2000); % due to lack of memory space, have to 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 and Perturbation 

weight=2; 
obj_fun=((gamma_perm_sampledata-gamma_k_to_perturb_annealing).^ weight)+((k_geomean-k_eff).^weight); 
+0

TMI !! скорее, TMC !! –

+0

doob: Что это? – Pupil

+0

В чем вопрос? Кроме того, если это связано с вашим предыдущим вопросом, вы можете захотеть убедиться, что gamma_perm_sampledata является двойной (а не матрицей), иначе obj_fun будет иметь много на своей пластине (т.е. получить матричную норму). – Rasman

ответ

1

Я думаю, ваша проблема

obj_fun=((gamma_perm_sampledata-gamma_k_to_perturb_annealing).^ weight)+((k_geomean-k_eff).^weight); 

вам нужно изменить ((gamma_perm_sampledata-gamma_k_to_perturb_annealing).^Вес) в скаляр как k_geomean скалярная

попробовать использовать (норма ((gamma_perm_sampledata-gamma_k_to_perturb_annealing), 2)^веса), или (норма ((gamma_perm_sampledata-gamma_k_to_perturb_annealing), 'fro')^вес) или ...

+0

Спасибо Расман, его работа. Хотя я не уверен, что он застрял или его время для запуска. Я просто остановил программу между ними. Знаете ли вы, сколько времени потребуется для получения результатов? Благодаря! – Pupil

+0

это огромная матрица, поэтому, вероятно, потребуется некоторое время. Один из вариантов заключается в том, что вы можете ограничить счетчик итераций, а затем использовать вывод как новую матрицу инициализации. Другой вариант начинается с «tic», а затем заканчивается током в вашей функции (который расскажет вам, сколько времени занимает каждая итерация). FWIW, это причина, по которой у меня есть зверь машины для этих вычислений. – Rasman

+0

Спасибо Расман. Но я не использую счетчик итераций в своей программе, чтобы вызвать 'fminsearch (delta_obj, k_to_perturb_annealing_initial);'. Я звоню только один раз. Можете ли вы немного уточнить, как я могу использовать те методы, которые вы указали, чтобы проверить, сколько времени потребуется для его выполнения. К этому моменту моя программа все еще работает. – Pupil