1

これが私のスクリプトの内容です:

from sympy import *
x = symbols('x')
init_printing(use_unicode=True)

f = symbols('f', cls=Function)
diffeq = Eq(x**2 * f(x).diff(x, x) + x * f(x).diff(x) - f(x) , 1/((1+x**2)**(3)) )
print dsolve(diffeq, f(x))

このプログラムは、次の出力を返します。

Eq(f(x), (C1*x**2 + C1 + C2*x**4 + C2*x**2 - 15*x**4*atan(x) - 15*x**3 - 18*x**2*atan(x) - 13*x - 3*atan(x))/(16*x*(x**2 + 1)))

しかし、変数を次のdiffeqように定義すると:

diffeq = Eq(f(x).diff(x, x) + f(x).diff(x)/x - f(x)/x**(2) , 1 / ((1+x**2)**(3) * x**(2)) )

次に、出力を受け取ります。

Traceback (most recent call last):
  File "/home/foo/odeSympyTrial01.py", line 12, in <module>
print dsolve(diffeq, f(x))
  File "/usr/lib/python2.7/dist-packages/sympy/solvers/ode.py", line 625, in dsolve
    x0=x0, n=n, **kwargs)
  File "/usr/lib/python2.7/dist-packages/sympy/solvers/deutils.py", line 235, in _desolve
    raise NotImplementedError(dummy + "solve" + ": Cannot solve " + str(eq))
NotImplementedError: solve: Cannot solve Derivative(f(x), x, x) + Derivative(f(x), x)/x - f(x)/x**2 - 1/(x**2*(x**2 + 1)**3)

そして、変数を次のdiffeqように定義すると:

diffeq = Eq(f(x).diff(x, x) * x**(2) + f(x).diff(x) * x**(2) /x - f(x) * x**(2) /x**(2) , 1* x**(2)/((1+x**2)**(3) * x**(2)) )

次に、出力を受け取ります。

Eq(f(x), (C1*x**2 + C1 + C2*x**4 + C2*x**2 - 15*x**4*atan(x) - 15*x**3 - 18*x**2*atan(x) - 13*x - 3*atan(x))/(16*x*(x**2 + 1)))

これらのすべてのケースで、微分方程式diffeqは数学的に等しくなります。したがって、私の意見dsolve()では、各ケースで同じ出力を返す必要があります。dsolve()2番目のケースでエラーが返される理由を誰かが理解するのを手伝ってください。dsolve()がエラーを返さないようにするには、非同次線形常微分方程式をどのように表現すればよいですか?

4

1 に答える 1