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

Kurven Fitting mit komplexen Werten und komplexer Funktion

 

Paro
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 01.12.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.12.2011, 10:52     Titel: Kurven Fitting mit komplexen Werten und komplexer Funktion
  Antworten mit Zitat      
Hallo, ich habe komplexe Wert, die ich mit einer komplexen Funktion fitten möchte

Zum Beispiel:
Code:

xdata=[1 2 3]
ydata=[3j 4 5-j]

function F = myfun(x,xdata)
F = x(1)+x(2)*xdata + j*(sin(x(3)*xdata));


Wie kann ich ein least-squares-Fitting ausführen, so dass ich die realen Parameter x erhalte?

Danke, Stefan
Private Nachricht senden Benutzer-Profile anzeigen


Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 06.12.2011, 11:48     Titel:
  Antworten mit Zitat      
Ich habe dies hier gefunden:

http://www.mathworks.com/support/so...../data/1-AE2HZW/index.html

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Paro
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 01.12.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.12.2011, 14:51     Titel:
  Antworten mit Zitat      
Hallo, danke für den Link. Das dortige Proglem ähnelt meinem, allerdings mit zwei Unterschieden:

- meine y-Daten sind komplex
- meine Funktionsparameter sind real

Ich kann also so nicht vorgehen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Uwe_West
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 13.01.12
Wohnort: Raum Hannover
Version: ---
     Beitrag Verfasst am: 13.01.2012, 13:13     Titel:
  Antworten mit Zitat      
Hallo Paro,

hast Du inzwischen herausgefunden, wie ein komplexer y-Wert bei reelen x-Werten und reelen Koeffizienten angefittet werden kann?

Nur Realteil bzw. nur Imaginärteil zu fitten bringen keine zufriedenstellende Ergebnisse...

MfG
Uwe
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.01.2012, 13:16     Titel:
  Antworten mit Zitat      
Hallo,

was genau hast du gemacht?
warum sind diese Ergebnisse nicht zufriedenstellend?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Uwe_West
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 13.01.12
Wohnort: Raum Hannover
Version: ---
     Beitrag Verfasst am: 13.01.2012, 13:54     Titel:
  Antworten mit Zitat      
Hallo Harald,

Ich habe ein Impedanzspektrum bestehend aus Impedanzwerten mit Real- und Imaginärteil. Jede einzelne komplexe Impedanz (Y-Wert) ist abhängig von einer Frequenz (x-Wert).

Beispiel-Gleichung: Y=Yre+jYim=A+B/(j*x*C)

Die gesuchten Parameter sind A,B,C. Alle reel und positiv.


Bisher habe ich die Parameter A,B,C einmal bei Yre und einmal bei Yim getrennt gefittet. Völlig unterschiedliche Ergebnisse...
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.01.2012, 15:11     Titel:
  Antworten mit Zitat      
Hallo,

es ist klar, dass du unterschiedliche Ergebnisse bekommst, wenn du beides getrennt fittest. Man müsste es schon auf einmal fitten.

In deinem speziellen Fall gibt es noch das zusätzliche Problem, dass B/C anscheinend ja durch einen Parameter ersetzt werden kann.

Desweiteren scheint es mir so zu sein, dass deine Gleichungen einfach nach Real- und Imaginärteil trennbar sind:
Yre = A
Yim = - B/C * 1/x

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Uwe_West
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 13.01.12
Wohnort: Raum Hannover
Version: ---
     Beitrag Verfasst am: 13.01.2012, 15:16     Titel:
  Antworten mit Zitat      
Ganz vergessen, im Nenner steht noch ein "1+" vor dem Term.
Meine zu fittende Gleichung sieht insgesamt folgendermaßen aus:

Y=A+B/(1+(j*x*C))+D/(1+(j*x*E))+F/(1+(j*x*G))

