2017-07-20 1 views
1

Ich habe diese Differentialgleichung in SymPy geschriebenSymPy: Wie bewerte ich einen Ausdruck mit Konstanten?

diffeq = Eq(f(x).diff(x, x) - 2*f(x).diff(x) + f(x), sin(x)) 

wobei f (x) ist ein Symbol Funktionssymbol und x ein variables Symbol.

Wenn ich löse es mit diesem:

expr = dsolve(diffeq, f(x)) 

ich

f(x)=(C_1+C_2x)ex+12cos(x) 

Welches ist die richtige Lösung für diese Gleichung ist. Aber jetzt möchte ich diese Funktion in mehreren Punkten bewerten. Ich weiß, dass ich das x durch die Subfunktion ersetzen kann, aber gibt es eine Möglichkeit, die konstanten Werte C_1 und C_2 zu ersetzen, damit ich die Funktion auswerten kann?

Antwort

1

Es gibt eine offene PR für diese auf GitHub, die eine ics Flagge dsolve hinzufügen würde.

Vorerst können Sie die Werte ersetzen manuell subs, verwenden Sie solve für C1 und C2, zu lösen und nutzen subs die Werte wieder in die Lösung zu ersetzen.

Zum Beispiel, wenn f(0) = 1 und f'(0) = 0, würden Sie so etwas wie

>>> p1 = expr.subs([(x, 0), (f(0), 1)]) 
>>> dexpr = Eq(expr.lhs.diff(x), expr.rhs.diff(x)) 
>>> p2 = dexpr.subs([(x, 0), (f(x).diff(x).subs(x, 0), 0)]) 
>>> p1 
Eq(1, C1 + 1/2) 
>>> p2 
Eq(0, C1 + C2) 
>>> C1, C2 = symbols('C1 C2') 
>>> sol = solve([p1, p2], [C1, C2]) 
>>> sol 
{C1: 1/2, C2: -1/2} 
>>> expr.subs(sol) 
Eq(f(x), (-x/2 + 1/2)*exp(x) + cos(x)/2) 
verwenden
0

Sie können Ihre Konstanten aus Ihrem Ausdruck erhalten. Es ist ein bisschen chaotisch, aber es funktioniert:

v1 = expr.args[1].args[1].args[0].args[0] 
v2 = expr.args[1].args[1].args[0].args[1].args[0] 
expr.subs(v1,1).subs(v2,2) 

Erläuterung: einen Blick auf expr.args Haben . Es ist ein Tupel der linken und der rechten Seite der Gleichung. Hier wollen wir den zweiten Eintrag des Tupels, also Index 1. Wir bekommen dann einige sympy.core.add.Add. Dies können wir wieder unter Verwendung args zerlegen und können weitermachen, bis wir unsere Konstanten erreichen.

Verwandte Themen