我的函数“ 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)。
答案 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()
输出