Verfasst am: 25.09.2019, 13:17
Titel: elementweises Aufrufen von vpasolve
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
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 ;)
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 ;)
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])
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 ;)
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 ;)
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 ;)
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 ;)
Gregor1876
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 26.09.2019, 06:41
Titel: Re:
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]
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
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 ;)
Gregor1876
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 26.09.2019, 08:26
Titel: Re:
Hi Harald,
ich hab mich jetzt mal an deine Tipps gehalten:
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
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.