Hallo liebe Community. Aktuelle versuche ich, zwei Funktionen zu fitten die zusammenhängen. Soll heißen, dass die zu suchenden Parameter in beiden Funktionen stecken. Dafür wollte ich fsolve verwenden. Laut Dokumentaion kann der ja sowas. Das ist mein Ergebnis.
Zu erst erstelle ich mir eine Funktion, so wie in der Dokumentation
function F = nonlinmodel( x, C_0, R_m, L_m, C_m, tan_d, w, Re_Y, Im_Y) % C_0, R_m, L_m, C_m, tan_d are the parameters I have to fit.
%
% x(1) to x(5) are there relativ changes
%
% w is the step of the x-Axis
%
% Re_Y and Im_Y are the data sets.
%
% F(1) and F(2) are almost an array of 0. As in the documentation % They are not exactly 0 due to the error % in the inital condition
% Real part % Function out of theory minus measured data
F(1) = x(2)*R_m./((x(2)*R_m).^2 + (w*x(3)*L_m - 1./(w*x(4)*C_m)).^2) + w*x(5)*tan_d*x(1)*C_0 - Re_Y;
% Imaginary part % Function out of theory minus measured data
F(2) = (-w*x(3)*L_m + 1./(w*x(4)*C_m))./((x(1)*R_m).^2 + (w*x(3)*L_m - 1./(w*x(4)*C_m)).^2) + w*x(1)*C_0 - Im_Y;
end
am besten ist es in solchen Fällen, die Funktion mal mit den Anfangswerten aufzurufen.
Du versuchst einen Vektor einem einzelnen Wert zuzuweisen, und das geht nunmal nicht.
Wenn du die Abweichungen komponentenweise auf 0 bekommen willst, würde ich
Die Daten in Figure(3) müssen halt einigermaßen passen. Das tun sie aber leider nicht, da der lsqnonline die Werte nicht ändert. Die Startwete sind gleich die Optimalen Werte. Kann ja nicht sein. Er sagt mir im command window:
der Code erzeugt ja eine Warnung. Ist es deine Absicht, Gradienten zu nutzen? Wenn ja, solltest du die Warnung befolgen. Wenn nein, was ist der Sinn der 2. Funktion?
Willst du f variieren oder x? Du definierst Funktionen von f, also würde auch f variiert.
Wenn du möchtest, dass der Verlauf wie (Re_Y, Im_Y) ist, dann sollten diese schon auch in der Zielfunktion vorkommen.
f hat 3000 Elemente, die Datei 600 Zeilen. Sollte das nicht zusammenpassen?
Re_Y und Im_Y haben beide die gleichen Systemparameter. In Re_Y stecken C_0, R_m, C_m, L_m und tand und in Im_Y stecken C_0, R_m, C_m und L_m. Wenn ich nur Re_Y fitte, kann es sein, dass die Daten aber nicht für Im_Y gut passen. Man kann das sehen, wenn man sich Im_Y über Re_Y (Ortskurve) auftragen lässt.
Es sollen also beide Kurven optimal an der Verlauf der Daten angepasst werden. Daher habe ich ja zwei Funktionen definiert.
Der Schritt mit f = (1:1:3000)'; sollte nur die Darstellung verbessern, da 600 Punkte die Ortskurve etwas zackig aussehen lässt. Es kann sein, somit den Programmcode negativ zu beeinflussen? Ich will die Startwerte verfeinern. Welchen Schritt sollte ich dann gehen?
setze doch mal die Vorschläge um und poste dann den aktuellen Code.
Zitat:
Es sollen also beide Kurven optimal an der Verlauf der Daten angepasst werden. Daher habe ich ja zwei Funktionen definiert.
Das Thema, dass das in der Form nicht geht, hatten wir eigentlich schon. Die Abhilfe auch, siehe 26.11.2017, 21:49.
Du kannst für die Darstellung am Ende ein verfeinertes f verwenden, aber nicht für das Fitten. Da muss die Anzahl der vorhergesagten und der vorhandenen Werte ja zusammenpassen.
Mit dem anpassen von OptimalityTolerance passt das ganze einigermaßen. Danke für die Hilfe.
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.