【发布时间】:2017-04-02 19:06:08
【问题描述】:
我尝试使用 R 中的 nleqslv 函数求解一组非线性方程组。不幸的是,我在猜测正确的初始值以使函数成功运行时遇到了麻烦。我有一个值在 0 和 1 之间的向量,称为 c(t)。它们应满足以下等式
c(t)=A*(exp(-mt)+exp(-m(1024-t)))+B^2
使用 t 的三个后续值,我的目标是使用以下代码确定系数 A、B、m
library(nleqslv)
C10 <- c(1.000000e+00,9.754920e-01,9.547681e-01,9.359057e-01,9.182586e-01,9.014674e-01)
system_size <- 1024
for(i in 2:5)
{
C <- c(C10[i-1],C10[i],C10[i+1],i-2)
#function
target <- function(Coeffs){
y <- numeric(3)
y[1] <- Coeffs[1]*(exp(-Coeffs[2]*(C[4]-1))+exp(-Coeffs[2]*(system_size-(C[4]-1))))+Coeffs[3]^2-C[1]
y[2] <- Coeffs[1]*(exp(-Coeffs[2]*(C[4]))+exp(-Coeffs[2]*(system_size-(C[4]))))+Coeffs[3]^2-C[2]
y[3] <- Coeffs[1]*(exp(-Coeffs[2]*(C[4]+1))+exp(-Coeffs[2]*(system_size-(C[4]+1))))+Coeffs[3]^2-C[3]
y
}
init <- c(0.001,0.01,0)
sol <- nleqslv(init, target,control=list(btol=.01), method="Broyden")
}
使用的初始值反映了我在绘制关联值 c(t) 时得到的结果。尽管如此,生成的输出 sol 给出了
chr "Jacobian is ill-conditioned (1/condition=9.0e-18) (see allowSingular option)"
知道出了什么问题以及如何解决这个问题吗?
OP 编辑:修改代码以具有最小的工作示例:为 C10 添加了前几个值,调整了循环并为 system_size 添加了值
【问题讨论】:
-
奇异雅可比行列式表示初始猜测导致解发散。非线性求解器仅与它们开始时的初始猜测一样有效,因此更改您的初始猜测可能会有所帮助。
-
请提供一个可重现的例子。提供
C10和system_size的值。并仔细检查你的函数方程是否有任何错误。 -
@Bhas 添加了请求的值以获得可重现的示例。
-
@Mislav 虽然最初的猜测没问题,但算法是否也可能失败?
标签: r