无法将表达式转换为浮点问题

时间:2019-06-16 06:44:43

标签: python-3.x

我正在尝试将“ 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:无法将表达式转换为浮点数

3 个答案:

答案 0 :(得分:0)

这里的问题是,因为tm[0] == 0,所以循环的第一迭代中的求值yHeaviside(0),默认情况下它没有定义的实际值(请参阅{{3 }})。这是因为你有

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)

答案 1 :(得分:0)

使用y_val = np.zeros(len(tm)),数组的默认数据类型为float。修改代码后,您发现y_val元素之一是object,而不是浮点数。您可以使用列表对象作为占位符,也可以将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]

答案 2 :(得分:0)

我有类似的问题,您的答案对我有用,但是我仍然需要将数据放入图表中。.我针对以下问题修改了我的问题:

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