Python Scipy优化误差

Python Scipy优化误差,python,optimization,scipy,odeint,Python,Optimization,Scipy,Odeint,我想用Python解决ODE的一个相当简单的参数估计问题。我一直在使用odeint函数求解ODE,使用scipy.optimize库查找参数。当我单独使用odeint函数时,没有问题,但是通过scipy.optimize它给了我一个错误RuntimeError:func返回的数组必须是一维的,但是得到ndim=2 我不认为这是一个重复,因为我可以独立运行odeint解算器 代码如下: import numpy as np from scipy.integrate import odeint fr

我想用Python解决ODE的一个相当简单的参数估计问题。我一直在使用odeint函数求解ODE,使用scipy.optimize库查找参数。当我单独使用odeint函数时,没有问题,但是通过scipy.optimize它给了我一个错误RuntimeError:func返回的数组必须是一维的,但是得到ndim=2

我不认为这是一个重复,因为我可以独立运行odeint解算器

代码如下:

import numpy as np
from scipy.integrate import odeint
from scipy.optimize import minimize

init = [0,0]
t_end = 5
dt = 0.01
tspan = np.arange(0,t_end+dt,dt)

def my_fun(y,t,K):
    if t<=0.07:
        s = 2000
    else:
        s = 0
    return np.array([s+3.6*(y[1]-y[0]) +K*y[0], 0.38*y[0]-0.48*y[1] +K*y[1]])

def solver(t,p2):    
    y_ode = odeint(my_fun,init,t,args = (p2,))
    return y_ode

test = solver(tspan,0.01)
print(test)

y_real = solver(tspan, 0.1)

def err_fun(p):
    return np.sum((y_real-solver(tspan,p))**2)


print(err_fun(0.01))      
c0 = [0.2]

optim = minimize(err_fun,c0,method='Nelder-Mead')
将numpy导入为np
从scipy.integrate导入odeint
从scipy.optimize导入最小化
init=[0,0]
t_end=5
dt=0.01
tspan=np.arange(0,t_end+dt,dt)
定义我的乐趣(y、t、K):

如果t问题是
minimize
调用
err\u fun
,参数是长度为1的一维数组
err_-fun
将其传递给
solver
,而
solver
将其传递给
odeint
,后者将其作为
K
参数传递给
my_-fun
。当
K
为标量或长度为1的数组时,请查看
my_fun
输出形状的差异:

In [43]: my_fun([1, 2], 0, 0.05)  # K is a scalar.
Out[43]: array([ 2.00365e+03, -4.80000e-01])

In [44]: my_fun([1, 2], 0, np.array([0.05]))  # K is an array.
Out[44]: 
array([[ 2.00365e+03],
       [-4.80000e-01]])
K
是长度为1的一维数组时,
my_-fun
返回一个形状为(2,1)的数组。这不是
odeint
所期望的

要解决这个问题,您必须将该数组转换为调用链中的某个标量。例如,您可以在
err_fun
中立即执行此操作,方法如下:

def err_fun(p):
    if not np.isscalar(p):
        p = p[0]
    return np.sum((y_real-solver(tspan,p))**2)
当我这样做并运行您的脚本时,代码工作正常。下面是我为optim所得到的:

In [46]: optim
Out[46]: 
 final_simplex: (array([[0.1       ],
       [0.09999512]]), array([2.95795174e-22, 4.03900365e-05]))
           fun: 2.9579517415523713e-22
       message: 'Optimization terminated successfully.'
          nfev: 34
           nit: 17
        status: 0
       success: True
             x: array([0.1])