2017-10-12 1 views
1

Pour une utilisation dans le moins routine d'ajustement carré lsqcurvefit, je besoin d'une fonction en termes d'une représentation de la série comme:Matlab - créer fonction anonyme récursive

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

Toutefois, le montant des termes de la série est d'être déterminé par l'utilisateur; de sorte que la fonction anonyme F doit être créé dans une boucle, comme

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

Malheureusement, la méthode ci-dessus ne fonctionne pas dans les Matlab; Y at-il une possibilité de le faire fonctionner?

+1

Pourquoi vous voulez en faire une fonction anonyme? – Bernhard

+0

Je dois l'utiliser pour la fonction 'lsqcurvefit'; par conséquent, il doit être une fonction anonyme – UlrichH

+3

À moins que je ne comprenne mal quelque chose, selon la documentation, cela devrait fonctionner correctement avec un fichier de fonction normal: https://ch.mathworks.com/help/optim/ug/lsqcurvefit.html# inputarg_fun –

Répondre

0

La meilleure façon d'y parvenir est de combiner des fonctions anonymes et normales.

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 

Ce que je l'ai fait ici est défini la fonction complète qui contient votre modèle avec tous ses paramètres, puis enveloppé que dans une fonction anonyme qui définit le choix de l'utilisateur, les paramètres ne changent pas dans la fonction anonyme, et quitte le paramètre réglable unique en tant qu'entrée. Vous devrez ajuster pour votre modèle particulier, mais c'est votre modèle de base.

1

À moins que je ne comprenne quelque chose, votre fonction n'est pas réellement récursive. Vous pouvez juste faire:

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

ou, si vous voulez spécifier n explicitement:

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

ou, si t est un vecteur de la même taille que D:

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