簡體   English   中英

如何解決Sympy中的非線性方程?

[英]How do I solve a non-linear equation in Sympy?

如何解決SymPy中非線性方程的形式

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

我知道y(0)y'(0)y(c)y'(c) 我想找到PQST 並將y表示為x的函數。

我對文檔感到非常困惑。 請幫忙。

注意:我的觀點是你原來的y = P*x + Q + sqrt(S*x + T) 我將使用y = P*x + Q + x*x*(S*x + T) ,以便能夠演示症狀解算器的工作原理(當它工作時)。

戰略:

  • 將y表示為其他變量(x,P,Q,S,T)的函數
  • 區分你
  • 使用已知常數(0,c,y(0),y(c),y'(0),y'(c))設置4個方程式
  • 用sympy解決
  • 打印每種可能的解決方案(如果有的話)

碼:

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

輸出:

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

您現在可以使用這些解決方案中的一個並執行另一個.subs(...)來將y作為一個純粹由常量和x組成的x

至於你原來的等式...我想知道是否有人應該提交一個錯誤報告,以便他們可以改進它...... :)

現在求解器在解決具有更多sqrt的方程組時存在一些問題。 所以在下面的代碼中首先刪除sqrt然后求解方程組。對於這些類型的方程,當前求解器並不快,執行大約需要10秒。

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)

答案:

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

請交叉檢查答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM