【问题标题】:Is SymPy correctly solving this ODE?SymPy 是否正确解决了这个 ODE?
【发布时间】:2019-08-27 16:25:03
【问题描述】:

我正在使用 Anaconda 包中的 SymPy 1.4 来评估该工具。我有以下 ODE 需要解决:

使用 SymPy 时,我有以下代码和结果:

import sympy as sp
x=sp.Symbol('x')
y=sp.Function('y')(x)
diffeq=sp.Eq(sp.diff(y,x), (5*x**2-x*y+y**2)/x**2)
sp.dsolve(diffeq,y)

如果我在线使用 WolframAlpha,我会得到:

这是软件中的错误吗?如果有,我在哪里可以举报?

【问题讨论】:

    标签: python wolfram-mathematica sympy symbolic-math differential-equations


    【解决方案1】:

    我认为这些只是不同的形式,但代表了同一组解决方案(尽管可能针对不同的积分常数值)。您可以使用 checkodesol 函数在 SymPy 中验证 ODE 的解决方案:

    In [9]: import sympy as sp 
       ...: x=sp.Symbol('x') 
       ...: y=sp.Function('y')(x) 
       ...: diffeq=sp.Eq(sp.diff(y,x), (5*x**2-x*y+y**2)/x**2) 
       ...: sol = sp.dsolve(diffeq,y)
    
    In [10]: sol
    Out[10]: 
                     5⋅x          
    y(x) = ───────────────────────
                ⎛        ⎛ 2⎞⎞    
           2⋅tan⎝C₁ - log⎝x ⎠⎠ + 1
    
    In [11]: checkodesol(diffeq, sol)
    Out[11]: (True, 0)
    

    您还可以使用不同的方法来求解 ODE,例如此方法给出与 Wolfram 相同的形式:

    In [12]: dsolve(diffeq, hint='separable_reduced')
    Out[12]: y(x) = x⋅(2⋅tan(C₁ + 2⋅log(x)) + 1)
    

    您可以使用classify_ode查看可能的方法列表:

    In [5]: classify_ode(diffeq)
    Out[5]: 
    ('1st_homogeneous_coeff_best',
     '1st_homogeneous_coeff_subs_indep_div_dep',
     '1st_homogeneous_coeff_subs_dep_div_indep',
     'separable_reduced',
     'lie_group',
     '1st_homogeneous_coeff_subs_indep_div_dep_Integral',
     '1st_homogeneous_coeff_subs_dep_div_indep_Integral',
     'separable_reduced_Integral')
    

    如果您确实想报告 SymPy 中的错误,您会在 GitHub 上打开一个问题,尽管我不认为这是一个错误: https://github.com/sympy/sympy/issues

    【讨论】:

      【解决方案2】:

      长注释:这也可以被视为 Riccati DE,其中一个具有解决方案参数化y(x) = -x^2*u'(x)/u(x)。插入这个

      u(x)*y'(x) = -x^2*u''(x) + x^2*u'(x)^2/u(x) - 2*x*u'(x)
                   = (5*x^2*u(x) + x^3*u'(x) + x^4*u'(x)^2/u(x)) / x^2
      

      然后给出二阶线性DE

      0 = x^2*u''(x) + 3*x*u'(x) + 5*u(x)
      

      这是具有特征多项式0=m*(m-1)+3*m+5=(m+1)^2+4 的 Euler-Cauchy DE。然后,这给出了一般解决方案

       u(x) = A*x^(-1)*cos(2*log(x))+B*x^(-1)*sin(2*log(x))
      

      根据您将参数对 (A,B) 减少为表达式中的一个参数的方式

                  (A-2*B)*cos(2*log(x)) + (2*A+B)*sin(2*log(x))
      y(x) = x * -----------------------------------------------
                        A*cos(2*log(x)) + B*sin(2*log(x))
      

      然后你如何从中构造一个相移参数,你可以得到解决方案的许多表达式。

      【讨论】:

        猜你喜欢
        • 2021-11-25
        • 2022-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多