如何使用 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))
.
我正在网上搜索,但找不到如何使用 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))
.