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

Symbolische Gleichung lösen

 

Felofex
Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 17.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.12.2012, 12:05     Titel: Symbolische Gleichung lösen
  Antworten mit Zitat      
Hallo,
ich bin komplett neu in Matlab und versuche folgende Gleichung nach S zu lösen:

S=-(a-c_0)*(-\frac{a}{2}*\frac{c_1+c_2}{c_1*c_2}+\frac{\sqrt{D}*c_2+\sqrt{E}*c_1}{c_1*c_2})+K

,wobei
D=\gamma*c_1*(y-S)+(a^2)/4

und

E=(1-\gamma)*c_2*(y-S)+(a^2)/4.

Alle Werte sind symbolisch definiert und ich habe in Matlab die Gleichung ohne Kürzel für D und E eingegeben:

Zitat:
g1='S=(a-c_0)*(-(a/2)*(c_1+c_2)/(c_1*c_2)+((gamma*c_1*(y-S)+(a^2)/4)^(1/2)*c_2+((1-gamma)*c_2*(y-S)+(a^2)/4)^(1/2)*c_1)/(c_1*c_2))+K'


und erhalte dann die Ausgabe

Zitat:
S=(a-c_0)*(-(a/2)*(c_1+c_2)/(c_1*c_2)+((gamma*c_1*(y-S)+(a^2)/4)^(1/2)*c_2+((1-gamma)*c_2*(y-S)+(a^2)/4)^(1/2)*c_1)/(c_1*c_2))+K


Wenn ich nun aber
[S]=solve(g1) eingebe,
dann erhalte ich folgende Warnung:

Zitat:
Warning: Explicit solution could not be found.
> In solve at 81

S =

[ empty sym ]


Andere Versuche, das darzustellen, brachten das gleiche Ergebnis. Was mache ich falsch?

Vielen Dank für Eure Hilfe!

Felofex
Private Nachricht senden Benutzer-Profile anzeigen


MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 18.12.2012, 09:25     Titel:
  Antworten mit Zitat      
Hallo,

du solltest noch angeben, wonach du auflösen willst. Es gibt hier übrigens eine explizite Lösung.

Grüße, Marc
Private Nachricht senden Benutzer-Profile anzeigen
 
Felofex
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 17.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.12.2012, 10:02     Titel:
  Antworten mit Zitat      
Ich möchte das Ganze nach S auflösen.

Wenn ich das richtig sehe, dann lag mein Fehler darin,
dass ich [Lösung]=solve(g1,'S') hätte angeben müssen, oder?

Kann ich im Kästchen [Lösung] gleichzeitig die aufzulösende Variable angeben, oder muss das eine neue Variable sein?

Vielen Dank für die Antwort!
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 18.12.2012, 10:18     Titel:
  Antworten mit Zitat      
Genau, du musst solve zusätzlich die Variable übergeben, nach der aufgelöst werden soll.
Private Nachricht senden Benutzer-Profile anzeigen
 
Felofex
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 17.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.12.2012, 12:33     Titel:
  Antworten mit Zitat      
Alles klar, vielen Dank!

Nun habe ich aber das nächste Problem - ich habe all diese Gleichungen, aber hier erhalte trotzdem noch den Fehler 81.

Die erste Gleichung (g3) wird noch gelöst, ich erhalte zwei Lösungen. Wenn ich aber nun versuche, die ersten Lösung einzusezten und dann also die g2-Gleichungen lösen will, dann erhalte ich "empty sym". Das passiert auch, wenn ich die Gleichungen symbolisch löse, ohne den Wert von a einzusetzen und auch, wenn ich versuche, die Gleichungen einzeln 0 zu setzen.

Möglicherweise haben die g1- bzw. g2-Gleichungen gar keine Lösungen, aber das kann ich mir nur schwer vorstellen...

Vielen Dank für Eure Hilfe!

Code:

%Grundlagen legen
syms c_0 c_1 c_2 gamma S a y K D E H

c_1 = .057;
c_2 = .124;
c_0 = .01;
gamma = .5;
K = 10.000;
y = 200;

D=(gamma*c_1*(y-S)+(a^2)/4)

E=((1-gamma)*c_2*(y-S)+(a^2)/4)

Wurzel_D=D^(0.5)

Wurzel_E=E^(0.5)

H=4*c_1*c_2*Wurzel_D*Wurzel_E

%Ableitung der Lagrange-Funktion nach lambda%

g3='-(a-c_0)*(-(a/2)*(c_1+c_2)/(c_1*c_2)+(Wurzel_D*c_2+Wurzel_E*c_1)/(c_1*c_2))+K-S'

%Ableitung der Lagrange-Funktion nach a, umgeformt%

g1_links='((a-2*c_0)*a*(c_2*Wurzel_E+c_1*Wurzel_D)/(2*H)-(a-c_0)*0.5*(c_1+c_2)/(c_1*c_2)-gamma/(2*Wurzel_D)-(1-gamma)/(2*Wurzel_E))*H/(2*Wurzel_D*Wurzel_E*(-2*(c_2*Wurzel_D+c_1*Wurzel_E)+(2*a-c_0)*(c_1+c_2))-(a-c_0)*a*(c_2*Wurzel_E+c_2*Wurzel_D))'

