Kurven Fitting mit komplexen Werten und komplexer Funktion
Paro
Forum-Anfänger
Beiträge: 10
Anmeldedatum: 01.12.09
Wohnort: ---
Version: ---
Verfasst am : 06.12.2011, 10:52
Titel : Kurven Fitting mit komplexen Werten und komplexer Funktion
Hallo, ich habe komplexe Wert, die ich mit einer komplexen Funktion fitten möchte
Zum Beispiel:
Wie kann ich ein least-squares-Fitting ausführen, so dass ich die realen Parameter x erhalte?
Danke, Stefan
Andreas Goser
Forum-Meister
Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
Verfasst am : 06.12.2011, 11:48
Titel :
Paro
Themenstarter
Forum-Anfänger
Beiträge: 10
Anmeldedatum: 01.12.09
Wohnort: ---
Version: ---
Verfasst am : 06.12.2011, 14:51
Titel :
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.
Uwe_West
Forum-Newbie
Beiträge: 8
Anmeldedatum: 13.01.12
Wohnort: Raum Hannover
Version: ---
Verfasst am : 13.01.2012, 13:13
Titel :
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
Harald
Forum-Meister
Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
Verfasst am : 13.01.2012, 13:16
Titel :
Hallo,
was genau hast du gemacht?
warum sind diese Ergebnisse nicht zufriedenstellend?
Grüße,
Harald
Uwe_West
Forum-Newbie
Beiträge: 8
Anmeldedatum: 13.01.12
Wohnort: Raum Hannover
Version: ---
Verfasst am : 13.01.2012, 13:54
Titel :
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...
Harald
Forum-Meister
Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
Verfasst am : 13.01.2012, 15:11
Titel :
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
Uwe_West
Forum-Newbie
Beiträge: 8
Anmeldedatum: 13.01.12
Wohnort: Raum Hannover
Version: ---
Verfasst am : 13.01.2012, 15:16
Titel :
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.
Harald
Forum-Meister
Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
Verfasst am : 13.01.2012, 15:24
Titel :
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
Uwe_West
Forum-Newbie
Beiträge: 8
Anmeldedatum: 13.01.12
Wohnort: Raum Hannover
Version: ---
Verfasst am : 13.01.2012, 15:42
Titel :
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
Harald
Forum-Meister
Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
Verfasst am : 13.01.2012, 16:05
Titel :
Hallo,
hier ein etwas anderer Ansatz:
Leider scheint das ganze recht instabil zu sein, d.h. für verschiedene Startwerte gibt es verschiedene Lösungen.
Grüße,
Harald
Uwe_West
Forum-Newbie
Beiträge: 8
Anmeldedatum: 13.01.12
Wohnort: Raum Hannover
Version: ---
Verfasst am : 19.01.2012, 13:31
Titel :
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:
Wie kann ich vorgeben, dass nur reelle Parameter ermittelt werden sollen???
MfG
Uwe
Harald
Forum-Meister
Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
Verfasst am : 19.01.2012, 13:37
Titel :
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:
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
Uwe_West
Forum-Newbie
Beiträge: 8
Anmeldedatum: 13.01.12
Wohnort: Raum Hannover
Version: ---
Verfasst am : 19.01.2012, 13:45
Titel :
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
Harald
Forum-Meister
Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
Verfasst am : 19.01.2012, 13:49
Titel :
Hallo,
wenn das das einzige Problem war, nimm doch fmincon statt fminunc und gib die NB dort an!
Grüße,
Harald
Gehe zu Seite 1 , 2 Weiter
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
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| 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.