WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Ausgleichsrechnung: Curve Fitting

 

Martin_P

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.05.2015, 16:54     Titel: Ausgleichsrechnung: Curve Fitting
  Antworten mit Zitat      
Hallo Matlab-Profis,

ich hoffe ihr könnt mir weiter helfen.
Ich habe folgendes Problem:

Ich habe eine Kurve gemessen. Im Bild ist das die gelbe Kurve.
Außerdem habe ich eine Formel, die die blaue Kurve beschreibt. Das einzige was fehlt, ist zu jedem Messpunkt ein komplexer Wert, der bewirkt, dass die Kurven gleich aussehen. Dies möchte ich über eine Ausgleichsrechnung realisieren.

Ich habe also:

- Vektor startvektor, der helfen soll, den nächsten Wert möglichst schnell zu finden
- Vektor VE_ges, der der blauen Kurve entspricht
- Vektor x_n, der eine komplexe Zahl zu jedem Messpunkt enthält
- Vektor f, der die X-Werte enthält
- Vektor Gemessene_Werte, der alle Messwerte enthält
Code:


startvektor(1:size(E_ges)) = 1.7 - 1i*0.001;

for k=1:1:size(E_ges)-1
fun = @(n_schlange)((( E0(k) * exp(-1i * omega(k)  * A) / (1 + n_schlange) )  * ( 1 - n_schlange -  C)));

x_n(k) = lsqcurvefit(fun, startvektor(k), f, Gemessene_Werte(k));


n_schlange = x_n(k);

VE_ges(k) = ( E0(k) * exp(-1i * omega(k)  * A) / (1 + n_schlange) )  * ( 1 - n_schlange -  C);
end

 


Als Fehlermeldung erhalte ich:

Code:

>> Error using @(n_schlange)(((E0(k)*exp(-1i*omega(k)*A)/(1+n_schlange))*(1-n_schlange-C)))
Too many input arguments.
 



Ich glaube die Fehlermeldung ist nichtmal das Problem. Ich bin mir nicht sicher, ob ich nicht grundsätzlich einen Fehler gemacht habe.


Ich bin gespannt auf Euer Feedback.

Viele Grüße,
Martin

untitled.jpg
 Beschreibung:
Gelbe Kurve ist die gemessene - Blue Kurve ist die berechnete Kurve

Download
 Dateiname:  untitled.jpg
 Dateigröße:  30.13 KB
 Heruntergeladen:  439 mal


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.05.2015, 17:14     Titel:
  Antworten mit Zitat      
Hallo,

willst du wirklich zu jedem Messwert einen passenden Parameter finden?
Üblicherweise sucht man einen oder wenige Parameter, die für alle Messwerte möglichst gut passen.

Zur Fehlermeldung an sich: lsqcurvefit will die Funktion mit zwei Eingabeargumenten aufrufen, Parametervektor und x-Vektor. Deine Funktion nimmt nur ein Eingabeargument an.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Martin_P

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.05.2015, 00:21     Titel: Jo
  Antworten mit Zitat      
Hi,

ja, ich will tatsächlich zu jedem Messwert einen passenden Parameter finden Smile
Ich weiß das ist ungewöhnlich, aber es ist tatsächlich so.

Okay, ich probiere es morgen mal aus, das zu korrigieren.

Geht das denn überhaupt so mit der Funktion, dass ich zu jedem Mess-Wert einen passenden Parameter x_n(k) über diese Funktion finden kann?
Also auch, wenn der Parameter komplex ist?

Gruß Martin
 
Martin_P

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.05.2015, 08:54     Titel: Problem
  Antworten mit Zitat      
Also ich habe es jetzt verändert und zumindest gibt es keine Fehlermeldung mehr. Aber die Resultate sind leider nicht so, wie ich sie gerne hätte. Vor allem sieht die berechnete Kurve gar nicht so aus, wie die gemessene Kurve. Laughing

Das Bild befindet sich im Anhang.
Im übrigen ist die berechnete Kurve natürlich komplex, wird aber mit abs() nur betragsmäßig angezeigt. Aber das muss auch so sein.

Code:


%Speicher allozieren
startvektor(1:size(E_ges)) = 1.7 - 1i*0.001;

for k=1:1:size(E_ges)-1
fun = @(n_schlange,k)((( E0(k) * exp(-1i * omega(k)  * A) / (1 + n_schlange) )  * ( 1 - n_schlange -  C)));

