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

RC Bestimmung mit LSQNONLIN?

 

Andband
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.05.2010, 15:04     Titel: RC Bestimmung mit LSQNONLIN?
  Antworten mit Zitat      
Hallo Leute,

ich habe schon lange nichts mehr mit Matlab gemacht und ich war auch damals definitiv kein fortgeschrittener Anwender.

Jetzt habe ich mal wieder ein Problem wo ich dachte, dass Matlab mit Sicherheit helfen kann, nur ist wie immer das Problem die Umsetzung... Smile

Es geht um folgendes:
Mit Hilfe von Impedanzspektroskopie werden Impedanzbetrag und Phase eines Systems im Frequenzbereich von 10Hz-10 MHz aufgezeichnet.

Jetzt wüde man gerne ein Ersatzschaltbild für das System finden. Dazu muss man natürlich irgendein Modell annehmen. Sagen wir im einfachsten Fall ein RC Glied...

R und C sind also die zu bestimmenden Parameter. Jetzt dachte ich, wenn ich mit LSQNONLIN an die Sache rangehe, dann müsste das theoretisch doch zielführend sein.

Ich hab es also ausprobiert:
Ich simuliere ein paar Messdaten (Impedanzbetrag und Phase) durch mathematisch exakt berechnete Daten.
Diese gebe ich zusätzlich mit der Frequenz omega an LSQNONLIN mit irgendeinem Startwert für R und C.
Nachdem die C-Werte immer recht klein ausfallen habe ich das Abbruchktriterium mal recht klein gemacht (bzw. TolX und TolFun weil ich nicht so recht verstehe, was der Unterschied ist)

LSQNONLIN liefert allerdings totalen Quatsch für mein R und mein C zurück. Ich erwarte ja, dass R und C herauskommen die ich zum simulieren der Daten verwendet habe.
Ich nehme an, ich habe es verbockt.
Könnte sich das ganze jemand mal kurz anschauen?

Die verwendete Mathematik dahinter ist primitiv:
Betrag Z= Wurzel aus R^2 + 1/ (wC)^2
phi = arcustangens von ( -1/wRC )

Das wars...

istart.m
 Beschreibung:
Das ist das Haupt .m-file und ruft ifunction.m auf

Download
 Dateiname:  istart.m
 Dateigröße:  399 Bytes
 Heruntergeladen:  520 mal
ifunction.m
 Beschreibung:

Download
 Dateiname:  ifunction.m
 Dateigröße:  464 Bytes
 Heruntergeladen:  496 mal
Private Nachricht senden Benutzer-Profile anzeigen


Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.05.2010, 15:56     Titel:
  Antworten mit Zitat      
lass mal die Summe in der funktion ifunction weg. Lsqnonlin summiert selbst, d.h. du musst den Vektor

v = Simulationsergebnis(Parameter) - Daten

zurückgeben
Private Nachricht senden Benutzer-Profile anzeigen
 
Andband
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.05.2010, 18:02     Titel:
  Antworten mit Zitat      
Hi Thomas,
du hast Recht, das stimmt, danke an der Stelle.
Nur leider ändert das das Ergebnis letztendlich dadurch überhaupt nicht. Ob ich einen Vektor summiere und dann lsqnonlin die Summe über diesem "Skalar" bildet oder ob Matlab über den Vektor selber summiert ist in sich ja gleich.

Vom meinem Gefühl her ist die ganze Sache ein einfaches Problem. Oder ist da irgendein mathematischer Kniff dahinter, dass es dann doch schwierig für Matlab wird, die Lösung zu finden...das wäre traurig :/.
Hoffentlich ist das Probem nur meine Herangehensweise.

Kann mir da jemand weiterhelfen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.05.2010, 07:08     Titel:
  Antworten mit Zitat      
