牛顿型方法是数值求解非线性方程组的标准方法。为了确保他们能够处理这个问题,我尝试在 julia 中使用NLsolve.jl解决您的问题,它似乎工作得很好:
using NLsolve
using LineSearches
using ForwardDiff
function solve(d::Real, μ::Real, β::Real, T::Integer)
@assert 0 < d < 1
@assert 0 < μ + β < 1
n = T + 1
rhs(p₋, p, p₊) = -p + d + (1-d)*p*((1-μ-β)*p+μ*p₊+β*p₋)
function f!(p, val)
val[1] = p[1]
for k = 2:T
val[k] = rhs(p[k-1], p[k], p[k+1])
end
val[n] = p[n] - 1
end
function g!(p, J)
J[1,1] = J[n,n] = 1
for k = 2:T
J[k,k-1:k+1] = ForwardDiff.gradient(x -> rhs(x...), p[k-1:k+1])
end
end
Jₚ = spzeros(n, n)
Jₚ[1,1] = Jₚ[n,n] = 1
for k = 2:T; Jₚ[k,k-1:k+1] = 1; end
p₀ = ones(n) * min(1, d/(1-d))
df = DifferentiableGivenSparseMultivariateFunction(f!, g!, Jₚ)
@time sol = nlsolve(df, p₀, method=:newton, linesearch! = LineSearches.strongwolfe!, show_trace = true)
g!(sol.zero, Jₚ)
@printf "Jacobian condition number: %.2e\n" cond(Array(Jₚ), Inf)
sol
end
我注意到这个案子μ+β≈1这里似乎是最困难的情况,解决方案取决于一个好的初始猜测,因为方程是刚性的,并且在0和T. 所以这不是一个完整的答案,它只适用于非极端情况。
一般来说,不能指望这样一个问题有一个封闭形式的解决方案。此外,Groebner 基础在相对较小的系统上是可行的,而不是像这个系统。确实,这里的雅可比行列式是稀疏的,但这还不够。简单地拥有一个稀疏的非线性方程组并不一定意味着会有一种简单有效的方法来解决它们。
此外,正如关于 MO 的这个问题所提到的,二次方程的多元系统通常是一种非常困难的问题,至少是 NP-hard 并且可能更难。