2016-03-26 16 views
5

Wie kann ich eine nicht-lineare Gleichung in SymPy lösen, die von der FormWie löse ich eine nichtlineare Gleichung in Sympy?

y = P*x + Q + sqrt(S*x + T) 

wo ich y(0) wissen, y'(0), y(c), y'(c). Ich möchte P, Q, S und T finden. und repräsentieren y als eine Funktion von x.

Ich bin sehr verwirrt mit der Dokumentation. Bitte helfen Sie.

Antwort

2

HINWEIS: Meine Sympathie hängt an Ihrer ursprünglichen Gleichung y = P*x + Q + sqrt(S*x + T). Ich werde y = P*x + Q + x*x*(S*x + T) nur verwenden, um zu demonstrieren, wie der Sympy Solver funktioniert (wenn es funktioniert).

Strategie:

  • Express y als eine Funktion der anderen Variablen (x, P, Q, S, T)
  • Differenzieren y
  • Einrichten 4 Gleichungen, die bekannten Konstanten (0, c, y (0), Y (c), y '(0), y' (c))
  • Verwenden sympy
  • Drucke jede mögliche Lösung lösen (wenn es welche gibt)

Code:

# Set up variables and equations 
x, y, P, Q, S, T, = sympy.symbols('x y P Q S T') 
c, y_0, y_c, dy_0, dy_c = sympy.symbols('c y_0 y_c dy_0 dy_c') 
eq_y = P * x + Q + x * x * (S * x + T) 
eq_dy = eq_y.diff(x) 

# Set up simultaneous equations that sympy will solve 
equations = [ 
    (y_0 - eq_y).subs(x, 0), 
    (dy_0 - eq_dy).subs(x, 0), 
    (y_c - eq_y).subs(x, c), 
    (dy_c - eq_dy).subs(x, c) 
] 

# Solve it for P, Q, S and T 
solution_set = sympy.solve(equations, P, Q, S, T, set = True) 

# Extract names, individual solutions and print everything 
names = solution_set[0] 
solutions = list(solution_set[1]) 
for k in range(len(solutions)): 
    print('Solution #%d' % (k+1)) 
    for k2, name in enumerate(names): 
     print('\t%s: %s' % (name, solutions[k][k2])) 

Ausgang:

Solution #1 
    P: dy_0 
    Q: y_0 
    S: (c*(dy_0 + dy_c) + 2*y_0 - 2*y_c)/c**3 
    T: (-c*(2*dy_0 + dy_c) - 3*y_0 + 3*y_c)/c**2 

Sie nun eine dieser Lösungen verwenden können, und das andere tun .subs(...)y zu bekommen als eine Funktion rein Ihrer Konstanten aus und x.

Wie für Ihre ursprüngliche Gleichung ... Ich frage mich, wenn jemand einen Fehlerbericht für sympy Datei sollte, so dass sie auf sie verbessern ... :)

1

Gerade jetzt Löser bei der Lösung von Gleichungssystem eine Frage hat, die mehr sqrt. Also in unten Code zuerst Entfernen der sqrt und dann lösen System der Gleichung.Zur Zeit ist Solver nicht schnell für diese Arten von Gleichungen, es dauert etwa 10 Sekunden, um auszuführen.

P, Q, S, T, = symbols('P Q S T') 
c, y_0, y_c, dy_0, dy_c = symbols('c y_0 y_c dy_0 dy_c') 
eq_y = (P*x + Q - y(x))**2 + S*x + T 
eq_dy = eq_y.diff(x) 
equations = [ 
    (eq_y).subs([(x, 0), (y(0), y_0), (y(x).diff(x).subs(x, 0), dy_0)]), 
    (eq_dy).subs([(x, 0), (y(0), y_0), (y(x).diff(x).subs(x, 0), dy_0)]), 
    (eq_y).subs([(x, c), (y(c), y_c), (y(x).diff(x).subs(x, c), dy_c)]), 
    (eq_dy).subs([(x, c), (y(c), y_c), (y(x).diff(x).subs(x, c), dy_c)]) 
] 
solve(equations, P, Q, S, T) 

Antwort:

[(-(y_0 - y_c)/c, y_0, 0, 0), ((2*c*dy_0*dy_c + dy_0*y_0 - dy_0*y_c + dy_c*y_0 - dy_c*y_c)/(c*dy_0 + c*dy_c + 2*y_0 - 2*y_c), -(2*c**3*dy_0*dy_c**2 - c**2*dy_0**2*y_0 + 2*c**2*dy_0*dy_c*y_0 - 4*c**2*dy_0*dy_c*y_c + c**2*dy_c**2*y_0 - 2*c**2*dy_c**2*y_c - 2*c*dy_0*y_0**2 + 2*c*dy_0*y_c**2 - 4*c*dy_c*y_0*y_c + 4*c*dy_c*y_c**2 - 2*y_0**3 + 2*y_0**2*y_c + 2*y_0*y_c**2 - 2*y_c**3)/(c*dy_0 + c*dy_c + 2*y_0 - 2*y_c)**2, -4*(dy_0 - dy_c)*(c*dy_0 + y_0 - y_c)**2*(c*dy_c + y_0 - y_c)**2/(c*dy_0 + c*dy_c + 2*y_0 - 2*y_c)**3, -4*(c*dy_0 + y_0 - y_c)**2*(c*dy_c + y_0 - y_c)**4/(c*dy_0 + c*dy_c + 2*y_0 - 2*y_c)**4)] 

bitte kreuzen Sie die Antwort überprüfen.