Das erste sollte nur ein einfaches Beispiel darstellen.
7 Variable die ermittelt werden sollen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.01.2012, 15:24     Titel:
  Antworten mit Zitat      
Hallo,

das sieht schon besser aus, auch wenn es passieren kann, dass B,C und D,E vertauscht sind.

Kannst du mal deinen bisherigen Code und vielleicht einen Beispieldatensatz posten? Zumindest, welche Funktion du verwendest?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Uwe_West
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 13.01.12
Wohnort: Raum Hannover
Version: ---
     Beitrag Verfasst am: 13.01.2012, 15:42     Titel:
  Antworten mit Zitat      
Hier meine bisherige Berechnung. Aktuell wird auf y1data, dem Realteil gefittet

Code:

xdata=([70000;44167;27867;17583;11094;7000;4416;2786;1758;1109;700;]); %x-werte
y1data=([0.356;0.380;0.409;0.436;0.458;0.475;0.489;0.505;0.524;0.545;0.570;]); %real-werte
y2data=([0.078;0.014;-0.022;-0.039;-0.045;-0.049;-0.054;-0.060;-0.068;-0.076;-0.083;]); %imag-werte
zdata=([0.356,0.078;0.380,0.014;0.409,-0.022;0.436,-0.039;0.458,-0.045;0.475,-0.049;0.489,-0.054;0.505,-0.0608;0.524,-0.068;0.545,-0.076;0.570,-0.083;]); %kompl-werte
fo_ = fitoptions('method','NonlinearLeastSquares',...
                 'robust','bisquare',...
                 'Lower',[0 0 0 0 0 0 0 ],...
                 'Startpoint',[1 1 1 1 1 1 1 ],...
                 'maxfunevals',1000,...
                 'maxiter',500);
ok_ = ~(isnan(xdata) | isnan(y1data));
ft_ = fittype('real(R_0+(R_1/(1+1i*2*pi()*x*R_1*C_1))+(R_2/(1+1i*2*pi()*x*R_2*C_2))+(R_3/(1+1i*2*pi()*x*R_3*C_3)))',...
     'dependent',{'y'},'independent',{'x'},...
     'coefficients',{'R_0', 'R_1', 'R_2', 'R_3', 'C_1', 'C_2', 'C_3'});
cf_ = fit(xdata(ok_),y1data(ok_),ft_,fo_);
cof=coeffvalues(cf_);
kon=confint(cf_);


In cof stehen dann die Koeffizienten
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.01.2012, 16:05     Titel:
  Antworten mit Zitat      
Hallo,

hier ein etwas anderer Ansatz:

Code:
xdata=([70000;44167;27867;17583;11094;7000;4416;2786;1758;1109;700;]); %x-werte
y1data=([0.356;0.380;0.409;0.436;0.458;0.475;0.489;0.505;0.524;0.545;0.570;]); %real-werte
y2data=([0.078;0.014;-0.022;-0.039;-0.045;-0.049;-0.054;-0.060;-0.068;-0.076;-0.083;]); %imag-werte
ydata = y1data + 1i*y2data;

mymodel = @(p, x) p(1) + ...
    p(2)./(1+1i*2*pi()*x*p(2)*p(3)) + ...
    p(4)./(1+1i*2*pi()*x*p(4)*p(5)) + ...
    p(6)./(1+1i*2*pi()*x*p(6)*p(7));
[p, f] = fminunc(@(p) norm(mymodel(p, xdata) - ydata), rand(1,7))


Leider scheint das ganze recht instabil zu sein, d.h. für verschiedene Startwerte gibt es verschiedene Lösungen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Uwe_West
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 13.01.12
Wohnort: Raum Hannover
Version: ---
     Beitrag Verfasst am: 19.01.2012, 13:31     Titel:
  Antworten mit Zitat      
Hey,
ich habe es nun mit der Funktion lsqnonlin hinbekommen, doch leider sind meine Parameter p(1) - p(7) bzw. R0 - C3 komplex. Ich möchte jedoch, dass nur reelle Werte/Parameter ermittelt werden sollen.

