fsolve结合pchip求根失败:始终返回初始猜测值问题排查
问题:Scipy fsolve始终返回初始猜测值的求解困境
我需要在网格上求解多方程的根(要求方程在网格点处取值为0),并将所有函数值堆叠为向量。该需求已在Matlab中实现,但在Python中使用fsolve时,无论设置何种初始猜测值,函数始终返回初始猜测值。
补充说明
已定位问题根源,问题出在最大化参数(mu项)上。这些项通过平方转换为平滑函数,但移除这些平方项后代码表现有所改善(仍无法找到根),保留平方项时则始终返回初始猜测值。
相关函数代码
import numpy as np from scipy.interpolate import pchip, Akima1DInterpolator from scipy.interpolate import InterpolatedUnivariateSpline as spline def ap(x, alpha, beta, delta, r, w, kgrid, zgrid, piz): m = len(kgrid) pp1 = pchip(kgrid, x[:m]) pp2 = pchip(kgrid,x[m:2*m]) #pp1 = spline(kgrid, x[:m],k=3) #pp2 = spline(kgrid,x[m:2*m],k=3) res = np.zeros(len(x)) for i in range(m): kp1 = x[i] c = (1 + r - delta) * kgrid[i] + w * zgrid[0] - kp1 kpp1 = pp1(kp1) cp1 = (1 + r - delta) * kp1 + w * zgrid[0] - kpp1 kpp2 = pp2(kp1) cp2 = (1 + r - delta) * kp1 + w * zgrid[1] - kpp2 mu1 = x[i + 2*m] res[i] = c**(-1) - max(mu1, 0)**2 - beta * (1 + r - delta) * (piz[0, 0] * cp1**(-1) + piz[0, 1] * cp2**(-1)) kp2 = x[i + m] c = (1 + r - delta) * kgrid[i] + w * zgrid[1] - kp2 kpp1 = pp1(kp2) cp1 = (1 + r - delta) * kp2 + w * zgrid[0] - kpp1 kpp2 = pp2(kp2) cp2 = (1 + r - delta) * kp2 + w * zgrid[1] - kpp2 mu2 = x[i + 3*m] res[i + m] = c**(-1) - max(mu2, 0)**2 - beta * (1 + r - delta) * (piz[1, 0] * cp1**(-1) + piz[1, 1] * cp2**(-1)) res[i + 2*m] = max(-mu1, 0)**2 - kp1 res[i + 3*m] = max(-mu2, 0)**2 - kp2 return res
函数调用代码
alpha = 0.36 beta = 0.99 delta = 0.025 zgrid = np.array([1.25, 0.75]) piz = np.array([[0.9, 0.1], [0.1, 0.9]]) m = 51 kgrid = np.concatenate((np.linspace(0, 2, 20), np.linspace(2.5, 25, 20), np.linspace(30, 200, 11))) theta = 1.8 r=.034 w = (1-alpha)*(r/alpha)**(alpha/(alpha-1)) x0 = np.zeros(4*m) x0[:m] = kgrid x0[m:2*m] = kgrid x0[2*m:3*m] = -np.sqrt(kgrid) x0[3*m:] = -np.sqrt(kgrid) def to_solve(x): return ap(x, alpha, beta, delta, r, w, kgrid, zgrid, piz) x, f = fsolve(to_solve, x0, full_output=True,xtol=1e-12)[:2]
尝试过的其他调整
data = alpha, beta, delta, r, w, kgrid, zgrid, piz x = fsolve(ap,x0,args=data)
已知初始猜测值并非解(Matlab验证及初始猜测处函数范数约为0.2),怀疑问题与插值或Python特性相关,寻求解决方案。
内容的提问来源于stack exchange,提问作者Peter Kluntz
相关产品推荐
相关产品推荐

