Ошибка типа: невозможно преобразовать выражение в число с плавающей запятой, с символами c x, полиномиальной интерполяцией - PullRequest
0 голосов
/ 21 марта 2020

Я пытаюсь запустить следующий код, но в строке с S[i][0].

появляется ошибка: TypeError: невозможно преобразовать выражение в число с плавающей точкой

Я уверен, что мои переменные D[][], h[], age[], A[], B[] и n в порядке (они являются числами с плавающей запятой). Я думаю, что это как-то связано с символами c figure 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)

1 Ответ

0 голосов
/ 21 марта 2020

Проблема в том, что, хотя большинство ваших переменных являются числами с плавающей запятой, x является символом c, что приводит к тому, что все эти вычисления в конце становятся символом c объектом. Такие объекты обрабатываются на уровне 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

Поскольку вы не собираетесь использовать вычисления с «массивоподобным» объектом S, это может быть просто список, в котором вы собираете выражения.

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

Сказав это, у вас есть ошибка, которая вызывает IndexError. D имеет форму (7, 1), но вы звоните D[i+1]. Это то, к чему вам нужно обратиться, поскольку я не знаю ваших намерений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...