Hier der aktuelle Code:

Code:
xdata=([70000;44167;27867;17583;11094;7000;4416;2786;1758;1109;700;]); %x-werte
y1data=([0.356;0.380;0.409;0.436;0.458;0.475;0.489;0.505;0.524;0.545;0.570;]); %real-werte
y2data=([0.078;0.014;-0.022;-0.039;-0.045;-0.049;-0.054;-0.060;-0.068;-0.076;-0.083;]); %imag-werte
yzdata = y1data + 1i*y2data;
startwert=[0.391843575876274,0.855061861324134,0.217594090057046,0.180322179346739,20.9230797807399,0.0200331391767478,0.000964840198243023;]; %imag

mymodel = @(p, x) p(1) + ...
    p(2)./(1+1i*2*pi()*x*p(2)*p(5)) + ...
    p(3)./(1+1i*2*pi()*x*p(3)*p(6)) + ...
    p(4)./(1+1i*2*pi()*x*p(4)*p(7));
opt = optimset('Display','off','TolX',1e-010,'maxfunevals',2000,'maxiter',2000);
ub = [0,0,0,0,0,0,0];
lb = [inf,inf,inf,inf,inf,inf,inf];
[p,fehler] = lsqnonlin(@(p) mymodel(p, xdata) - yzdata,startwert,ub,lb,opt);
disp('Berechnung mit lsqnonlin:');
disp(['Parameter: R0=',num2str(p(1),5),', R1=',num2str(p(2),5),', R2=',num2str(p(3),5),', R3=',num2str(p(4),5),', C1=',num2str(p(5),5),', C2=',num2str(p(6),5),', C3=',num2str(p(7),5)]);
disp(['Approximationsfehler: ',num2str(fehler,5)]);


Hier die Antwort:

Code:
Berechnung mit lsqnonlin:
Parameter: R0=0.56895+0.18163i, R1=0.85506, R2=0.21659-0.070209i, R3=-0.092279-0.22709i, C1=20.923-0.00029171i, C2=0.00051781-0.0011081i, C3=-4.4433e-006+5.1351e-006i
Approximationsfehler: 1.989e-005


Wie kann ich vorgeben, dass nur reelle Parameter ermittelt werden sollen???

MfG
Uwe
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 19.01.2012, 13:37     Titel:
  Antworten mit Zitat      
Hallo,

wenn du mit komplexen Werten anfängst, kommen auch komplexe Werte raus. Du mussst also auf eine reellwertige Zielfunktion kommen.

Wenn du bei deinem Ansatz bleiben willst, würde ich folgendes Vorschlagen:
Code:
[p,fehler] = lsqnonlin(@(p) abs(mymodel(p, xdata) - yzdata),startwert,ub,lb,opt);


ABS operiert hier kompenentenweise, du nimmst also statt einer komplexwertigen Abweichung den Betrag (oder die Länge) der Abweichung. Das erscheint mir sinnvoll.

Andere Frage: Hast du meinen Vorschlag mal ausprobiert?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Uwe_West
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 13.01.12
Wohnort: Raum Hannover
Version: ---
     Beitrag Verfasst am: 19.01.2012, 13:45     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich werde das mit abs() mal versuchen.

Deinen Vorschlag habe ich ausprobiert. Leider waren viele Werte negativ. Ich möchte jedoch reelle, positve Werte herausbekommen.
Das die Werte positiv sein sollen, kann ich bei fminunc nicht vorgeben.

Ich melde mich, wenn ich neue Ergebnisse habe.

MfG Uwe
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 19.01.2012, 13:49     Titel:
  Antworten mit Zitat      
Hallo,

wenn das das einzige Problem war, nimm doch fmincon statt fminunc und gib die NB dort an!

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

Gehe zu Seite 1, 2  Weiter

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.