如何使用 sympy 生成随机数学表达式树?

How to generate random math expression trees with sympy?

我正在网上搜索,但找不到如何使用 sympy 生成随机数学表达式。有可能吗?

我想通过从一组预定义函数和符号中随机选择函数(乘积、求和、余弦...)和符号来构建表达式树。 例如,给定 sum 和 product 的集合 [+,.] 以及符号 [x,y] 我想生成诸如 x+y, (x+y).x, y+(x.x+y)+x等,控制树的深度、宽度和节点数等参数。

有什么提示吗?

类似以下内容可能会帮助您入门:

from random import choice, randint
from sympy import FunctionClass, Add, Mul, cos, sin, binomial, arity, S

def args(n, atoms, funcs):
    a = funcs+atoms
    g = []
    for _ in range(n):
        ai = choice(a)
        if isinstance(ai, FunctionClass):
            g.append(ai(*args(arity(ai), atoms, funcs)))
        else:
            g.append(ai)
    return g

def expr(ops, atoms, funcs=()):
  types = [Add, Mul]
  atoms = tuple(atoms)
  while 1:
    e = S.Zero
    while e.count_ops() < ops:
        _ = choice(types)(*args(randint(1,3), atoms, funcs))
        e = choice(types)(e, _)
        if e is S.NaN: break
    else:
        return e

>>> [expr(5, (-1,0,1,x,y)) for do in range(2)]
[(x - 1)*(2*x + y + 2), x + y*(x + 4*y - 2) + y]
>>> expr(5, (-1,0,1,x,y), (cos, binomial))
x*y**2 + x + cos(1)
>>> expr(5, (-1,0,1,x,y), (cos, binomial))
(y + zoo*binomial(y, x) - 2)*(y + cos(1) + 1)

要生成有理表达式,您可以将第二个 _ arg 更改为 _**choice((1,-1)).