2016-03-19 7 views
0

Matlab-Anpassung ist zweifellos nützlich, aber es ist nicht klar, wie es als eine Funktion auf der offizielle Webseite gegeben abgesehen von trivialer Integration und Differenzierung zu verwenden: http://uk.mathworks.com/help/curvefit/example-differentiating-and-integrating-a-fit.htmlMatlab fit Objekt als Funktion

Zum Beispiel gegeben eine Anpassung in der Objekt 'Kurve' gespeichert kann man Kurve (x) auswerten, um eine Zahl zu erhalten. Aber wie würde man z.B. integrate | curve (x) |^2 (abgesehen von der ungeschickten Erstellung einer neuen Anpassung)? naiver Versuch,

curve = fit(x_vals,y_vals,'smoothingspline'); 
integral(curve(x)*curve(x), 0, 1) 

gibt einen Fehler:

Output of the function must be the same size as the input. If FUN is an array-valued integrand, set the 'ArrayValued' option to true. 

ich auch eine Arbeit um durch definining eine normale Funktion und eine implizite Funktion für die Integra (unten) versucht haben, aber beide den gleichen Fehler geben.

[email protected](x)(curve(x))...; % trial solution 1 
function func_val=func(curve, x)...; % trial solution 2 

Antwort

0

definieren Funktion für die durch Integration gefolgt Integra mit Option ‚ArrayValued‘ auf ‚true‘ funktioniert:

[email protected](x)(curve(x)*curve(x)); 
integral(func,0,1,'ArrayValued',true) 
0

Sie benötigen die Funktion vektorisiert haben, das heißt Verwendung elementweise Operationen wie curve(x).*curve(x) oder curve(x).^2.

auch sicher, dass die Form der Ausgabe der Eingabe übereinstimmt, das heißt eine Reihe Eingang gibt eine Reihe ausgegeben, in ähnlicher Weise eine Spalte kommt als eine Spalte aus. Es scheint, dass das Auswerten des Anpassungsobjekts immer einen Spaltenvektor zurückgibt (z. B. f(1:10) gibt einen 10 × 1-Vektor und nicht 1 × 10 zurück).

das gesagt ist, hier ein Beispiel:

x = linspace(0,4*pi,100)'; 
y = sin(x); 
y = y + 0.5*y.*randn(size(y)); 
f = fit(x, y, 'smoothingspline'); 

jetzt können Sie integrieren:

integral(@(x) reshape(f(x).^2,size(x)), 0, 1) 

in diesem Fall kann es als einfaches transponieren vereinfacht werden:

integral(@(x) (f(x).^2)', 0, 1)