以下是我的剧本内容:
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))
此程序返回以下输出:
^{pr2}$但是当我像这样定义变量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)) )
然后我收到输出:
^{pr2}$在每一种情况下,微分方程diffeq
在数学上是相等的。因此,在我看来,dsolve()
应该为每种情况返回相同的输出。有人请帮助我理解为什么dsolve()
在第二种情况下返回错误。如何表达非齐次线性常微分方程以确保dsolve()
不返回错误?在
简而言之:交响乐模块的逻辑通常是幼稚的,有时甚至是错误的。在
正如最初写的,用
{x的幂次也叫做^的幂次。SymPy检测到这种结构并应用适当的方法。但是如果你除以
^{pr2}$x**2
现在不是这样了:二阶导数没有
x**2
的幂,所以匹配失败。更仔细的检查可以在这里检测到潜在的Cauchy-Euler结构,但这并没有实现,我们可以通过查看source看到。在你可以确认这确实是怎么回事
在第一种情况下,它将返回“第n个线性euler_eq_非齐次_变差”而不是第二种情况。在
在看来源的同时,我们也可以看到一个错误逻辑的例子。在
例如,
x**2*sin(x)
将通过顺序为2的检查,这意味着SymPy将把x**2*sin(x)*f(x).diff(x, x) - f(x) = 0
错误地用于Euler方程。事实上“解”错了方程。不要相信来自SymPy的颂歌解决方案。在
相关问题 更多 >
编程相关推荐