SymPy中的功能

F.N*_*N.B 2 python sympy

我是Python对象的新手,并且有很多问题.我需要将一个函数传递给我的对象,然后评估该函数.代码类似于:

from sympy import var

class eval:
    def __init__(self, M):
        self.M = M

    def fun(self, x):
        M = self.M
        print M(x)

x = var('x')

ak = eval(x+2)
ak.fun(x)
Run Code Online (Sandbox Code Playgroud)

这是错误:

TypeError
Traceback (most recent call last)
(ipython-input-1-b7ef311bd1f0> in <module)()
     12 
     13 ak = eval(x+2)
---> 14 ak.fun(x)

(ipython-input-1-b7ef311bd1f0) in fun(self, x)
      7     def fun(self, x):
      8         M = self.M
----> 9         print M(x)
     10 
     11 x = var('x')

TypeError: 'Add' object is not callable
Run Code Online (Sandbox Code Playgroud)

Kra*_*nov 10

我是Python对象的新手......

有问题很好,但SymPy背后的对象和类非常复杂,并且在深入研究这样一个库之前学习Python对象模型的基础知识是强烈鼓励的.

建议的代码存在许多问题:

纯语言相关的错误

  • eval 是内置的,所以覆盖它是不好的风格
  • 使用旧式课程

使用SymPy就好像它是一些语言扩展

SymPy 没有提供创建python函数的新语法.尤其(x+2)(4)打算给你6.如果你想要这只是在myfun = lambda _: _+2; fun(4)不使用SymPy的情况下编写.

x+2是一个SymPy对象(Add(Symbol('x')+Integer(2))),而不是一些python AST.你可以用x其他东西代替,(x+2).subs(x,y)但你不能指望图书馆神奇地知道你在Symbol('x')写作时有一些特别的东西(x+2)(4).你也可以写blah = Symbol('random_string'); (blah+2)(4).

轻微的SymPy错误

var是一个用于创建Symbol对象的辅助函数,但它用于在解释器中进行交互式使用.不要在库代码中使用它,因为作为副作用,它会在命名空间中注入全局变量.只是用Symbol('x').

现在关于x+2可赎回

在0.7.2中实现了递归调用.这意味着您可以创建Expr包含未评估的符号对象的SymPy 树,并将整个树应用于另一个对象,调用向内传播,直到所有未评估的对象都被替换为已评估的对象.我想上面的描述并不清楚,所以这里有一个例子:

您想要创建一个D可以执行以下操作的差分运算符对象:

>>> op = g(y)*D # where g is Function and y is Symbol
>>> op(f(x))
g(y)*f(x).diff(x)
Run Code Online (Sandbox Code Playgroud)

这种方法的工作方式是沿着树(Mul(g(y), D)在这种情况下),跳过评估的符号对象并评估未评估的符号对象.

因为很多SymPy的用户在阅读数据模型之前就开始使用它,这引起了很多混乱,所以我们将递归调用方案移到了rc方法中.在0.7.3 (x+2)(4)中将再次引发错误.