%Ableitung der Lagrange-Funktion nach S, umgeformt%

g1_rechts='((2*c_0-a)/(4*Wurzel_D*Wurzel_E)*((1-gamma)*Wurzel_D+gamma*Wurzel_E)+0.5-(gamma^2*c_1)/((2*Wurzel_D-a)*Wurzel_D)-(((1-gamma)^2)*c_2)/((2*Wurzel_E-a)*Wurzel_E))*(2*Wurzel_D*Wurzel_E)/((a-c_0)*((1-gamma)*Wurzel_D+gamma*Wurzel_E)-2*Wurzel_D*Wurzel_E)'

%Ableitung [3] Nach a(S) auflösen%

[a_von_S] = solve(g3, 'a')

%Symbol von a durch Lösung von a(S) ersetzen%
a_von_S_1=a_von_S(1,1)
a_von_S_2=a_von_S(2,1)

a=a_von_S_1
 
%In die beiden anderen Gleichungen einsetzen%
 
g2_links=eval(g1_links)
g2_rechts=eval(g1_rechts)

%Gleichungen jeweils gleich 0 setzen und nach S auflösen, ergibt ein optimales S in Abhängigkeit der eingegebenen Parameter%

solve('g2_links=g2_rechts','S')
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.12.2012, 19:39     Titel:
  Antworten mit Zitat      
Hallo,

die Gleichungen sind ziemlich komplex. Da verwundert es mich nicht, wenn es keine explizite Lösung gibt. Und selbst wenn es eine gibt, wird der Lösungsausdruck sehr länglich sein. Ich würde es daher mit einer numerischen Lösung versuchen, über fsolve. Dazu musst du allerdings für die anderen Parameter Werte einsetzen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Felofex
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 17.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.12.2012, 11:20     Titel:
  Antworten mit Zitat      
Hallo Harald,
was meinst du mit "für die anderen Parameter Werte einsetzen"? Jeweils das a und das S bestimmen?
Bis auf a und S (meine zu bestimmenden Werte) sind ja schon alle definiert.

Ich habe inzwischen auch versucht, das ganze anders zu lösen, nämlich mit fminsearch der ursprünglichen Gleichung. Dazu habe ich folgendes definiert:
Code:


function[W]=neg_Wohlstand(a)

%Grundlagen legen
syms c_0 c_1 c_2 gamma S a y K D E H q_1 q_2 p_1 p_2

c_1 = .057;
c_2 = .124;
c_0 = .01;
gamma = .5;
K = 10.000;
y = 200;
%S=100;

D=(gamma*c_1*(y-S)+(a^2)/4)

E=((1-gamma)*c_2*(y-S)+(a^2)/4)

Wurzel_D=D^(0.5)

Wurzel_E=E^(0.5)

H=4*c_1*c_2*Wurzel_D*Wurzel_E

q_1=(2*Wurzel_D-a)/(2*c_1)
q_2=(2*Wurzel_E-a)/(2*c_2)
p_1=(2*Wurzel_D+a)/(2)
p_2=(2*Wurzel_E+a)/(2)

U=gamma*log(q_1)+(1-gamma)*log(q_2)

Pi_1=p_1*q_1+p_2*q_2-c_1*((q_1)^2)/2-c_2*((q_2)^2)/2-a*(q_1+q_2)

Pi_0=(a-c_0)*(q_1+q_2)-K+S

U=eval(U)
Pi_1=eval(Pi_1)
Pi_0=eval(Pi_0)

W=-(U+Pi_1+Pi_0)


und dann

Code:
fminsearch(@neg_Wohlstand,[0,0])
eingegeben.

Allerdings erhalte ich dann immer den Fehler
Code:

??? Error using ==> fcnchk at 108
If FUN is a MATLAB object, it must have an feval method.

Error in ==> fminsearch at 178
funfcn = fcnchk(funfcn,length(varargin));.
 

Und ich verstehe leider überhaupt nicht, was er mir sagen will?

Vielen Dank für Deine/Eure Hilfe!
Felofex
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.12.2012, 11:37     Titel:
  Antworten mit Zitat      
Hallo,

wie es zu dem Fehler kommt, kann ich mir auch nicht erklären.
Ist die Funktion unter dem Namen neg_Wohlstand.m im momentanen Verzeichnis oder auf dem Suchpfad gespeichert?

Das syms ist unnötig, wenn du die Werte nachher überschreibst, und irritiert dann nur.

Du musst deine Funktion so umschreiben, dass sie einen Vektor mit zwei Komponenten als Eingabeargument annimmt. Daraus musst du dann a und S extrahieren. Man sollte versuchen, möglichst gute Startwerte anzugeben.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Felofex
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 17.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.12.2012, 16:33     Titel:
  Antworten mit Zitat      
Hallo Harald,
danke für deine Antwort!

Das .m-file ist in der Standard MATLAB-Datei gespeichert und er hat auch keine Probleme, aus aufzurufen.

Ich habe jetzt mehrere Dinge ausprobiert, erhalte aber immer noch den Fehler bzw. teilweise einen anderen:

