You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 03:17:06