2017-03-20 12 views
1

Ich habe ein System von zwei Fragen mit zwei unbekannten Variablen, die ich versuchen, Matlab lösen() -Funktion zu lösen, aber Fehler, die fast sicher an meinem Ende sind. Ich versuche zu lösen The following two equations, wobei r, Lambda und X Konstanten sind. Um dies zu tun, ich habe versucht, die folgenden auszuführen:Verwenden von Matlab Solve() mit symbolischen Konstanten

clear all; 
syms VA VB r X L; 
assumeAlso(VB <= VA); 
assumeAlso(0 <= VB); 
assumeAlso(0 < r <= 1); 
assumeAlso(0 < L); 
assumeAlso(0 < X); 
assumeAlso(VA, 'real'); 
assumeAlso(VB, 'real'); 
assumeAlso(r, 'real'); 
assumeAlso(L, 'real'); 
assumeAlso(X, 'real'); 


eqns = [VA == ((r*VA + L*(VA-VB))^2)/(2*X*(r+2*L)) + (L*(VA+VB)*(r*VA+L*(VA-VB)))/(X*(r+2*L)) + ... 
(((r^2/L+r)*VA + r*VB)^2 - (r*VA+L*(VA-VB))^2)/(2*X*(r+L)) + ... 
(L*VB*((r+L)*VB - L*VA + r^2/L*VA))/(X*(r+L)) + ... 
(X/(2*r)) - (((r^2/L+r)*VA+r*VB)^2)/(2*X*r) - VA*(1-1/X*((r^2/L+r)*VA+r*VB)), ... 
... 
VB == (L^2*VA^2 - L^2*VB^2 + r*VA*(L*VA+L*VB))/(X*(r+2*L)) + ... 
(L*VA*(r^2/L*VA + r*VB - L*(VA-VB)))/(X*(r+L)) + ... 
(VA*(X-((r^2/L+r)*VA + r*VB)))/X]; 

S = solve(eqns,[VA VB]) 

Mein Ziel ist es zu lösen für VA und VB in Bezug auf r, X und L, die wie scheint, sollte es möglich sein. Wenn ich Werte für r, L und X ausfülle, kann ich leicht eine Lösung finden.

Wenn ich diesen Code ausführen, jedoch bekomme ich die Meldung:

Warning: Explicit solution could not be found. 

, die normalerweise würde ich interpretieren, dass in der Tat gibt es keine Lösung, aber wenn ich laufe

S = solve(eqns) 

Ich bekomme nicht die gleiche Ausgabe, aber:

(solvelib::cartesianPower(R_, 2) minus solvelib::VectorImageSet(matrix([[z], [0]]), z, C_)) intersect solvelib::VectorImageSet(matrix([[-(VA^4*x^5 - 2*L^5*VA*VB^3 - 2*L^5*VA^3*VB - L*VA^4*x^4 - 3*L^4*VA^4*x + L^4*VB^4*x + 4*L^5*VA^2*VB^2 - 5*L^2*VA^4*x^3 + 4*L^3*VA^4*x^2 + L^3*VB^4*x^2 + 4*L^2*VA^2*VB^2*x^3 - 5*L^3*VA^2*VB^2*x^2 + 4*L*VA^3*VB*x^4 + L^4*VA*VB^3*x + 9*L^4*VA^3*VB*x + L*VA^2*VB^2*x^4 + 2*L^2*VA*VB^3*x^3 + 2*L^3*VA*VB^3*x^2 - 8*L^3*VA^3*VB*x^2 - 8*L^4*VA^2*VB^2*x)/(L^4*VA^3 - L^4*VB^3 - L^4*VA*VB^2 + L^4*VA^2*VB)], [x]]), x, R_ intersect RootOf(z^6 + (z^5*(L*VA^4 + L*VA^2*VB^2 + 4*L*VA^3*VB))/VA^4 + (z^4*(- 7*L^2*VA^4 + 2*L^2*VA*VB^3 + 8*L^2*VA^3*VB + 6*L^2*VA^2*VB^2))/VA^4 + (z^3*(- 5*L^3*VA^4 + L^3*VB^4 + 6*L^3*VA*VB^3 - 6*L^3*VA^3*VB + 4*L^3*VA^2*VB^2))/VA^4 + (z^2*(7*L^4*VA^4 + 3*L^4*VB^4 + 6*L^4*VA*VB^3 - 2*L^4*VA^3*VB - 14*L^4*VA^2*VB^2))/VA^4 - (z*(6*L^5*VA^4 - 2*L^5*VB^4 - 16*L^5*VA^3*VB + 12*L^5*VA^2*VB^2))/VA^4 + (L^6*VA^4 + L^6*VB^4 - 4*L^6*VA*VB^3 - 4*L^6*VA^3*VB + 6*L^6*VA^2*VB^2)/VA^4, z)) intersect solvelib::VectorImageSet(matrix([[x], [y]]), [x, y], [Dom::Interval(0, Inf), Dom::Interval(0, [1])]) 

, die keine Lösung für VA und VB hat.

Hat jemand eine Idee, wie ich Matlab lösen() für [VA VB] in Bezug auf r, L und X lösen kann?

Vielen Dank!

Antwort

0

Verwenden Sie die ReturnConditions Flag des Befehls solve. Wie in,

S = solve(eqns,[VA,VB],'ReturnConditions',true) 

Dies wird eine Struktur zurückgeben, die ein Array von Lösungen und erforderlichen Bedingungen für jeden enthält.

Ich spielte ein bisschen mit Ihrem Beispiel und traf die gleichen Straßensperren wie Sie, wenn Sie das gleiche machen assumptions. Wenn wir von Null-Annahmen ausgehen, wird solve eine Reihe von Lösungen für die gegebenen Gleichungen finden. Sie können die Bedingungen für jede der angegebenen Lösungen überprüfen und sehen, ob die ursprünglichen Einschränkungen erfüllt sind.

Das oben angegebene Beispiel liefert Ergebnisse, solange VA und VB nicht auf die Reals beschränkt sind. Könnte es irgendwo in deinem System einen Tippfehler geben?

+0

Ich sehe was du sagst. Das Ausführen des Codes unter Ausschluss der Annahmen, dass "VB <= VA" und "0 <= VB" immer noch für eine gefundene Lösung zulassen. Einige davon müssen ein mathematisches Problem und kein Coding-Problem sein. Vielen Dank! – Ryan

Verwandte Themen