x_n(k) = lsqcurvefit(fun, startvektor(k),k, Gemessene_Werte(k));

    if abs(x_n(k)) < 1.5
        startvektor(k+1) = x_n(k);
    else
        startvektor(k+1) = 1.6 -0.001*1i;
    end

   n_schlange = startvektor(k+1);
   VE_ges(k) = ( E0(k) * exp(-1i * omega(k)  * A) / (1 + n_schlange) )  * ( 1 - n_schlange -  C);

end

 


Ich kenne auch die ungefähren oberen und unteren Grenzen von x_n(k). Aber die sind ja komplex, deswegen kann ich glaube ich nicht die Funktion für lsqcurvefit verwenden, also "Vector of lower bounds" und "Vector of upper bounds".

Gruß,
Martin

untitled.jpg
 Beschreibung:
Gelbe Kurve ist die gemessene Kurve und blaue Kurve ist die berechnete Kurve.

Download
 Dateiname:  untitled.jpg
 Dateigröße:  40.57 KB
 Heruntergeladen:  484 mal
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 31.05.2015, 17:33     Titel:
  Antworten mit Zitat      
Hallo,

wenn es wirklich das ist, was du möchtest, dann ist lsqcurvefit nicht wirklich geeignet. Dann sieht das eher nach solve / fsolve aus.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Martin_P

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.05.2015, 18:25     Titel: Sicher?
  Antworten mit Zitat      
Also das Problem ist, dass ich ja quasi zwei Variablen habe.

n_schlange besteht ja aus einem Real- und einem Imaginärteil. Von daher weiß ich gar nicht, ob solve eine Gleichung mit zwei Unbekannten lösen kann.

Aber ich probiere es mal aus. Danke für den Tipp.

Gruß
Martin
 
Martin_P

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.05.2015, 19:22     Titel: Funktioniert nicht
  Antworten mit Zitat      
Das liefert leider keine Ergebnisse. Zunächst rechnet der PC minutenlang und dann ist der ganze Vektor x_n nur mit Nullen befüllt. Der solve-Befehl kann die Gleichung offenbar nicht lösen. Warum das nicht geht, weiß ich leider nicht.


Code:

syms n_schlange;
   
   
% Jedes Element einzeln berechnen
for k=1:1:size(E_ges)-1

    fun = (((abs( E0(k) * exp(-1i * omega(k)  * A) / (1 + n_schlange) )  * ( 1 - n_schlange -  C) - H_i_Mess(k)) <= 5));

x_n(k) = solve(fun, n_schlange, 1.6 - 0.001*i);
end

 
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 31.05.2015, 19:30     Titel:
  Antworten mit Zitat      
Hallo,

welche Syntax von solve versuchst du denn zu verwenden? Ich sehe auf Anhieb nicht, zu welcher dokumentieren Syntax das passen soll.
Vor allem aber: warum gibst du eine Ungleichung an, wenn du möchtest, dass etwas möglichst gleich sein soll?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Martin_P

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.05.2015, 19:50     Titel: funktioniert nicht
  Antworten mit Zitat      
Ich gebe eine Ungleichung an, weil ich davon ausgehe, dass die leichter zu lösen ist. Ich denke ein exaktes Ergebnis wird es ja eh nicht geben. Eine leichte Abweichung von der gemessenen Kurve ist ja in Ordnung.

Syntax?
Also ich habe es so gemacht wie es in doc solve steht.
Matlab gibt ja auch keine Fehlermeldung aus.
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 31.05.2015, 20:17     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Ich gebe eine Ungleichung an, weil ich davon ausgehe, dass die leichter zu lösen ist.

Das ist ein Irrtum. solve versucht ja wenn, *alle* Lösungen zu finden.

Zitat:
Ich denke ein exaktes Ergebnis wird es ja eh nicht geben.

Bei solve gibt es entweder eine exakte Lösung oder gar keine.

Zitat:
Eine leichte Abweichung von der gemessenen Kurve ist ja in Ordnung.

Dann solltest du fsolve verwenden, nicht solve.

Zitat:
Syntax? Also ich habe es so gemacht wie es in doc solve steht.

Wo steht in der Doku von solve, dass es sinnvoll ist, als drittes Argument eine Zahl zu übergeben?

Zitat:
Matlab gibt ja auch keine Fehlermeldung aus.

Dass der Code fehlerfrei durchläuft, heißt noch lange nicht, dass er das macht, was der Nutzer beabsichtigt. Aber dass die Ergebnisse nicht sinnvoll sind, hast du ja auch schon gemerkt.

Leider ist es schwierig die Problematik nachzuvollziehen, wenn man keine Beispieldaten hat.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.