1) Ich den Input zur Vereinfachung auf a reduiziert und S also einen Wert zugewiesen. Außerdem habe ich, wie empfohlen, auf die Zuweisung syms verzichtet. Dann funktioniert fminsearch(@neg_Wohlstand,0) in dem Sinne, dass es einen Wert ausgibt - allerdings für unterschiedlich hohe S sehr unterschiedliche Ergebnisse, was mich stutzig macht.

Code:
function[W]=neg_Wohlstand(a)

%Grundlagen legen
%syms a

c_1 = .057;
c_2 = .124;
c_0 = .01;
gamma = .5;
K = 10.000;
y = 200;
S=100;

D=(gamma*c_1*(y-S)+(a^2)/4)

E=((1-gamma)*c_2*(y-S)+(a^2)/4)

Wurzel_D=D^(0.5)

Wurzel_E=E^(0.5)

H=4*c_1*c_2*Wurzel_D*Wurzel_E

q_1=(2*Wurzel_D-a)/(2*c_1)
q_2=(2*Wurzel_E-a)/(2*c_2)
p_1=(2*Wurzel_D+a)/(2)
p_2=(2*Wurzel_E+a)/(2)

U=gamma*log(q_1)+(1-gamma)*log(q_2)

Pi_1=p_1*q_1+p_2*q_2-c_1*((q_1)^2)/2-c_2*((q_2)^2)/2-a*(q_1+q_2)

Pi_0=(a-c_0)*(q_1+q_2)-K+S

%U=eval(U)
%Pi_1=eval(Pi_1)
%Pi_0=eval(Pi_0)

W=-(U+Pi_1+Pi_0)



2) Ich habe S als Vektor definiert, mit 200 Zeilen, um zu überprüfen, ob die Werte, die ich in 1) erhalten habe, doch stimmen könnten. Dabei tritt auf:
??? The following error occurred converting from sym to double:
Code:
Error using ==> mupadmex
Error in MuPAD command: DOUBLE cannot convert the input expression into a double array.

If the input expression contains a symbolic variable, use the VPA function instead.

Error in ==> fminsearch at 205
fv(:,1) = funfcn(x,varargin{:});
 



Code:
function[W]=neg_Wohlstand(a)

%Grundlagen legen
syms a

c_1 = .057;
c_2 = .124;
c_0 = .01;
gamma = .5;
K = 10.000;
y = 200;
S_t=linspace(0,200,200);
S=transpose(S_t);

for i=1:200
D(i,1)=(gamma*c_1*(y-S(i,1))+(a^2)/4)

E(i,1)=((1-gamma)*c_2*(y-S(i,1))+(a^2)/4)

Wurzel_D(i,1)=D(i,1)^(0.5)

Wurzel_E(i,1)=E(i,1)^(0.5)

H(i,1)=4*c_1*c_2*Wurzel_D(i,1)*Wurzel_E(i,1)

q_1(i,1)=(2*Wurzel_D(i,1)-a)/(2*c_1)
q_2(i,1)=(2*Wurzel_E(i,1)-a)/(2*c_2)
p_1(i,1)=(2*Wurzel_D(i,1)+a)/(2)
p_2(i,1)=(2*Wurzel_E(i,1)+a)/(2)

U(i,1)=gamma*log(q_1(i,1))+(1-gamma)*log(q_2(i,1))

Pi_1(i,1)=p_1(i,1)*q_1(i,1)+p_2(i,1)*q_2(i,1)-c_1*((q_1(i,1))^2)/2-c_2*((q_2(i,1))^2)/2-a*(q_1(i,1)+q_2(i,1))

Pi_0(i,1)=(a-c_0)*(q_1(i,1)+q_2(i,1))-K+S(i,1)

U=eval(U)
Pi_1=eval(Pi_1)
Pi_0=eval(Pi_0)
end;
W=-(U+Pi_1+Pi_0)
 



Ich habe schlicht keine Ahnung, was falsch ist?
Vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.12.2012, 17:52     Titel:
  Antworten mit Zitat      
Hallo,

1) Du kannst mal eine andere Routine wie fminunc versuchen. Dann würde ich auch exitflag zurückholen. Zudem kannst du ja mal den Funktionsverlauf plotten, um dir ein Bild davon zu machen.

2)
Zitat:
Dabei tritt auf:

Bei was genau? Bitte Code posten, nicht beschreiben. Das syms a ist jedenfalls nicht sinnvoll, wenn du andererseits a als Eingabeargument hast.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Felofex
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 17.12.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.12.2012, 18:25     Titel:
  Antworten mit Zitat      
Hi Harald,
alles klar, dann werde ich es mal damit probieren.

Zu 2) Sorry, da ist mir wohl der code-button um eine Zeile verrutscht - diese ??? gehören bereits zur Fehlermeldung.

Aber ich werd mich jetzt erst mal mit Variante 1 beschäftigen.

Dankeschön!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.12.2012, 18:41     Titel:
  Antworten mit Zitat      
Hallo,

ja, aber was genau machst du denn, um diesen Fehler zu bekommen?

Grüße,
Harald
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 - 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.