我正在尝试将solve_ivp内置函数与雅可比矩阵一起使用。 我收到此错误消息:
UserWarning:以下参数对选定的求解器无效:
jac
。 .format(“,”。join(“{}
”。格式(x)for x in extraneous)))
我不确定它是雅可比矩阵中的语法错误还是错误。
我的一些代码
def MyIntFun(t,y):
return DivWatFlux(y,t,wPar, sPar, RPar,dzIN, dzN)
def jacfunc(t,y):
jac = Richardsmatrix(y, t, wPar, sPar, RPar, dzIN, dzN)
return jac
mt.tic()
hwODE = spi.solve_ivp(MyIntFun, [tout[0], tout[-1]], hw0, method='RK45',
vectorized=True,rtol=1e-4, jac=jacfunc)
mt.toc()
这是雅各比人的代码:
def Richardsmatrix(hw, t, wPar, sPar, RPar, dzIN, dzN): #the jacobian (a,b,c)
K=Kfun(hw, wPar, m)
kRes =RPar.kRobBotR
a = np.zeros(nN)
b = np.zeros(nN)
c = np.zeros(nN)
ii=np.arange(1, nN-1)
a[ii] = K[ii, 0]/(dzIN[ii, 0]*dzN[ii-1, 0]) #middle nodes
a[0] = 0 #a1l is zero and not in matrix
a[nN-1] = K[nN-1, 0] / (dzIN[nN-1, 0] * dzN[nN-2, 0])
b[ii] = -K[ii, 0] / (dzIN[ii,0] * dzN[ii-1,0])- K[ii+1,0] / (dzIN[ii,0] * dzN[ii, 0]) #middle nodes
b[0] = -K[1, 0]/(dzIN[0 , 0]*dzN[0, 0])- kRes / dzIN[0 ,0]
b[nN-1] = -K[nN-1, 0] / (dzIN[nN-1, 0] * dzN[nN-2, 0])
c[ii] = K[ii+1,0] / (dzIN[ii,0] * dzN[ii, 0]) #middle nodes
c[0] = K[1,0] / (dzIN[0, 0] * dzN[0, 0])
c[nN-1] = 0
B = np.diag(a[1:nN], -1)+ np.diag(b, 0) + np.diag(c[0:nN-1], 1)
sB = sp.sparse.csc_matrix(B)
return
我的小组和我在编程方面都很陌生,所以非常感谢任何帮助!
答案 0 :(得分:1)
有两个独立的问题。
首先,当将method='RK45'
传递给solve_ivp
时,求解器(在这种情况下为Runge-Kutta 4/5)无法使用雅可比行列式。尝试传递solver='Radau'
,solver='BDF'
或solver='LSODA'
,因为每个documentation(特别是jac
关键字参数已记录在案,它们都使用Jacobian) )。
我看到的另一个问题是,您拥有的Richardsmatrix
函数具有一个return语句,该语句不返回任何内容。您可能想尝试使用return sB
(假设sB
是您要函数返回的矩阵)。