Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   
Bücher:


Studierende:
Abschlussarbeit / Praktikum: Entwicklung Matlab (m/w)
Branche: Informationstechnologie, Elektrotechnik, Elektronik
GIGATRONIK Technologies GmbH - Ulm

Praktikant Toolentwicklung Matlab (m/w)
Branche: Beratung, Expertise, Fahrzeugtechnik, Fahrzeugteile, Technische Dienstleistungen
MBtech Group GmbH & Co. KGaA - Fellbach

Praktikum - Vergleich von MATLAB und Scilab
Branche: mehrere
IAV GmbH - Ingenieurgesellschaft Auto und Verkehr - Chemnitz

Praktikum - Modellerstellung mit Matlab/Simulink
Branche: mehrere
IAV GmbH - Ingenieurgesellschaft Auto und Verkehr - Berlin, Chemnitz

Studentische Mitarbeit - Applikation / Funktionsentwicklung On-Board-Diagnose für Dieselmotoren
Branche: mehrere
IAV GmbH - Ingenieurgesellschaft Auto und Verkehr - Gifhorn

weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Lösen einer DGL aus symbolische Variablen

 

verzweifelt

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2017, 18:30     Titel: Lösen einer DGL aus symbolische Variablen
  Antworten mit Zitat      
Hallo,

ich möchte ein DGL-System lösen das mit symbolische Variablen gegeben ist und wie folgt aussieht:
S ist die Koeffizientenmatrix.

dx/dt = S*r
r(1) = kiso(1)*x(1)^2;
r(2) = kiso(2)*x(2);

Ich komme nicht weiter, ob ich hier den üblichen ODE-Solver verwenden kann oder das ganze über dsolve machen muss.
Ich habe Anfangsbedingungen und einen Zeitvektor gegeben und möchte dann über lsqnonlin die Parameter kiso schätzen.

Danke


Harald
Forum-Meister

Forum-Meister


Beiträge: 17.042
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2012a
     Beitrag Verfasst am: 12.08.2017, 22:35     Titel:
  Antworten mit Zitat      
Hallo,

wenn mit dsolve eine Lösung gefunden werden kann, dürfte das genauer sein. Ansonsten spricht nichts gegen eine numerische Lösung.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.08.2017, 10:10     Titel:
  Antworten mit Zitat      
Hallo,

ich bekommen es aber nicht hin eine Lösung mit dsolve zu finden.

Code:
function [ Tsim, sim ] = simData(K,time,IC,M )
   
