如何解决Sympy中的非线性方程?

Man*_*ish 5 python solver sympy equation-solving

如何解决SymPy中非线性方程的形式

y = P*x + Q + sqrt(S*x + T)
Run Code Online (Sandbox Code Playgroud)

在那里我知道y(0),y'(0),y(c),y'(c).我想找到P,Q,ST.并表示y作为的函数x.

我对文档感到非常困惑.请帮忙.

Ru *_*sha 4

注意:我对你原来的 方程表示同情y = P*x + Q + sqrt(S*x + T)。我将使用它y = P*x + Q + x*x*(S*x + T)只是为了能够演示 sympy 求解器如何工作(当它工作时)。

战略:

  • 将 y 表示为其他变量(x、P、Q、S、T)的函数
  • 微分y
  • 使用已知常数建立 4 个方程 ( 0, c, y(0), y(c), y'(0), y'(c) )
  • 使用 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]) )
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用这些解决方案之一并执行另一种解决方案.subs(...),以获得y纯粹由常量 和 组成的函数x

至于你原来的方程...我想知道是否有人应该为 sympy 提交错误报告,以便他们可以改进它...:)