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

elementweises Aufrufen von vpasolve

 

Gregor1876

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.09.2019, 13:17     Titel: elementweises Aufrufen von vpasolve
  Antworten mit Zitat      
Hallo zusammen,
ich habe ein kleines Problem mit der Funktion vpasolve. Ich bekomme jedes Mal einen Fehler wenn ich versuche vpasolve elementweise aufzurufen.
Kennt hierfür jemand eine andere Funktion oder wie bekomme ich das Problem gelöst?

Kleines exemplarisches Beispiel:
Code:

syms R C
w = randn(10,1)';
s = 1i*w.;
Y = ((R)/(1+s.^1*R*C)=Z.^1, [R,C]);
result_R = Y.R
result_C = Y.C
 


Gregor1876

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.09.2019, 13:20     Titel: Re: elementweises Aufrufen von vpasolve
  Antworten mit Zitat      
Edit im Code, sorry hab vergessen die Funktion zu ergänzen
Code:

Z = 23+1i*w.*3;
Y= vpasolve((R)/(1+s.^1*R*C)==Z.^1, [R,C]);
 
 
Harald
Forum-Meister

Forum-Meister


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

du hast 2 Unbekannte und 10 Gleichungen. Soll die bestmögliche Lösung im Sinne der kleinsten Quadrate ermittelt werden oder wie? Falls ja: lsqnonlin .

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.09.2019, 13:36     Titel:
  Antworten mit Zitat      
Anschlussfrage: dürfen C und R komplexwertig sein oder müssen sie reellwertig sein?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Gregor1876

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.09.2019, 13:51     Titel: Re: Re: elementweises Aufrufen von vpasolve
  Antworten mit Zitat      
Hi Harald,
danke für die schnelle Antwort.
Wenn ich mir die Doku zu der Funktion ansehe, kann ich aber leider auch nicht die elementweise Notation
Code:

Y= vpasolve((R)/(1+s.^1*R*C)==Z.^1, [R,C]);
 

verwenden. (Hab ich auch gerade ausprobiert)

In meinem Fall habe anstatt des oben beschriebenen Problems 6 Unbekannte und 150 Gleichungen, die mithilfe eines numerischen Verfahrens die Unbekannten bestimmen sollen.
Code:

syms R1 R2 C1 C2 C3 L1
RM = 1000; %[Ohm]
w = randn(150,1)';
w = 2*pi*f.^1;
s = 1i*w.^1;
Y = vpasolve((C2*L1*RM*s.)/ ...
      ((L1*(C3*(C2*(1+RM)+C1*(R2+RM))+C2*C1*R2*RM)*s.^3+ ...
      (L1*(C2+C1)+C3*R1*((C2+C1)*(R2+RM)+C2*C1*R1*R2*RM)*s.^2 + ...
      (R1*(C2+C1)+2*C3*(R2+RM)+2*C2*R2*RM)*s.^1+2, ...
      [R1,R2,C1,C2,C3,L1])
 
 
Harald
Forum-Meister

Forum-Meister


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

bitte auf die Fragen und Vorschläge eingehen.
Zitat:
Soll die bestmögliche Lösung im Sinne der kleinsten Quadrate ermittelt werden oder wie? Falls ja: lsqnonlin

Zitat:
dürfen C und R komplexwertig sein oder müssen sie reellwertig sein?


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Gregor1876

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.09.2019, 14:03     Titel: Re: Re: Re: elementweises Aufrufen von vpasolve
  Antworten mit Zitat      
Hi Harald,
sorry hab deine zweite Nachricht nicht gesehen.

1. Vorgehen ist an sich egal.
2. Reell

Viele Grüße,
Gregor
 
Harald
Forum-Meister

Forum-Meister


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

1. mag sein, dass dir die Methode, die verwendet wird, egal ist. Es geht mir ja aber erst mal um das Problem: soll das als überbestimmtes Gleichungssystem aufgefasst werden und die Summe der Abweichungen minimiert werden (kleinste Quadrate) oder stellst du dir etwas anderes vor?
Wenn kleinste Quadrate gewollt ist, dann würde ich wie gesagt lsqnonlin empfehlen.
2. Dann musst du an lsqnonlin reellwerte Gleichungen übergeben. Du kannst entweder abs auf die Abweichungen anwenden oder Real- und Imaginärteil als separate Gleichungen auffassen. Zudem hilft es bei lsqnonlin, sinnvolle untere und obere Schranken anzugeben. Müssen R und C beispielsweise positiv sein?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Gregor1876

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.09.2019, 14:43     Titel: Re: Re: Re: Re: elementweises Aufrufen von vpasolve
  Antworten mit Zitat      
Hi Harald,
ich habe es gerade mit der Methode der kleinsten Quadrate ausprobiert
Code:

syms R1 R2 C1 C2 C3 L1
RM = 1000; %[Ohm]
w = randn(150,1)';
w = 2*pi*f.^1;
s = 1i*w.^1;
Z = 10+s.^1*13.2;
Y = lsqnonlin((C2*L1*RM*s.)/ ...
      ((L1*(C3*(C2*(1+RM)+C1*(R2+RM))+C2*C1*R2*RM)*s.^3+ ...
      (L1*(C2+C1)+C3*R1*((C2+C1)*(R2+RM)+C2*C1*R1*R2*RM)*s.^2 + ...
      (R1*(C2+C1)+2*C3*(R2+RM)+2*C2*R2*RM)*s.^1+2, ...
      == Z.^1,
      [R1,R2,C1,C2,C3,L1]);
solution_R1 = abs(Y.R1)
solution_R2 = abs(Y.R2)
solution_C1 = abs(Y.C1)
solution_C2 = abs(Y.C2)
solution_C3 = abs(Y.C3)
solution_L1 = abs(Y.L1)
 

Und funktioniert leider nicht.
Ich bekomme einen Error bei der lsqnonlin Funktion:
Argument must be of category 'Cat::Matrix'.

Meine Vermutung ist, dass ich die elementweise Notation s. nicht verwenden darf
 
Harald
Forum-Meister

Forum-Meister


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

vor allem keine symbolischen Variablen. R und C müssen zu einem Vektor zusammengefasst werden, hier x = [R, C].

Code:
Y = lsqnonlin(@(x) abs(x(1)./(1+s.^1*x(1)*x(2)) - Z.^1), [1,1])


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Gregor1876

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.09.2019, 19:31     Titel: Re:
  Antworten mit Zitat      
Vielen Dank für den Input. Leider funktioniert
Code:

syms L1 C1 C3 C2 R1 R2
x = [L1, C1, C3, C2, R1, R2];
    Y = lsqnonlin(@(x) abs((x(4)*x(6)*R_M*s.^1)./((x(1)*(x(3)*(x(4)*(1+R_M)+x(2)*(x(6)+R_M))+x(4)*x(2)*x(6)*R_M))*s.^3+ ...
        (x(1)*(x(4)+x(2))+x(3)*x(5)*((x(4)+x(2))*(x(6)+R_M))+x(4)*x(2)*x(5)*x(6)*R_M)*s.^2+ ...
        (x(5)*(x(4)+x(2))+2*x(3)*(x(6)+R_M)+2*x(4)*x(6)*R_M)*s.^1+2-Z.^1)), ...
        [1,1,1,1,1,1] )
 

immer noch nicht.
Das Ergebnis, das ich bekomme lautet Y= 1 1 1 1 1 1
 
Harald
Forum-Meister

Forum-Meister


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

die Variablen vorab als symbolisch zu definieren ist nicht sinnvoll.

Das Problem kann ich so nicht nachvollziehen. R_M kann ich ja noch raten, aber was ist beispielsweise aktuell der Wert von w? Wenn möglich, Beispiele bitte reproduzierbar halten.

Und dann bitte auch gleich sagen, was "nicht funktioniert".
Insbesondere: was ist die Statusmeldung von lsqnonlin?

lsqnonlin ist ein Gradientenverfahren und sucht ausgehend von einem Startwert nach einem lokalen Minimum. Es kann durchaus mal sein, dass der Startwert bereits ein lokales Minimum oder nah an einem solchen ist. Dann helfen oft andere Startwerte.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Gregor1876

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.09.2019, 06:41     Titel: Re:
  Antworten mit Zitat      
Hi Harald,
sorry für meine unvollständige Nachricht.
Das ist der Code aktuell:
Code:

syms R1 R2 C1 C2 C3 L1
RM = 1000; %[Ohm]
w = randn(150,1)';
Z_re = rand(150,1)';
Z_im = rand(150,1)';
w = 2*pi*f.^1;
s = 1i*w.^1;
Z = Z_re.^1+s.^1*Z_im.^1;
x = [L1, C1, C3, C2, R1, R2];
    Y = lsqnonlin(@(x) abs((x(4)*x(6)*R_M*s.^1)./((x(1)*(x(3)*(x(4)*(1+R_M)+x(2)*(x(6)+R_M))+x(4)*x(2)*x(6)*R_M))*s.^3+ ...
        (x(1)*(x(4)+x(2))+x(3)*x(5)*((x(4)+x(2))*(x(6)+R_M))+x(4)*x(2)*x(5)*x(6)*R_M)*s.^2+ ...
        (x(5)*(x(4)+x(2))+2*x(3)*(x(6)+R_M)+2*x(4)*x(6)*R_M)*s.^1+2-Z.^1)), ...
        [1e-03,1e-03,1e-03,1e-03,1,1]
 


Die Statusmeldung lautet

Initial point is a local minium.

Optimization completed because the size of the gradient at the initial point is less than the value of the optimality tolerance.

<stopping criteria details>
Y= 7.2330 -45845 -4.6093 2.3284 0.9904 1.9963


Da ich vermute, dass die C und L werte <1e-03 sind, habe ich dort jetzt als Startwerte 1e-03 gesetzt.
Da aber eine Induktivität mit 7.2H und zweimal negative Kapazitäten allein schon theoretisch nicht stimmen können, habe ich glaube ich noch irgendwo in der fsqnonlin() einen Fehler
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.09.2019, 07:50     Titel:
  Antworten mit Zitat      
Hallo,

wenn etwas theoretisch nicht stimmen kann, dann gib doch entsprechende untere und obere Grenzen als zusätzliche Argumente an.

Was ist im Code f?

Wie gesagt: das Definieren der symbolischen Variablen kannst und solltest du weglassen.

Schließlich kann es noch helfen, die Optionen bei lsqnonlin anzupassen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Gregor1876

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.09.2019, 08:26     Titel: Re:
  Antworten mit Zitat      
Hi Harald,
ich hab mich jetzt mal an deine Tipps gehalten:
Code:

RM = 1000; %[Ohm]
w = randn(150,1)';
Z_re = rand(150,1)';
Z_im = rand(150,1)';
s = 1i*w.^1;
Z = Z_re.^1+s.^1*Z_im.^1;
options = optimset('Tol1X',1e-09);
lb = [1e-06,1e-12,1e-12,1e-12,100,100];
ub = [1,1e-03,1e-03,1e-03,10000,10000]
Y = lsqnonlin(@(x) abs((x(4)*x(6)*R_M*s.^1)./((x(1)*(x(3)*(x(4)*(1+R_M)+x(2)*(x(6)+R_M))+x(4)*x(2)*x(6)*R_M))*s.^3+ ...
        (x(1)*(x(4)+x(2))+x(3)*x(5)*((x(4)+x(2))*(x(6)+R_M))+x(4)*x(2)*x(5)*x(6)*R_M)*s.^2+ ...
        (x(5)*(x(4)+x(2))+2*x(3)*(x(6)+R_M)+2*x(4)*x(6)*R_M)*s.^1+2-Z.^1)), ...
        [1e-03,1e-06,1e-06,1e-06,1000,1000], lb, ub, options);
x(1)
x(2)
x(3)
x(4)
x(5)
x(6)
 

Meine Ausgabe ist
0.0838 0.0811 0.0784 0.0758 0.0733 0.0708
Wobei das doch laut meinen definierten Grenzen nicht sein kann, oder?
 
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 - 2024 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.