我正在尝试将“ 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:无法将表达式转换为浮点数
答案 0 :(得分:0)
这里的问题是,因为tm[0] == 0
,所以循环的第一迭代中的求值y
是Heaviside(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