2015-09-30 38 views
1

我遇到了一個問題,調用下面的代碼中定義的函數。根據Matlab,我沒有足夠的輸入參數在嵌套函數池,當我使用功能通過輸入「Awesomefit(V,I,Ierr)」。然而,我無法真正解釋爲什麼,因爲應該提供函數需要的所有輸入。V,I和Ierr是148x1 double的矩陣,並在調用函數之前得到初始化。無法找到爲什麼錯誤「沒有足夠的輸入參數」,Matlab

有沒有人有一個想法可能會失蹤?

Matlab還在fminsearch中顯示了一條錯誤消息。我不知道這是否與其他錯誤信息有關或錯誤地使用「fminsearch」命令。現在我認爲這是後一種可能性。但這絕對不是我的主要問題。我希望一旦我解決了另一個問題,我就可以應對。

請原諒我的非正統的編程風格,但我想程序的物理學家:/我仍然給我最好的,但..

%% do stuff 

function a = Awesomefit(V,I,Ierr) 

% initialize starting values 
A = 1; 
Vbd = 25; 
n = 1.2; 
b = -0.01; 
Var = [Vbd n b]; 

%do stuff 
a = fminsearch(Chi,Var); 


function Ifit = InotNorm(V,Vbd,n,b) 
    Ifit = zeros(size(V)); 
    for i = 1:length(V) 
     if V(i) < Vbd, 
      Ifit(i) = 2*10^-12; 
     else 
      Ifit(i) = A * abs((V(i)-Vbd)/(V(i)-Vbd+1/(n*b)))^n; 
     end 
    end 
end 


function NM = NormMod(Vbd,n,b) 
    NM = sum(InotNorm(V,Vbd,n,b) ./ Ierr); 
end 


function ND = NormDat(I,Ierr) 
    ND = sum(I ./ Ierr); 
end 


function C = Chi(Vbd,n,b) 
    C = sum(((InotNorm(V,Vbd,n,b) .* NormDat(I,Ierr) ./ NormMod(Vbd,n,b) - I) ./ Ierr).^2); 
end 


end 

回答

4

兩個問題:

  1. 的函數您試圖最小化Chi - 此功能的輸入必須是單個變量。該文檔具體說明了這一點:http://www.mathworks.com/help/matlab/ref/fminsearch.html。因此,如果你有三個變量你試圖最小化,你必須把它們放到一個單獨的向量中......就像你使用Var所做的那樣。因此,你需要改變Chi,以反映這一點:

    function C = Chi(in) %// Change 
        Vbd = in(1); %// Change 
        n = in(2); %// Change 
        b = in(3); %// Change 
        C = sum(((InotNorm(V,Vbd,n,b) .* NormDat(I,Ierr) ./ NormMod(Vbd,n,b) - I) ./ Ierr).^2); 
    end 
    
  2. 第一輸入fminsearch要求是函數處理如果你仔細閱讀文檔。因此,你只需要您的通話fminsearch改變這一點:

    a = fminsearch(@Chi, Var); 
    

    當你這樣做之前:

    a = fminsearch(Chi, Var); 
    

    MATLAB解釋Chi變量,而不是一個功能....這這就是爲什麼你得到這個錯誤。您需要將句柄作爲fminsearch的第一個輸入參數傳遞給函數。您可以將句柄想象爲您試圖最小化的函數的「指針」。瞭解更多關於函數處理此:http://www.mathworks.com/help/matlab/matlab_prog/creating-a-function-handle.html

這樣做並設置V = I = Ierr = 1,我得到這個:

>> Awesomefit(1,1,1) 

ans = 

    25.0000 1.2000 -0.0100 
+1

感謝很多:)這實際上做的伎倆。 – MSergio

+0

@ MSergio - 完全沒問題。祝你好運! – rayryeng

相關問題