代码之家  ›  专栏  ›  技术社区  ›  gboffi

函数参数内部替换的意外结果

  •  0
  • gboffi  · 技术社区  · 2 年前
    In [4]: from sympy import pi, sin, solve, symbols
       ...: t, w0 = symbols('t omega_0')
       ...: wb = 6*w0
       ...: f = sin(wb*t)
       ...: display(f)
       ...: t1 = solve(wb*t-pi, t)
       ...: display(t1)
       ...: f1 = f.subs({t:t1})
       ...: display(f1)
    sin(6*omega_0*t)
    [pi/(6*omega_0)]
    sin(6*omega_0*t)
    

    我预计替换的值,因为没有更多的自由变量,会是 sin(pi) 或者甚至更好的是, 0 .
    很明显我错过了什么。。。


    暴露于 Oscar Benjamin 在中 answer below t1 是一份清单,事实上,我需要一杯咖啡。

    1 回复  |  直到 2 年前
        1
  •  2
  •   Oscar Benjamin    2 年前

    当我使用最新版本的SymPy运行此代码时,我遇到了一个错误:

    In [4]: f
    Out[4]: sin(6⋅ω₀⋅t)
    
    In [5]: t1 = solve(wb*t-pi, t)
    
    In [6]: t1
    Out[6]: 
    ⎡ π  ⎤
    ⎢────⎥
    ⎣6⋅ω₀⎦
    
    In [7]: f1 = f.subs({t:t1})
    ...
    SympifyError: [pi/(6*omega_0)]
    

    那是因为 t1 是一个列表。请注意,返回列表是因为通常要求解的方程可以有多个解。你应该替换 t 对于 列表中的项目 您可以将其称为 t1[0] :

    In [8]: f1 = f.subs({t:t1[0]})
    
    In [9]: f1
    Out[9]: 0
    

    或者,我建议使用 solve dict=True 参数,使其始终返回dict列表。每个dict都可以直接与一起使用 subs :

    In [10]: t1 = solve(wb*t-pi, t, dict=True)
    
    In [11]: t1
    Out[11]: 
    ⎡⎧    π  ⎫⎤
    ⎢⎨t: ────⎬⎥
    ⎣⎩   6⋅ω₀⎭⎦
    
    In [12]: f.subs(t1[0])
    Out[12]: 0