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

Gleichung zuweisen

 

Martes
Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 20.01.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.07.2015, 08:59     Titel: Gleichung zuweisen
  Antworten mit Zitat      
Hallo zusammen.

ich habe einen Quellcode, der mir nicht das ausgibt was ich haben will (Quellcode stark vereinfacht).

Code:

syms a b c;
j=a+b;
b = c;
j
 


Als Ausgabe bekomme ich:


Code:

j = a + b
 



ich will aber, dass der folgendes ausgibt:
Code:

j = a + c
 


Bin für jeden Hinweis dankbar. Vielen Dank im voraus
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden


Harald
Forum-Meister

Forum-Meister


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

Code:
j = subs(j, b, c);

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 20.01.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.07.2015, 10:14     Titel:
  Antworten mit Zitat      
das hat nicht so ganz funktioniert. habe es nach einer anderen Methode gemacht. Jedoch möchte ich jetzt diese zwei Gleichungen lösen:

Code:

Gleichung3=
 - (3*b^3 + 272*b^2 + 6093*b)/(12951*b - 269730*u - 12186*b*u - 136*b^2*u + 153*b^2 + 269730) - (1/(u - 1) + 1/(u - 2) + 1/u)/(log(b + 37) + log(b + 45) + log(b + 54) - log(b))
 
 
Gleichung4=
log(b)*(u - 1) + log(b)*(u - 2) - u*log(b + 37) - (3*(12951*b - 269730*u - 12186*b*u - 136*b^2*u + 153*b^2 + 269730))/(3*b^3 + 272*b^2 + 6093*b) - log(b + 45)*(u - 1) - log(b + 54)*(u - 2) + u*log(b)
 


(Wobei Gleichung3 und Gleichung4 gleich NULL sind)

Rein mathematisch würde ich beide Gleichunge nach einer Unbekannten auflösen und gleichsetzten und danach lösen. Jedoch gibt mir Matlab eiine Fehlermeldung beim umformen aus. Ich benutzte folgenden Code für die umstellung:

Code:

b_1=solve(Gleichung3,b)
 


Die Fehlermeldung lautet:

Code:

Warning: Explicit solution could not be found.
> In solve at 179
  In LW_Berechnung at 121
 
b_1 =
 
[ empty sym ]
 
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.07.2015, 10:32     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
das hat nicht so ganz funktioniert.

Das ist keine hilfreiche Information. Gab es eine Fehlermeldung? Welche? Wich das Verhalten vom erwarteten ab? Inwiefern?
Für dein gegebenes Beispiel macht der Vorschlag jedenfalls das gewünschte.

Zitat:
habe es nach einer anderen Methode gemacht

Im Interesse anderer Forum-Nutzer sollte man dann schreiben, welche Methode genutzt wurde.

Zitat:
Die Fehlermeldung lautet:

Es ist keine Fehlermeldung, sondern eine Warnung. Das Problem: wenn es keine explizite Lösung gibt (also b nicht als Formel von u dargestellt werden kann), dann kann MATLAB auch keine finden.

Ausweg: numerische Lösungen suchen, z.B. mit fsolve .

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 20.01.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.07.2015, 11:26     Titel:
  Antworten mit Zitat      
Zunächst vielen Dank, dass du dich mit meinem Problem beschäftigt hast.

Ich habe es anderes gelöst in dem ich einfach die Gleichung aufgerufen habe und die Variable ersetzt habe. Also so:

Code:
syms a b c;
j=a+b;
b = c;
j = a+b;


Ergebnis wie gewünscht:

Code:


Ja sorry, ich meinte natürlich Warnung.

Das mit dem Befehl fsolve habe ich schon sehr oft gelesen. Und das es numerisch gelöst werden muss, verstärkt meine Thorie, dass ich auf dem richtigen Weg bin. Ich habe auch die funktion fsolve verwendet. Aber ich habe 2 unbekannte und zwei Gleichungen. In der Matlabhilfe für fsolve ist immer nur eine Glecihung und eine Unbekannte aufgeführt. Mein zu lösende Gelichung sieht wie folgt aus:

Code:
syms b;
syms u;
Gleichung1=0;
Gleichung2=0;

Gleichung1 = - (3*b^3 + 272*b^2 + 6093*b)/(12951*b - 269730*u - 12186*b*u - 136*b^2*u + 153*b^2 + 269730) - (1/(u - 1) + 1/(u - 2) + 1/u)/(log(b + 37) + log(b + 45) + log(b + 54) - log(b))
 
Gleichung2 = log(b)*(u - 1) + log(b)*(u - 2) - u*log(b + 37) - (3*(12951*b - 269730*u - 12186*b*u - 136*b^2*u + 153*b^2 + 269730))/(3*b^3 + 272*b^2 + 6093*b) - log(b + 45)*(u - 1) - log(b + 54)*(u - 2) + u*log(b)
 
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
In der Matlabhilfe für fsolve ist immer nur eine Glecihung und eine Unbekannte aufgeführt.

