python - разная длина массива по оси интерполяции?

Я пытаюсь использовать функцию интерполяции Python, чтобы получить значение y для данного x, но я получаю сообщение об ошибке «raise ValueError («массивы x и y должны быть равны по длине вдоль оси интерполяции», хотя мои массивы имеют равные размер и форма (согласно тому, что я получаю, когда использую .shape в своем коде). Я совсем новичок в программировании, поэтому я не знаю, как проверить, что еще может отличаться в моих массивах. Вот мой код:

s = []

def slowroll(y, t):

    phi, dphi, a = y
    h = np.sqrt(1/3. * (1/2. * dphi**2 + 1/2.*phi**2))
    da = h*a
    ddphi = -3.*h*dphi - phi

    return [dphi,ddphi,da]


phi_ini = 18.
dphi_ini = -0.1
init_y = [phi_ini,dphi_ini,1.]
h_ini =np.sqrt(1/3. * (1/2. * dphi_ini**2. + 1/2.*phi_ini**2.))

t=np.linspace(0.,20.,100.)

from scipy.integrate import odeint

sol = odeint(slowroll, init_y, t)

phi = sol[:,0]
dphi = sol[:,1]
a=sol[:,2]
n=np.log(a)
h = np.sqrt(1/3. * (1/2. * dphi**2 + 1/2.*phi**2))

s.extend(a*h)
x = np.asarray(s)
y = np.asarray(t)
F = interp1d(y, x, kind='cubic') 

print F(7.34858263)

person user6518967    schedule 19.08.2016    source источник


Ответы (1)


После добавления необходимого импорта мне не удалось воспроизвести вашу ошибку с версией 2.7.12. Какую версию питона вы используете?

import numpy as np
from scipy.interpolate import interp1d

s = []

def slowroll(y, t):

    phi, dphi, a = y
    h = np.sqrt(1/3. * (1/2. * dphi**2 + 1/2.*phi**2))
    da = h*a
    ddphi = -3.*h*dphi - phi

    return [dphi,ddphi,da]


phi_ini = 18.
dphi_ini = -0.1
init_y = [phi_ini,dphi_ini,1.]
h_ini =np.sqrt(1/3. * (1/2. * dphi_ini**2. + 1/2.*phi_ini**2.))

t=np.linspace(0.,20.,100.)

from scipy.integrate import odeint

sol = odeint(slowroll, init_y, t)

phi = sol[:,0]
dphi = sol[:,1]
a=sol[:,2]
n=np.log(a)
h = np.sqrt(1/3. * (1/2. * dphi**2 + 1/2.*phi**2))

s.extend(a*h)
x = np.asarray(s)
y = np.asarray(t)
F = interp1d(y, x, kind='cubic') 

print F(7.34858263)

Выход: 2.11688518961e+20

person nanoPhD    schedule 19.08.2016
comment
Интересно.... Я тоже не получаю ошибок, но результат немного другой >>> 2.02845299116e+20 - person Aaron; 19.08.2016
comment
Действительно интересно... Мой предыдущий запуск был на моей машине с Windows под управлением 2.7.12. Если я запущу его на своей Ubuntu 14.04 с Python версии 2.7.6, я получу >>>2.09312088926e+20. Мои версии scipy 0.17.0 и 0.13.3 соответственно. Должно быть связано с небольшими изменениями фактической функции интерполяции. - person nanoPhD; 19.08.2016
comment
Спасибо вам обоим! У меня была предпоследняя строка в другом месте в моем реальном проекте, и когда я услышал, что она работает для вас, я изменил ее на приведенную выше, и теперь она работает! Но я понял, что приведенный выше код дает мне x, когда я даю ему y, но я хочу обратное. Когда я меняю местами y и x в приведенном выше коде, я получаю еще одну ошибку numpy.linalg.linalg.LinAlgError: сингулярная матрица. Есть идеи по этому поводу? - person user6518967; 20.08.2016