Matlab: вернуть несколько значений параметров из nlinfit (сейчас я прохожу только один индекс цикла) - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь передать три массива cell2mat для I, V, H через эту функцию и вывести на экран результат параметра из модели nlinfit, приведенной ниже.Но когда код выполняется, он ничего не отображает и сохраняет только одно значение.Любая помощь приветствуется :)

function [Icp] = Fraunhofer_Function(I,V,H)        

V1 = @(b,I)(b(1).*sign(I).*real(sqrt(I.^2 - (sign(I).*(   (b(2)+b(3)/2)  )).^2)) + b(4));
Vthresx = find(V<=1e-3 & V>=0);
Ithresvec = max(I(Vthresx));

Voffsetx = find(I<=0.1e-3 & I>=-.1e-3);
Voffset = max(V(Voffsetx));

Rn =  (max(V)-min(V))/(max(I)-min(I));

beta1 = [Rn; Ithresvec; -Ithresvec; Voffset]; %Init values  b1=Rn b2 = Icp, b3 = Icm, b4 = Voffset
opts = statset('MaxIter', 500000, 'MaxFunEvals', 100000, 'RobustWgtFun', 'andrews');
B1 = nlinfit(I, V, V1, beta1, opts ); %Fit 
Icp = V1(B1,V);


end



  files = dir('*.xlsx*');
  for k =1:length(files)
  filenames = files(k).name;

  txt = 'I,V,H';
  [num,txt,raw] = xlsread(filenames);

  %Put data into numerical columns
  Idata = num(:,1)'; Vdata = num(:,2)'; Hdata = num(:,3)';        
  [Hu,~,idx] = unique(Hdata);
  Isplit = splitapply(@(x) {x}, [Idata(:)],idx);
  Vsplit = splitapply(@(x) {x}, [Vdata(:)],idx);
  Hsplit = splitapply(@(x) {x}, [Hdata(:)],idx);    

  for l = 1:length(Isplit)

      I = (Isplit{l,1});
      V = (Vsplit{l,1});
      H = (Hsplit{l,1});

     %fit the data to the functional form
      Icp = Fraunhofer_Function(I,V,H);              

  end  

end

Пример I, V, H, данные приведены ниже: введите описание изображения здесь

1 Ответ

0 голосов
/ 27 ноября 2018

Сейчас вы просто устанавливаете Icp на второй расчетный коэффициент.Из Matlab docs nlinfit вывод beta:

бета - Вектор оценочных коэффициентов регрессии

Оценочные коэффициенты регрессии, возвращаемые как вектор.Количество элементов в бета-версии равно количеству элементов в бета-версии.

Поэтому, чтобы использовать оценочные параметры, вы должны вызвать modelfun, параметры которого хранятся в B1:

Icp = V1(B1,V);
plot(H,Icp);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...