Python 类型错误:can';t将表达式转换为浮点,带符号x,多项式插值

Python 类型错误:can';t将表达式转换为浮点,带符号x,多项式插值,python,numpy,sympy,Python,Numpy,Sympy,我试图运行以下代码,但在S[I][0]行出现错误 TypeError:无法将表达式转换为浮点 我确信我的变量D[][],h[],age[],A[],B[]和n都正常(它们是浮动)。我认为这与符号数字x有关 最后,S应该是多项式的(7,1)向量 import numpy as np import sympy as sp age = np.arange(15,55,5) N = np.array([0, 7.442, 26.703, 41.635, 49.785, 50.209, 50.226]

我试图运行以下代码,但在
S[I][0]
行出现错误

TypeError:无法将表达式转换为浮点

我确信我的变量
D[][]
h[]
age[]
A[]
B[]
n
都正常(它们是浮动)。我认为这与符号数字
x
有关

最后,
S
应该是多项式的(7,1)向量

import numpy as np
import sympy as sp
age = np.arange(15,55,5)  
N = np.array([0, 7.442, 26.703, 41.635, 49.785, 50.209, 50.226])
n = len(N)

h = np.zeros(n)
for i in range(n) :
    h[i] = age[i+1] - age[i]

mu = np.zeros(n)
lamda = np.zeros(n)
F = np.zeros((n,1))
A = np.zeros(n)
B = np.zeros(n)

for i in range(n) :
    mu[i] = h[i-1]/(h[i]+h[i-1])
    lamda[i] = h[i]/(h[i]+h[i-1])
    F[i][0] = (6*(N[i]*h[i-1] - h[i]*N[i-1]))/((h[i]+h[i-1])*h[i]*h[i-1])   

M = 2*np.eye(n,n) + 0.5*np.diag(np.ones((n-1)),1)+ 0.5*np.diag(np.ones((n-1)),1).T

D = np.dot(np.linalg.inv(M),F)

for i in range(n-1) :
    A[i] = (N[i+1] - N[i])/h[i] - (h[i]*(D[i+1][0] - D[i][0]))/6
    B[i] = N[i] - (((h[i])**2)*D[i][0])/6

def s(D, h, age, A, B, n) :
    S = np.zeros((n,1))
    x = sp.Symbol("x")
    for i in range(n) :
        S[i][0] = (D[i+1][0]*((x - age[i])**3))/(6*h[i]) - (D[i][0]*((x - age[i+1])**3))/(6*h[i]) + (A[i])*(x - age[i]) + B[i]
    return sp.simplify(S)


S = s(D, h, age, A, B, n)

问题是,虽然大多数变量都是浮点数,
x
是符号的,这导致所有这些计算最终都是符号对象。这些对象是在python级别通过类处理的,而numpy需要数字,因此它尝试对其应用
float()
。比如说,

>> float(sp.Add(1, 1))
2.0

>> float(s.Add(1 + x))
Traceback (most recent call last):
  File "<pyshell#85>", line 1, in <module>
    float(sp.Add(1, x))
  File "C:\Users\ip507\AppData\Local\Programs\Python\Python36\lib\site-packages\sympy\core\expr.py", line 239, in __float__
    raise TypeError("can't convert expression to float")
TypeError: can't convert expression to float

话虽如此,您有一个错误,它会导致
索引器
D
的形状为(7,1),但您可以调用
D[i+1]
。因为我不知道你的意图,所以你需要解决这个问题。

好的,谢谢。在'def
前面有一个空格,因此代码不会运行。接下来,最后一行有一个名为
x`的未引用变量,因此代码不会运行。还有:为什么不遵守Python的代码格式化规则呢?如果你使用了一个好的编辑器(像PyCharm这样的IDE),你只需点击一下,但是每个试图运行你的代码的人只需点击一下。此外,结尾的注释代码似乎不相关。删除它。问题是,
x
参与了长时间的计算,结果是符号化的,而numpy需要一些数字。你说你想要
S
成为一个向量。你真的打算用它做向量计算,还是想要一个通用的“类似数组”的容器,比如列表?如果你告诉我,我可以向你展示一个合适的解决方案。顺便说一句,当有人要求你提供一个最小的例子时,你不必展示你的实际代码。一个简单的
age=np.random.randn(8)
就足够了。其他变量也一样。我们不关心计算是否正确,我们只需要一些具体的东西来复制粘贴,这样我们就可以复制错误并进行调查。谢谢,是的,列表是可以的,我只想在最后画出函数。每行S将以不同的间隔绘制。比如在x=[15,20]的区间上画的S[0][0]等等……太好了,谢谢。是的,我刚刚加上D[n+1]=0。我有一些维度问题。
def s(D, h, age, A, B, n):
    x = sp.Symbol("x")
    S = []
    for i in range(n):
        S.append((D[i+1][0]*((x - age[i])**3))/(6*h[i]) - (D[i][0]*((x - age[i+1])**3))/(6*h[i]) + (A[i])*(x - age[i]) + B[i])
    return S