ich suche nach einem geeigneten solver in matlab, um eine diskrete impedanzkurve mit einer impedanzfunktion zu approximieren und deren parameter zu bestimmen. dabei bin ich auf "lsqcurvefit" gestossen, jedoch bin ich mir nicht sicher, ob ich den solver richtig anwende bzw. ob der überhaupt für solche funktionen zulässig ist, da mir keine richtigen ergebnisse rauskommen. allein an den startwerten kann es nicht liegen, da es selbst bei genauen angaben nicht konvergiert.. zuerst eine kurve, die genau durch die selbe funktion geplottet wurde. in weiterer folge wäre eine kurve mit streuverhalten angebracht, um die least square methode zu testen. hat mir jemand tipps? hier der matlab code: clc clear all close all R = 0.5; C = 2e-11; L = 5e-07; optimoptions(@lsqcurvefit,'TolFun',1e-8,'MaxFunEvals', 1000, 'MaxIter', 1000, 'TolX', 1e-8); fr = logspace(1,9,200); w = 2*pi.*fr; s = j*w; Z = (R+s.*L)./(s.*R*C+(s.^2).*L.*C+1); %x(1) = R; x(2) = L; x(3) = C figure(1) subplot(2,1,1) loglog(fr,abs(Z)) hold subplot(2,1,2) semilogx(fr, angle(Z)*180/pi) hold X = fr; Y = abs(Z); F = @(x,X)(x(1)+j.*X.*x(2))./(j.*X.*x(1)*x(3)+(j.*X.^2).*x(2)*x(3)+1); x0 = [1 0.0001 0.001]; [x,resnorm] = lsqcurvefit(F,x0,X,Y) R = real(x(1)) L = real(x(2)) C = real(x(3)) Z = (R+s.*L)./(s.*R*C+(s.^2).*L.*C+1); figure(1) subplot(2,1,1) loglog(fr,abs(Z),'.r') subplot(2,1,2) semilogx(fr, angle(Z)*180/pi,'.r')
Ein weites Feld. Ich habe mal meinen Code angehängt, der nutzt fminsearch. Das geht mit Deinem Z erstma so lala, er macht schon was. Punkte: - Z ist sehr spitz (ungedämpft), das mögen die nichtlinearen Fitter nicht so - Du hast ja eigentlich nur zwei Parameter, Resonanzfrequenz und Dämpfung, es ist beser, das Problem in diesen beiden Parametern zu formulieren - Die gesuchten Parameter dürfen sich nicht in Größenordnungen untescheiden, immer schön in der Nähe von 1 bleiben, ich habe C und L entsprechend normiert - lsqcurvefit kenne ich nicht, mache das seit jeher mit fminsearch, das ist frickelig, kann aber gehen ;-) - Function-handle verstehe ich nicht, bin ich zu blöd, die Paramter bei Deinem Function-handle Aufruf waren auch buggy, das muss wahrscheinlich lsqcurvefit(F,x0,s,Z) heißen. Ich mache das immer mit ner separaten Function, fun1, fummelig aber geht, siehe Code. Nichtlinearen Fit habe ich nur als schwierig kennengelernt, kann man Woche um Woche fummeln ohne was zu erreichen, gerade wenn man mehr als drei Parameter hat. Cheers Detlef clc clear all close all R = 0.5; C = 2e-11; L = 5e-07; %optimoptions(@lsqcurvefit,... % 'TolFun',1e-8,'MaxFunEvals', 1000, 'MaxIter', 1000, 'TolX', 1e-8); fr = logspace(1,9,200); w = 2*pi.*fr; s = j*w; Z = (R+s.*L)./(s.*R*C+(s.^2).*L.*C+1); %x(1) = R; x(2) = L; x(3) = C save z.mat s Z figure(1) subplot(2,1,1) loglog(fr,abs(Z)) hold subplot(2,1,2) semilogx(fr, angle(Z)*180/pi) hold X = fr; Y = abs(Z); F = @(x,X)(x(1)+j.*X.*x(2))./(j.*X.*x(1)*x(3)+(j.*X.^2).*x(2)*x(3)+1); x0 = [ 1 2.5 5]; %[x,resnorm] = lsqcurvefit(F,x0,s,Z) ee=fminsearch('fun1',x0) return function [erg]= fun1(x); C=x(2)*1e-11; L =x(3)*1e-07; R= x(1); load z.mat; ZZ = (R+s.*L)./(s.*R*C+(s.^2).*L.*C+1); erg=sum(abs(Z-ZZ)); return
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.