2016-06-24 7 views
1

die definieren Lassen Funktion x(t), seine zeitliche Ableitung xdot(t) und Ausdruck T, die von ihnen abhängig ist:Partielle Differentialgleichung in Matlab (falsche Lösung)

syms t x(t) 
xdot(t) = diff(x,t); 
T = (xdot + x)^2; 

Wir können alle einig, dass partielle Ableitung von T in Bezug auf x ist ∂T/∂x = 2*(xdot+x). Allerdings, wenn ich dies tun in Matlab erhalte ich falsche Antwort:

dT_dx = subs(diff(subs(T,x,'x'), 'x'), 'x', x); 
>> dT_dx = 2 x(t) 

Beachten Sie, dass es die richtige Antwort für ∂T/∂xdot zurückgibt:

dT_dxdot = subs(diff(subs(T,xdot,'x1'), 'x1'), 'x1', xdot); 
>> dT_dxdot = 2*x(t) + 2*diff(x(t), t) 

Es sieht aus wie Matlab das Produkt 2*x*xdot ignoriert, bei der Berechnung der Ableitungen in Bedingungen niedrigerer Ordnung Variablen (x), aber es dieses Produkt nicht ignorieren, wenn Derivat in Form höherer Ordnung Variablen (xdot) berechnet wird. Wenn wir den Ausdruck T als T = (100 + x)^2 neu definiert, würden wir ∂T/∂x erhalten:

>> ans = 2 x(t) + 200 

So nach xdot mit einer konstanten getauscht haben wir jetzt richtige Antwort erhalten.

Kommentare:

  • I Doppelsubstitution verwendet, um die Funktion diff, weil diff(T,x) ein Fehler zurück zu verwenden. Ich fand diesen Ansatz here.
  • Erweiterung des Ausdrucks T vor der Berechnung der Ableitung funktioniert nicht - wir bekommen immer noch falsche Antwort.
  • Ich habe auch versucht die functionalDerivative Funktion, aber es gibt die falsche und Antwort.

Frage

Wie kann man zuverlässig Teil und absolute Derivate von T berechnen, vor allem ∂T/∂x?

Ist subs(diff(subs() )) ein guter Ansatz, oder gibt es einen besseren Weg, und wenn ja, was ist das?

Antwort

1

Wie Sie vielleicht bemerkt haben, ist die Ableitung eines abstrakten symfun wie x(t) nehmen nicht das gleiche wie die Ableitung einer symbolischen Variablen wie x unter (x(t) Annahme nicht bereits im Rahmen deklariert) - siehe my answer here für Mehr. Man muss sehr vorsichtig substituierende sein wie du tust. Das Problem tritt auf, weil x(t) für 'x' innerhalb von diff(x,t) (xdot(t)) ersetzt wird, d. H. Die erste Ersetzung in Ihrem Code subs(T,x,'x') gibt bereits ein falsches Ergebnis relativ zu dem, was Sie erwarten, zurück.

Sie können dies versuchen:

syms x(t) 
xdot(t) = diff(x,t); 
T = (xdot + x)^2; 
x1 = {x,xdot}; 
x2 = {'x','xdot'}; 
dT_dx = subs(diff(subs(T,x1,x2),'x'),x2,x1) 

die 2*x(t) + 2*diff(x(t), t) zurückgibt.

+0

Ich werde in Substitution Problem schauen, weil dies der Fall sein muss. Auf der anderen Seite gibt 'functionalDerivative' keine erforderliche Antwort zurück, da es eine zweite Ableitung von x gibt und was ich brauche, ist eine partielle Ableitung von T gegen x, das ist genau '∂T/∂x = 2 * (xdot + x)' . – Maverick

+0

Hmm, das ist mir gerade aufgefallen. Ich untersuche es. Ich habe auch aktualisiert mit Antwort mit einer 'subs'-Lösung. – horchler