【问题标题】:Replacing numbers with parameters in sympy用 sympy 中的参数替换数字
【发布时间】:2020-01-11 03:45:10
【问题描述】:

我有一些形式的 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。有没有办法做到这一点?谢谢!

【问题讨论】:

    标签: python sympy


    【解决方案1】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多