Использованиеsolve_ivp внутри root или fsolve дает ValueError: установка элемента массива с последовательностьюPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Использованиеsolve_ivp внутри root или fsolve дает ValueError: установка элемента массива с последовательностью

Сообщение Anonymous »

Мне нужно решить систему уравнений с определенным параметром p, а затем найти значение p, которое даст мне желаемые результаты. Мой код выглядит так (в упрощенном варианте)

Код: Выделить всё

import numpy as np
from scipy.integrate import solve_ivp
from scipy.optimize import root

def system(t, y, alpha):
phi, psi, N = y
dphi_dt = psi
dpsi_dt = -3 * H(phi, psi, alpha) * psi - dV_dphi(phi, alpha)
dN_dt = H(phi, psi, alpha)
return [dphi_dt, dpsi_dt, dN_dt]

# initial conditions
psi0 = -dV_dphi(phi0, alpha)/(3*H(phi0,0, alpha))  # Initial value of psi
N0 = 0.0    # Initial value of N

# time span
t0 = 0
dt = 0.01  # Time step
t = t0

# Initialize lists to store the results
t_values = [t0]
phi_values = [phi0]
psi_values = [psi0]
N_values = [N0]

# Initial conditions
y = [phi0, psi0, N0]

# Solve the system of differential equations for one step
sol = solve_ivp(system, [t, t+dt], y, args=(alpha,))
y = sol.y[:, -1]
t = sol.t[-1]

# Extract solutions
phi, psi, N = y

# calculate extra info
# save data into a dictionary (containing lists) e.g.
data = {'H':[1,2,3,4,5]}
return data
Этот код работает отлично и дает желаемые результаты.
Позже мне нужно исправить параметр альфа и найти, какие данные phi0 дает мне Например, ['H'][0] == h. Я использую

Код: Выделить всё

def H(phi0):
data = inflate(phi0, alpha)
p = data['H'][0] - h
return p

sol = root(H, 10.0)
где data['H'] — это один из списков, которые я рассчитывал ранее. Функция H возвращает число, как и ожидалось. При вызове root (или fsolve, результат тот же) код вызывает inflate, который затем вызываетsolve_ivp. В этот моментsolve_ivp жалуется на:

Код: Выделить всё

def check_arguments(fun, y0, support_complex):
5     """Helper function for checking arguments common to all solvers."""
----> 6     y0 = np.asarray(y0)

ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (3,) + inhomogeneous part.
Вызов функции инфляции даже не достигает точки возврата. solve_ivp не завершается ни разу. Насколько я понимаю, каким-то образом внутри итерацийsolve_ivp последовательность передается в качестве аргумента внутри начальных условий y0. Это происходит только тогда, когдаsolve_ivp вызывается внутри root, а не если я вызываюsolve_ivp отдельно.
Я понятия не имею, почему это происходит и как это решить. Любая помощь приветствуется
Я пробовал изменить root на fsolve иsolve_ivp на odeint. Была возвращена та же ошибка при установке элемента массива с последовательностью. но источник ошибки был другой. Я также попытался убедиться, что функция H работает правильно и возвращает число, и это действительно так. Прочитав документацию, я уверен, что ошибка возникает, когдаsolve_ivp вызывается внутри инфляции. Функция inflate никогда не достигает точки возврата, поэтому внутри root выполняется только одна итерация. Я уверен, чтоsolve_ivp работает правильно внутри инфляции, поскольку дает желаемые результаты. Проблема возникает только тогда, когда она вызывается внутри root.
Я попробовал изменить методsolve_ivp, но некоторые методы выдали ту же ошибку, в то время как другие заняли так чертовски много времени, что я сдался .

Подробнее здесь: https://stackoverflow.com/questions/788 ... ay-element
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»