2017-10-12 96 views
1

對於最小二乘法擬合程序lsqcurvefit,我需要一個函數中使用像一系列代表性方面:MATLAB - 創建匿名函數遞歸

F = @(D, t) F0 - D(1)*(1-exp(-t))... 
       - D(2)*(1-exp(-t))... 
       - D(3)*(1-exp(-t))... 
       ... 
       - D(n)*(1-exp(-t)); 

然而,術語系列中的量是由用戶確定;所以匿名函數F需要被一個循環內創建的,像

F = @(D, t) F0; 
for i=1:n 
    F = F - D(i)*(1-exp(-t)); 
end 

不幸的是,上述方法並不內MATLAB工作;有沒有可能讓它工作?

+1

爲什麼你想做出一個匿名函數嗎? – Bernhard

+0

我需要將它用於'lsqcurvefit'函數;因此它需要是一個匿名函數 – UlrichH

+3

除非我誤解了一些很大的東西,根據文檔,它應該可以正常運行正常的函數文件:https://ch.mathworks.com/help/optim/ug/lsqcurvefit.html# inputarg_fun –

回答

0

做到這一點的最好方法是使用匿名函數和普通函數的組合。

recursionDepth = 5 
CoefficientList = ones(numel(recursionDepth) + 1); 

functionResults = @(t) myFunction(t, CoefficientList, recursionDepth); 

function F = myFunction(t, CoefficientList, Depth) 
    F = CoefficientList(1); 
    for idx = 1:Depth 
     F = CoefficientList(idx) * (1 - exp(-1)); 
    end 
end 

我在這裏所做的定義,包含其所有的參數模型中的全部功能,再包到這一點,設置用戶選擇,匿名函數中的參數不變的匿名功能,將單個可調參數作爲輸入。您必須針對您的特定模型進行調整,但這是您的基本模板。

1

除非我誤解了某些東西,否則你的函數實際上並不是遞歸的。你可以這樣做:

F = @(D,t) F0 - sum(D*(1-exp(-t)); 

,或者,如果你想明確指定n

F = @(D,n,t) F0 - sum(D(1:n)*(1-exp(-t)); 

,或者如果t是一個矢量相同的大小D

F = @(D,n,t) F0 - D(1:n)*(1-exp(-t(1:n)).';