用sympy中的参数替换数字

时间:2020-01-10 18:15:34

标签: python sympy

我有一些SymPy表达式,格式为:2*x1**2+7*cos(8*x2)+2*Pi(我的代码更长且更复杂,但这足以满足我的问题)。如何将表达式中出现的所有数字转换为参数,例如:a*x1**2+b*cos(c*x2)+d。基本上,我有一个程序可以为我提供适合某些数据的近似函数,但是参数是整数或一些众所周知的数字,例如pi或e(这是我提供的第一个表达式)。然后,我想采用该表达式并对这些数字进行微调(使用梯度下降),以便获得实际参数(可以假设功能形式正确,只需调整参数即可)。例如,最后,正确的等式可能是:2.87*x1**2+6.95*cos(8.05*x2)+6.27。有没有办法做到这一点?谢谢!

1 个答案:

答案 0 :(得分:1)

这有点棘手,因为您说“所有数字”,但是您忽略了指数。在您的示例中,您只用新符号替换了术语中的数字 factors 。为此(并为您提供可行的解决方案),请尝试使用replace,告诉它您正在寻找Mul,然后告诉您要使用Mul时该怎么做:< / p>

from sympy import *
from sympy.abc import x,y

eq=2*x**2+7*cos(8*y)+2*pi

def nfact2dum(m):
    assert m.is_Mul
    nonnum = sift(m.args, lambda i:i.is_number, binary=True)[1]
    return Mul(*([Dummy()] + nonnum))

deq = eq.replace(
    lambda x:x.is_Mul, 
    lambda x: nfact2dum(x))

print(
    deq.subs(list(zip(deq.atoms(Dummy),numbered_symbols('c')))))

output: c0*x**2 + c2*cos(c1*y) + c3
相关问题