fsolve несоответствие формы ошибки при вызове решателя нелинейных уравнений из ODE solver - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть система из двух нелинейных уравнений внутри моей функции "par_impl (y)", которую я могу решить с помощью автономного scipy.optimize.root.Здесь «у» является параметром.Но я бы хотел, чтобы эта система была вызвана из odeint решателя ODE, чтобы решить ее для другого значения "y", связанного с простым ODE.Это дает мне ошибку формы несоответствия fsolve.

import numpy as np

из scipy.optimize import root import

matplotlib.pyplot as plt

из scipy.integrate import odeint

def par_impl (y):

def functionh(x):
    return [y + (x[0]**2) - x[1] -23, -4 - y*x[0] + (x[1]**2)]
sol = root(functionh, [1, 1])

return sol.x

def dy_dt (y, t):

dydt = (y**0.5) + par_impl(y)[0]

return dydt    

ls = np.linspace(0, 2, 50) y_0 = 2

Ps = odeint (dy_dt, y_0, ls)

y = Ps [:, 0]

plt.plot (ls, y, "+", label = "X") plt.legend ();plt.figure ()

Полученная ошибка:

Файл "C: \ Users \ matteo \ AppData \ Local \ Continuum \ anaconda3 \ lib \ site"-packages \ scipy \ optimize \ minpack.py ", строка 41, в _check_func повысить TypeError (msg)

TypeError: fsolve: существует несоответствие между формой ввода и вывода функции 'func' аргумент 'h'. Форма должна быть (2,), но это (2, 1).

1 Ответ

0 голосов
/ 19 сентября 2018

Проблема заключалась в том, что y был списком len = 1 в вашем коде.Чтобы получить доступ к его элементу, вам нужно y[0] в вашей функции.Ниже приведена рабочая версия вашего кода (не показывает весь код) с выходным графиком.

from scipy.optimize import root
from scipy.integrate import odeint
# Other plotting and numpy imports

def par_impl(y):
    def functionh(x):
        return [y[0] + (x[0]**2) - x[1] -23, -4 - y[0]*x[0] + (x[1]**2)] # y --> y[0]
    sol = root(functionh, ([1, 1]))
    return sol.x

# dy_dt function here  

# Rest of your code unchanged

plt.plot(ls, y, "+", label="X") 
plt.legend()

Выход

enter image description here

...