odes = diff(M.x,M.t) == (M.S*M.g')';
xsol = dsolve(odes);

sim1 = subs(xsol.x1,[M.kiso M.t],[K time(1)]);
sim2 = subs(xsol.x2,[M.kiso M.t],[K time(1)]);
sim3 = subs(xsol.x3,[M.kiso M.t],[K time(1)]);

sim = [sim1, sim2, sim3];

sim = double(sim)


Ich würde gerne dann die Lösung mit den bekannten Werten ersetzen, weil ich dann einen konkreten Zahlenwert haben möchte um eben den Unterschied zwischen meinen Messwerten und den Modellvorhersagen zu vergleichen. Ich habe was symbolische Variablen angeht noch nicht so viel Erfahrung.

Danke
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 17.042
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2012a
     Beitrag Verfasst am: 13.08.2017, 10:46     Titel:
  Antworten mit Zitat      
Hallo,

Wie rufst du die Funktion simData auf?
Welche Probleme treten dabei auf?

Wenn du mit dsolve nicht weiterkommst, dann versuch es doch mit ode45?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Hunni
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 13.08.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.08.2017, 10:51     Titel:
  Antworten mit Zitat      
Hallo

Den Code rufe ich so auf und übergebe das struct M in dem mein Modell aus symbolischen Variablen gespeichert ist.
Code:
[ ~, sim ] = simData(K,data(i).time,IC,M);


data.time sind die Zeitpunkte bei denen meine Messwerte bestimmt worden. Mit dem ODE-Solver habe ich es auch schon versucht aber dabei weiß ich nicht genau wie ich es machen muss um mein Modell zu übergeben.
Muss ich dafür den Befehl matlabfunction() verwenden?

Vielen Dank
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 17.042
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2012a
     Beitrag Verfasst am: 13.08.2017, 10:54     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Den Code rufe ich so auf und übergebe das struct M in dem mein Modell aus symbolischen Variablen gespeichert ist.

Jetzt müsstest du nur noch schreiben, was K, data.time, IC und M sind, und man könnte das Problem reproduzieren.

Zudem fehlt weiterhin die Fehlermeldung.

Zitat:
Mit dem ODE-Solver habe ich es auch schon versucht aber dabei weiß ich nicht genau wie ich es machen muss um mein Modell zu übergeben.

Dann poste doch bitte deinen Versuch. Wenn du die DGL numerisch löst, würde ich versuchen, komplett ohne symbolische Variablen zu arbeiten. Wenn sich das nicht vermeiden lässt, brauchst du in der Tat matlabFunction.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Hunni
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 13.08.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.08.2017, 11:04     Titel:
  Antworten mit Zitat      
Mein Modell ist so definiert
Code:
function [ t, y, x, kiso, g, initial, boundaries, S ] = Model1( )

%Modelstructure
% time
t = sym ('t');
%Output variables
y = sym('y', [1 3]);
%Input variables
syms 'x1(t)' 'x2(t)' 'x3(t)'
x = [x1(t) x2(t) x3(t)];
%Parameters
kiso = sym('kiso', [1 2]);

g = sym('g', [1 2]);

g(1) = kiso(1)*x(1)^2;
g(2) = kiso(2)*x(2);

initial = [0.001 0.01];
boundaries = [ 1E-5*ones(1,max(size(kiso))); ones(1,max(size(kiso)))];
%coefficient matrix
S = [-2 0; 1 -1; 0 1];

end


Bei dem Versuch mit dsolve bekomme ich immer folgenden Fehler
Code:
Error using mupadengine/feval (line 166)
Invalid initial conditions.

Error in dsolve>mupadDsolve (line 336)
T = feval(symengine,'symobj::dsolve',sys,x,options);

Error in dsolve (line 194)
sol = mupadDsolve(args, options);



Bei der numerischen Lösung habe ich es so geschrieben:
Code:
function [ Tsim, sim ] = simData(K,time,IC,M )
   
g = M.S*M.g';
F = matlabFunction(g,'Vars',{'t',['kiso','x']})
[Tsim, sim ] = ode15s(F, time, IC, K);

end


Da bekommen ich bereits bei matlabFunction den Fehler.

Code:
Error using sym/matlabFunction>checkVarsSubset (line 232)
The free variables kiso1,kiso2 must be included in the 'Vars' value.

Error in sym/matlabFunction>checkVars (line 222)
checkVarsSubset(vexpanded,funvars);

Error in sym/matlabFunction (line 154)
vars = checkVars(funvars,opts);

Error in simData (line 14)
F = matlabFunction(g,'Vars',{'t',['kiso','x']})

Error in Model_LSS (line 14)
    [ ~, sim ] = simData(K,data(i).time,IC,M);


Danke
Private Nachricht senden Benutzer-Profile anzeigen
 
Hunni
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 13.08.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.08.2017, 16:42     Titel: ODE-Solver mit symbolic Toolbox
  Antworten mit Zitat      
Hallo,

ich bin jetzt mit dem ODE-Solver noch weitergekommen, aber ich verstehe nicht ganz warum immer ein fester Vektor berechnet wird als Zeit selbst wenn ich bestimmte Werte vorgeben.

Code:
sym Y;
M.g = subs(M.g,M.kiso,K);
M.cond = subs(M.cond, M.IC, IC);
odes = diff(M.x,M.t,1) == (M.S*M.g')';
[DEs,~] = odeToVectorField(odes);
DEfcn = matlabFunction(DEs, 'vars', {'t','Y'});

sol = ode15s(DEfcn, 0:15:300, IC);

tsim = sol.x';
sim = sol.y';


Für den Zeitvektor bekommen ich mit diesem Code jedoch folgenden Zeitvektor:
0
0,0252633103284943
0,0505266206569887
0,0757899309854830
0,328423034270427
0,581056137555370
0,833689240840314
1,08632234412526
3,61265337697469
6,13898440982413
8,66531544267356
11,1916464755230
24,3988630026953
37,6060795298676
50,8132960570398
64,0205125842121
77,2277291113844
102,699994293666
128,172259475948
153,644524658230
179,116789840512
204,589055022793
230,061320205075
260,061320205075
290,061320205075
300


Hat vielleicht wer einen Tipp für mich wo der Fehler liegen könnte. Vielen Dank
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 17.042
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2012a
     Beitrag Verfasst am: Gestern 09:26     Titel:
  Antworten mit Zitat      
Hallo,

es macht das ganze deutlich einfacher, wenn du den Code so zusammenhängend postest, dass man das problemlos nachvollziehen kann.

Zu deiner letzten Frage: ode15s mit zwei Rückgabeargumenten aufrufen.
Code:
[t, y] = ode15s(DEfcn, 0:15:300, IC);


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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de goPCB.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2017 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.