从ODE求解器调用非线性方程求解器时,解决不匹配形状误差

时间:2018-09-19 10:16:59

标签: python scipy shapes mismatch odeint

我的函数“ par_impl(y)”中有一个由两个非线性方程组成的系统,可以单独使用scipy.optimize.root进行求解。这里的“ y”是一个参数。 但是我希望从ODE求解器odeint调用此系统,以便针对不同的“ y”值与简单的ODE耦合来求解该系统。 这使我解决了形状不匹配的错误。

  

将numpy导入为np

     

from scipy.optimize import root import

     

matplotlib.pyplot as plt

     

来自scipy.integrate导入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”,   _check_func中的第41行       引发TypeError(msg)

     

TypeError:fsolve:输入和输出之间不匹配   'func'参数'functionh'的形状。形状应为(2,)但它   是(2,1)。

1 个答案:

答案 0 :(得分:0)

问题是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