【问题标题】:can't convert expression to float problem无法将表达式转换为浮点问题
【发布时间】:2019-10-30 04:27:29
【问题描述】:

我正在尝试将“subs”函数用于微分方程 但我收到错误:“无法将表达式转换为浮点数”

我试图检查数组的类型,但它们都是浮动的

import sympy as sym
from sympy.integrals import inverse_laplace_transform
from sympy.abc import s,t,y
import numpy as np

U = 1
G =(s+1)/(s*(s+2))
Y = G*U
y = inverse_laplace_transform(Y, s, t)
tm = np.linspace(0,2,3)
y_val = np.zeros(len(tm))
for i in range(len(tm)):
    y_val[i] = y.subs(t, tm[i])

print(y)
print(y_val)

第 17 行 y_val[i] = y.subs(t, tm[i]) TypeError: 无法将表达式转换为浮点数

【问题讨论】:

    标签: python-3.x


    【解决方案1】:

    这里的问题是,因为tm[0] == 0,在循环的第一次迭代中评估的yHeaviside(0),默认情况下它没有定义的实际值(参见https://docs.sympy.org/latest/modules/functions/special.html#heaviside)。这是因为你有

    from sympy.functions import exp, Heaviside
    assert y == Heaviside(t) / 2 + exp(-2 * t) * Heaviside(t) / 2
    

    这里最简单的解决方法是定义一个不包括0 的线性空间,例如

    epsilon = 1e-15
    tm = np.linspace(epsilon, 2, 3)
    

    【讨论】:

      【解决方案2】:

      使用y_val = np.zeros(len(tm)),数组的默认数据类型为float。修改代码后发现y_val元素之一是object,不是float。您可以使用列表对象作为占位符,也可以将numpy 数组的数据类型指定为object

      import sympy as sym
      from sympy.integrals import inverse_laplace_transform
      from sympy.abc import s,t,y
      import numpy as np
      
      U = 1
      G =(s+1)/(s*(s+2))
      Y = G*U
      y = inverse_laplace_transform(Y, s, t)
      tm = np.linspace(0,2,3)
      # y_val = [0 for _ in range(len(tm))]
      y_val = np.zeros(len(tm), dtype=object)
      for i in range(len(tm)):
          y_val[i] = y.subs(t, tm[i])
      
      print(y_val)
      

      结果:[Heaviside(0.0) 0.567667641618306 0.509157819444367]

      【讨论】:

        【解决方案3】:

        我有类似的问题,你的答案对我有用,但我仍然需要将数据放入图表中。我针对这个问题修改了我的问题:

        import sympy as sym
        from sympy.integrals import inverse_laplace_transform
        from sympy.abc import s,t,y
        import numpy as np
        import matplotlib.pyplot as plt
        
        Y = (5*(1 - 5*s))/(s*(4*(s**2) + s + 1))*(1/s)
        
        y = inverse_laplace_transform(Y, s, t)
        tm = np.linspace(1e-15, 20, 100)
        
        y_val = np.zeros(len(tm), dtype=object)
        for i in range(len(tm)):
            y_val[i] = y.subs(t, tm[i])
        
        plt.plot(y_val, tm)
        plt.show()
        

        运行这段代码我得到了同样的错误:

        TypeError: can't convert expression to float
        

        【讨论】:

        • 欢迎来到 SO!请不要在问题中添加其他问题(尤其是旧问题):打开一个新问题,如果有用,请链接到另一个问题。
        猜你喜欢
        • 1970-01-01
        • 2020-12-26
        • 1970-01-01
        • 1970-01-01
        • 2020-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-14
        相关资源
        最近更新 更多