hast du es denn ausprobiert? lsqnonlin summiert nicht direkt sondern verwendet die Trust-region Methode (http://www.mathworks.com/access/helpdesk/help/toolbox/optim/ug/brnoybu.html#broz0i4).
Kannst auch fminunc oder fminsearch verwenden, dann musst du deine Gütekriterium nicht abändern.
Private Nachricht senden Benutzer-Profile anzeigen
 
Andband
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.05.2010, 09:43     Titel:
  Antworten mit Zitat      
Hi Thomas,
jo ich hatte es natürlich ausprobiert. Dauert ja nur 1 sek das "sum" wegzumachen.
Meine Aussage war nur ein Erklärungsversuch warum es sich nicht ändert.

Fminsearch habe ich auch mal getestet. Da kommt für R 0 raus und für C ein unrealistisch hoher Wert (e15)

Es muss doch wenigstens einen Grund haben warum es nicht geht. Was könnte der sein?
Private Nachricht senden Benutzer-Profile anzeigen
 
Andband
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.05.2010, 14:54     Titel:
  Antworten mit Zitat      
Soll ich genauer erklären was ich machen möchte?

edit:
Ich habe jetzt mal probiert in meiner Funktion die an LSQNONLIN gegeben wird nicht Z und phi als Summe zu optimieren, sondern 2 Gleichungen optimieren zu lassen, weil Matlab immer sagt:
"Warning: Large-scale method requires at least as many equations as variables; using blabla instead".

Das schaut so aus:
Code:
function [Z phi]=ifunction(parameter)
global A;

omega=A(:,1);
impedance=A(:,2);
phase=A(:,3);

% hier formel für Impedanz und Phase von RCL Modell angeben.
% In diesem Fall RC Kreis:
%Parameter 1 ist R, Parameter 2 ist C

impedance_calc=sqrt(parameter(1).^2+1.0./(omega.^2.*parameter(2).^2));
phase_calc=atan(-1.0./omega.*parameter(1).*parameter(2));
Z=impedance_calc-impedance;
phi=phase_calc-phase;

 

Matlab bringt aber nachwievor die Warnung. Dabei habe ich doch jetzt 2 Gleichungen (Z und phi) und 2 Variablen (parameter(1) und parameter(2)). Ich versteh nicht so ganz was Matlab meint, bzw. was ich machen muss damit es passt.

Es kommt jedenfalls immer noch nichts brauchbares heraus Sad

Bitte helfen Very Happy
Private Nachricht senden Benutzer-Profile anzeigen
 
Andband
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.05.2010, 15:52     Titel:
  Antworten mit Zitat      
keiner ne Idee?
Habe ich mich zu blöd ausgedrückt? Versteht ihr was ich machen will?
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.05.2010, 06:49     Titel:
  Antworten mit Zitat      
Der Fehler lag in der Konstruktion von A. Du hast vergessen zu transponieren. Das Fehlerkriterium musst du vielleicht noch ein wenig abändern, da -C den gleichen Fehler liefert wie +C.

viele Grüße
Thomas


Code:

clc;
clear;
global A;

omega=logspace(0,4,20);
R=90;
C=1e-7;
Z=sqrt(R.^2+1./(omega.^2.*C.^2));
phi=atan(-1./omega.*R.*C);

A=[omega', Z', phi'];  %simulierte Messwerte (exakte Werte)

%Parameter 1 ist R, Parameter 2 ist C
startvektor=[90.0 1e-4];        


 p =fminsearch('ifunction',startvektor);  
 
display(['R: ',num2str(p(1))]);
display(['C: ',num2str(p(2))]);

Z_sim =sqrt(p(1).^2+1.0./(omega.^2.*p(2).^2));
phi_sim =atan(-1.0./omega.*p(1).*p(2));


figure('name','Vergleich');
plot(Z.*cos(phi),Z.*sin(phi),'+');
hold on;
plot(Z_sim.*cos(phi_sim),Z_sim.*sin(phi_sim),'r+');
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Andband
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 10.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.05.2010, 00:03     Titel:
  Antworten mit Zitat      
Hehe cool, da hab ich echt nicht drauf geachtet. Vielen Dank Thomas!! Ich hab leider keinen Plan wie ich das Fehlerkriterium verbessern kann - das Ergebnis selbst liefert mir ja auch die negative Kapazität. Aber egal, ich kann das Vorzeichen einfach um drehen Wink
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.