2016-03-26 23 views
5

Come posso risolvere un'equazione non lineare in SymPy, che ha la formaCome posso risolvere un'equazione non lineare in Sympy?

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

dove so y(0), y'(0), y(c), y'(c). Voglio trovare P, Q, S e T. e rappresentano y in funzione di x.

Mi sto confondendo molto con la documentazione. Per favore aiuto.

risposta

2

NOTA: Il mio sympy è stato sospeso sull'equazione originale di y = P*x + Q + sqrt(S*x + T). Userò y = P*x + Q + x*x*(S*x + T) solo per essere in grado di dimostrare come funziona il risolutore sympy (quando funziona).

strategia:

  • espresso y in funzione delle altre variabili (x, P, Q, S, T)
  • Differentiate y
  • Messa 4 equazioni usando le costanti note (0, c, y (0), y (c), y '(0), y' (c))
  • Uso sympy risolvere
  • Stampa ogni possibile soluzione (se presenti)

Codice:

# 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])) 

uscita:

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 

È ora possibile utilizzare una di queste soluzioni e fare un altro .subs(...) per ottenere y in funzione puramente composto da vostri costanti e x.

Per quanto riguarda l'equazione originale ... mi chiedo se qualcuno dovesse presentare un bug report per sympy in modo che possano migliorare su di essa ... :)

1

In questo momento avere qualche problema risolutore nel sistema di equazioni risolvere avere altro sqrt. Quindi, nel codice seguente rimuoviamo prima il sqrt e poi risolviamo il sistema di equazione. Attualmente il risolutore non è veloce per questi tipi di equazioni, ci vogliono circa 10 secondi per essere eseguito.

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) 

Risposta:

[(-(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)] 

barrare controllare la risposta.