2016-08-08 6 views
0

ich eine Funktion als ‚calculateResults.m‘ gespeichert, in dem die Funktion ‚ode45‘ verschachtelte ist:MATLAB belegbare Funktionsdatei als fittype

function y = calculateResults (concV, ksV, xTrace) 
options = odeset('NonNegative', [1:size(concV,2)], 'RelTol', 1e-6, 'AbsTol', 1e-12); 
[x,y] = ode45(@(t, cY)odeSet(t, cY, ksV), xTrace, concV, options); 

Ich möchte diese Funktion als fittype verwenden:

ft = fittype('calculateResults(concV, ksV, x)','independent',{'x'}); 

Allerdings hat dies bewirkt, dass der Fehler:

Error using fittype/testCustomModelEvaluation (line 12) Expression calculateResults(concV, ksV, x) is not a valid MATLAB expression, has non-scalar coefficients, or cannot be evaluated: Error in fittype expression ==> calculateResults(concV, ksV, x) ??? Index exceeds matrix dimensions.

Mein Ziel ist es, die Werte von ‚concV‘ zu variieren, um zu passen die Funktion 'calculateResults.m' auf bestimmte Daten (x und y):

mdl = fit(x, y, ft); 

Und schließlich die Werte von concV zurück, die die Daten am besten passen:

concVCalc = mdl.Coefficients.Estimate; 

Bitte um Hilfe! Vielen Dank!

+0

Nun, der Fehler ist ziemlich klar. Irgendwo überschreitet ein Index die Matrixdimensionen. Hast du schon herausgefunden, wo das passiert? – Adriaan

+0

@Adriaan Auswertung y = calculateResults (concV, ksV, x); unabhängig funktioniert gut - Suggestion ich mache etwas grundsätzlich falsch. Vielleicht ist meine Syntax falsch, aber ich habe dies anhand des MathWorks-Beispiels überprüft. – Pete

+0

Ich würde versuchen, die Typen aller Variablen im Ausdruck anzugeben. Sie müssen wissen, wie man 'concV' und' ksV' interpretiert. Sieht aus wie 'concV' ist ein" Koeffizient "und' ksV' ist eine "Problem" Variable? – Peter

Antwort

0

gelöst, indem die Koeffizienten als einzelne Variablen anstatt eines Arrays geben:

ft = fittype('calculateResultsForFit(x,concV1,concV2,concV3,concV4,concV5,concV6,concV7,concV8,concV9,concV10,concV11,concV12,concV13,concV14,concV15,concV16,concV17,concV18,concV19,concV20)'); 

    mdl = fit(x', yToFit', ft,'StartPoint',[concV1,concV2,concV3,concV4,concV5,concV6,concV7,concV8,concV9,concV10,concV11,concV12,concV13,concV14,concV15,concV16,concV17,concV18,concV19,concV20],'Lower',zeros(1,20)); 

Variable Ksv nun innerhalb der Funktion definiert, angebracht ist.

Verwandte Themen