我正在尝试nls
拟合一个有点复杂的表达式,其中包括两个积分,其中两个拟合参数在其上限。
我得到了错误
“nlsModel(formula, mf, start, wts) 中的错误:初始参数估计时的奇异梯度矩阵。
我已经在以前的答案中搜索过,但没有帮助。参数初始化似乎没问题,我尝试更改参数但没有任何效果。如果我的函数只有一个积分,那么一切都很好,但是当添加第二个积分项时就会出错。我不相信该函数被过度参数化,因为我已经使用更多参数执行了其他拟合并且它们起作用了。下面我写了一个包含一些数据的列表。
最小的例子如下:
integrand <- function(X) {
return(X^4/(2*sinh(X/2))^2)
}
fitting = function(T1, T2, N, D, x){
int1 = integrate(integrand, lower=0, upper = T1)$value
int2 = integrate(integrand, lower=0, upper = T2)$value
return(N*(D/x)^2*(exp(D/x)/(1+exp(D/x))^2
)+(448.956*(x/T1)^3*int1)+(299.304*(x/T2)^3*int2))
}
fit = nls(y ~ fitting(T1, T2, N, D, x),
start=list(T1=400,T2=200,N=0.01,D=2))
------>作为参考,适合的工作如下:
integrand <- function(X) {
return(X^4/(2*sinh(X/2))^2)
}
fitting = function(T1, N, D, x){
int = integrate(integrand, lower=0, upper = T1)$value
return(N*(D/x)^2*(exp(D/x)/(1+exp(D/x))^2 )+(748.26)*(x/T1)^3*int)
}
fit = nls(y ~ fitting(T1 , N, D, x), start=list(T1=400,N=0.01,D=2))
-------->数据说明问题:
dat<- read.table(text="x y
0.38813 0.0198
0.79465 0.02206
1.40744 0.01676
1.81532 0.01538
2.23105 0.01513
2.64864 0.01547
3.05933 0.01706
3.47302 0.01852
3.88791 0.02074
4.26301 0.0256
4.67607 0.03028
5.08172 0.03507
5.48327 0.04283
5.88947 0.05017
6.2988 0.05953
6.7022 0.07185
7.10933 0.08598
7.51924 0.0998
7.92674 0.12022
8.3354 0.1423
8.7384 0.16382
9.14656 0.19114
9.55062 0.22218
9.95591 0.25542", header=TRUE)
我无法弄清楚发生了什么。我需要为三个整体组件执行此拟合,但即使是两个我也有这个问题。我非常感谢你的帮助。谢谢你。