首页 文章

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

提问于
浏览
5

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

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

我知道的地方 y(0)y'(0)y(c)y'(c) . 我想找 PQST . 并将 y 表示为 x 的函数 .

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

2 回答

  • 2

    注意:我的同情被绞在你原来的 y = P*x + Q + sqrt(S*x + T) 等式上 . 我将使用 y = P*x + Q + x*x*(S*x + T) 只是为了能够演示同情解算器的工作原理(当它工作时) .

    Strategy:

    • 表达y作为其他变量(x,P,Q,S,T)的函数

    • 区分y

    • 使用已知常数(0,c,y(0),y(c),y '(0), y'(c))设置4个方程式

    • 使用sympy解决

    • 打印每种可能的解决方案(如果有的话)

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

    Output:

    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 组成的函数 .

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

  • 1

    现在解算器在求解具有更多 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)]
    

    请交叉检查答案 .

相关问题