Zumindest für die aktuelle Doku stimmt das nicht.
Example 1 in http://www.mathworks.com/help/optim/ug/fsolve.html
behandelt genau den Fall von zwei Gleichungen mit zwei Unbekannten.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 20.01.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.07.2015, 11:38     Titel:
  Antworten mit Zitat      
ups..


habe die indexe nicht beachten. Ich versuche das auf mich anzuwenden.

Danke
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Martes
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 20.01.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.07.2015, 15:30     Titel:
  Antworten mit Zitat      
So...
sitzte jetzt seit mehreren Stunden dran....

Bin trotzdem nicht zum Ziel gekommen. Das ist mein Code:
Code:
syms a;
syms b;

eg1 = a + 2*b == 0;
eg2 = 2*a + 1/b == 0;

function F = LW_Berechnung(x)

a=x(1);
b=x(2);

F= [eg1;
    eg2];
end



Dieser code ist ein stark abgewandelte Version meines echten Codes. Die Glechung muss ausserhalb der Funktion deklarierrt werden.


und das gebe ich im Consolenfenster ein:

Code:
x0 = [-5; -5];  % Make a starting guess at the solution
options = optimoptions('fsolve','Display','iter'); % Option to display output
[x,fval] = fsolve(@LW_Berechnung,x0,options) % Call solver


Über Hilfe wäre ich dankbar.
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Andy386
Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 23.07.2015, 15:57     Titel:
  Antworten mit Zitat      
Äh,
Harald hat Folgendes geschrieben:
Gab es eine Fehlermeldung? Welche? Wich das Verhalten vom erwarteten ab? Inwiefern?


Das du einmal ein script hast, wo ne Funktion drin ist und dann noch im Command Window ein script abarbeitest, verwirrt mich etwas.
mEn sollte die Funktion schon extra als Datei sein
_________________

Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
Private Nachricht senden Benutzer-Profile anzeigen
 
Martes
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 20.01.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.07.2015, 17:05     Titel:
  Antworten mit Zitat      
Ich bekomme folgende Fehlermeldung (sorry, habe ich vergessen einzufügen)

Code:
Error: File: LW_Berechnung.m Line: 141 Column: 1
Function definitions are not permitted in this context.



ich habe nicht so ganz verstanden was du meinst. Ich bin genau nach matlabhilfe gegangen, so wie Harald geschrieben hat

http://www.mathworks.com/help/optim/ug/fsolve.html
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Martes
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 20.01.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.07.2015, 17:37     Titel:
  Antworten mit Zitat      
Ich habe mal meinen Quellcode hier angehängt:

Gleichung1: 0=1/(92*(u - 1)) - fi + 1/(92*(u - 2)) + 1/(92*u)

Gleichung2 : 0=92*u - 3/fi - 137

Ich möchte diese zwei Gleichungen mit fsolve lösen.


Also muss ich die zuerst mal definieren:

Code:
eg1 = -fi+faktor4*faktor2
eg2 = -n/fi+faktor3


faktor3, faktor4 und faktor5 kommen aus einer for- Schleife. Hier der komplette Code:

Code:

summe_links=0;
summe_rechts=0;
faktor1=0;
faktor2=0;
faktor3=0;
faktor4=0;
faktor5=0;
syms fi;
syms u;
t=[];

n=3;


t = xlsread('JM_Berechnung_Ausfalldaten.xlsx', 1, ['A1:A', num2str(n)]);

for i=1:n
    faktor1 = faktor1+t(i);
end;

faktor2=1/faktor1;

for i=1:n
    faktor3 = faktor3+(u-i+1)*t(i);
end;

for i=1:n
    faktor4 = faktor4+1/(u-i+1);
end;

digits(10);

eg1 = -fi+faktor4*faktor2
eg2 = -n/fi+faktor3

function F = JM_Berechnung(u,fi)

F= [eg1;
    eg2];
end

 



Ich bekomme diese Fehlermeldung:

Code:
Error: File: JM_Berechnung.m Line: 141 Column: 1
Function definitions are not permitted in this context.



Nehme ich die Funktion ganz nach oben dann bekomme ich ergebnisse:

Code:
function F = JM_Berechnung(u,fi)
summe_links=0;
summe_rechts=0;
faktor1=0;
faktor2=0;
faktor3=0;
faktor4=0;
faktor5=0;
syms fi;
syms u;
t=[];

n=3;%4;


t = xlsread('JM_Berechnung_Ausfalldaten.xlsx', 1, ['A1:A', num2str(n)]);

for i=1:n
    faktor1 = faktor1+t(i);
end;

faktor2=1/faktor1;

for i=1:n
    faktor3 = faktor3+(u-i+1)*t(i);
end;

for i=1:n
    faktor4 = faktor4+1/(u-i+1);
end;

digits(10);

eg1 = -fi+faktor4*faktor2
eg2 = -n/fi+faktor3

F= [eg1;
    eg2];
end
 


Ergebnisse:

Code:
eg1 =
 
1/(92*(u - 1)) - fi + 1/(92*(u - 2)) + 1/(92*u)
 
 
eg2 =
 
92*u - 3/fi - 137
 
 
ans =
 
 1/(92*(u - 1)) - fi + 1/(92*(u - 2)) + 1/(92*u)
                               92*u - 3/fi - 137



und wenn ich dann die berechneten Werte haben will (u und fi) gebe ich im Commandofenster folgendes ein:

Code:
x0 = [-5; -5];  % Make a starting guess at the solution
options = optimoptions('fsolve','Display','iter'); % Option to display output
[u,fi,fval] = fsolve(@JM_Berechnung,x0,options) % Call solver



Und da bekomme ich dann die fehlermeldung:


Code:
Error using fsolve (line 257)
FSOLVE requires all values returned by user functions to be of data type
double.



Hoffe jetzt wird mein Problem verständlicher. Hoffe jemand könnte sich zeit nehmen und mir helfen. Vielen Dank im voraus

Gruß Martes
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Andy386
Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 24.07.2015, 10:26     Titel:
  Antworten mit Zitat      
Soo genau kenne ich mich nicht damit aus, aber es scheint mir als hättest du einen Verständnisfehler.

Deine Funktion, die du lösen willst, sollte nicht mit syms arbeiten müssen, sonst musst du da auch wieder lösen.

Schau dir mal das von dir gepostete Beispiel genau an.
Und -ich weiss ja nicht wie flexibel Matlab jetzt ist- früher "gehörte" eine Funktion auch in eine seperate Datei.

Tipp: Diese Funktion muss (mit passenden Werten) irgendetwas sinnvolles zurückgeben können, damit fsolve was damit machen kann.
_________________

Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
Private Nachricht senden Benutzer-Profile anzeigen
 
Martes
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 20.01.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.07.2015, 10:39     Titel:
  Antworten mit Zitat      
Hi.

Letztendlich habe ich ja nur zwei Funktionen die gelöst werden sollen numerisch. Zweigleitungen mit zwei unbekannten. Das muss doch mit matlab möglich sein. Dir unbekannten variablen muss ich ja mit syms deklarieren.
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 24.07.2015, 10:53     Titel:
  Antworten mit Zitat      
Zitat:
Dir unbekannten variablen muss ich ja mit syms deklarieren.

warum? du willst doch nummerisch rechenn und nicht analytisch. du hällst dich nicht and die beispiele aus der doc und die vorschläge.
funktionen gehören in eine eigene datei. das andere sind anonyme funktionen.
bei jedem funktionsaufruf die daten neu einzulesen ist sehr zeitaufwending. also entweder die daten vorher einlesen und übergeben oder mit persistent arbeiten.
ich würde ersteres machen.
deine schleifen kann man durch sum ersetzen
Zitat:
Code:
[u,fi,fval] = fsolve(@JM_Berechnung,x0,options) % Call solver

fsovle hat war mehrere ausgaben parameter aber nur der erste sind die optimirungsparameter.
Zitat:
Code:
F = JM_Berechnung(u,fi)

die funktion darf nur einen eigabe parameter haben.
Zitat:
. fun is a function that accepts a vector x and returns a vector F

du vermischt hier zwei rechenarten.

versuch mal die funktion erstmal richtig in eine extra datie zu packen
Code:
function F = JM_Berechnung(x,t,n)
faktor1=sum(t);
faktor2=1/faktor1;
faktor3=sum((x(1)+1-1:n).*t);
faktor4=sum(1./(x(1)+1-1:n));
eg1 = -x(2)+faktor4*faktor2;
eg2 = -n/x(2)+faktor3 ;
F= [eg1;eg2];
end
 

und dann die funktion mittels anonymer funktion einzubinden
Code:
n=3;
t = xlsread('JM_Berechnung_Ausfalldaten.xlsx', 1, ['A1:A', num2str(n)]);
x0 = [-5; -5];  % Make a starting guess at the solution
options = optimoptions('fsolve','Display','iter'); % Option to display output
[x,fval] = fsolve(@(x) JM_Berechnung(x,t,n),x0,options); % Call solver

grüße
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Martes
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 20.01.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.07.2015, 10:58     Titel:
  Antworten mit Zitat      
Hi.

Danke für deine zeit und mühe.

Ich werde mich direkt nach der Vorlesung dran setzten und es versuchen.

Hoffe es klappt. Wäre dir dann total dankbar Wink
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
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 - 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.