Halli hallo,
ich brauche dringend Eure Hilfe. Ich möchte einen bikonischen Fit so wichten, dass die zentralen Werte mehr zählen. Gibt es dafür eine einfache Möglichkeit?
Meine bisherige Funktion lautet so:
Code:
function[fitresult, gof, output] = biconic_fitVOCT(x, y, Z, lower, upper, start, model, tolfun) % BICONIC_FIT % This function fits the biconic, given by the formula model, to the % corneal surface data specified in the vector Z. The spatial coordinates % of each data point are given by the vectors x and y. Upper and lower % bounds as well as the starting point are defined by the vectors upper, % lower and start.
%
% INPUT ARGS % x, y [double]: 2-dimensional coordinate system (vectors) % Z [double]: measurement values (vector) % lower, upper, start [1x10 double]: boundaries and starting point % (vectors) % model [char]: model function to be fitted % tolfun [double]: termination tolerance for the model parameters
%
% OUTPUT ARGS % fitresult [1x1 sfit]: fit result % gof [1x1 struct]: goodness-of-fit statistics % output [1x1 struct]: fitting algorithm information
% Set up fittype and options.
ft = fittype( model, 'independent', {'x', 'y'}, 'dependent', 'z' );
opts = fitoptions( 'Method', 'NonlinearLeastSquares' );
opts.Lower = lower; % unterer Grenzwert
opts.StartPoint = start; % Startpunkt
opts.Upper = upper; % oberer Grenzwert
opts.MaxFunEvals = 10000; % maximale Anzahl von Funktionsauswertungen
opts.MaxIter = 10000; % maximale Anzahl Iterationsn
opts.Algorithm = 'Trust-Region'; % Trust-Region-Algorithmus verwenden
opts.Robust = 'Off'; % keine MATLAB-eigene Regressionsmethode verwenden (z.B. Re-weighting)
%opts.Display = 'iter'; % Zwischenergebnisse einer jeden Iteration ausgeben
opts.TolFun = tolfun; % Abbruchkriterium: Konvergenz der Modellparameter
% Fit model to data. [fitresult, gof, output] = fit([x, y], Z, ft, opts );
Danke, dass habe ich auch schon gefunden. Wenn ich einen kreisförmigen Bereich in der Mitte mehr gewichten will, wie muss das die Gewichtsfunktion lauten? Einfach die Defintion eines Kreises? Sind dann automatisch die im Kreis liegenden Werte mehr gewichtet?
Ich kann leider nicht nur die x-Werte gewichten, da ich eine Fläche habe, die ich fitten möchte (siehe Bild). Ich habe jetzt eine Gewichtsfunktion eingegeben, die wie folgt lautet:
die Funktion an sich hat ja wenig mit MATLAB zu tun.
Kreisinneres: Gewicht r
Kreisrand und außerhalb: Gewicht 0
Dazwischen abgestuft.
Ja, die kannst du mit weight... benutzen. Im Zweifelsfall mal ausprobieren :)
r ist der Radius. Es wird das Maximum des Gewichts und von 0 genommen um zu verhindern, dass die Gewichte außerhalb des Kreises negativ werden. Das steht aber auch in der Doku von
max
.
Oh man, ich bin aber auch schwer von kp^^
Danke für die nette Erklärung. Am liebsten hätte ich es ja, wenn in der Mitte meiner Fläche die Werte hoch gewichtet werden und die Gewichtung zum Rand abnimmt. Gibt es dafür vllt noch eine andere Möglichkeit außer einen Kreis? Vllt irgendwie reziprok? Mit 1/x? aber wie man ich das zweidimensional? 1/x+1/y?
Ich danke Dir sehr für deine Hilfe. Leider möchte mein Professor nun, dass ich einen Kegelstumpf als Gewichtsfunktion benutze. Also in der Mitte einen Kreis mit hoher Gewichtung und dann parabelförmig nach Außen in alle Richtungen abfallen....
Ich hab noch keine Idee wie ich das Problem löse
Kegelstumpf und Parabel passen m.E. nicht zusammen.
Kegelstumpf: w = 1 - r
Parabelförmig: nicht eindeutig, z.B. w = (r-1).^2
Grüße,
Harald
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.