2017-10-12 97 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)).';