我正在尝试同时为R中的a
和b
解决以下两个等式:
0.1 = a /(1+a) * 0.9639 + a(1+b) / (1+a(1+b)) * 0.0324 + a(1+b)^2 / (1+a(1+b)^2) * 0.0036 + a(1+b)^4 / (1+a(1+b)^4) * 0.0001
0.03 = [(a/(1+a)-0.1)^2 * 0.9639 + (a(1+b) / (1+a(1+b))-0.1)^2 * 0.0324 +(a(1+b)^2 / (1+a(1+b)^2)-0.1)^2 * 0.0036 + (a(1+b)^4/(1+a(1+b)^4)-0.1)^2*0.0001]/0.09
我尝试使用rootSolve包找到解决方案并收到错误消息。
我使用的代码如下:
library(rootSolve)
model=function(x){
f1=((x[1]/(1+x[1]))*0.9639+((x[1]*(1+x[2]))/(1+x[1]*(1+x[2])))*0.0324+((x[1]*(1+x[2])^2)/(1+x[1]*(1+x[2])^2))*0.0036+(x[1]*(1+x[2])^4)/(1+x[1]*(1+x[2])^4)*0.0001)-0.1
f2=(((x[1]/(1+x[1])-0.1)^2*0.9639+(x[1]*(1+x[2])/(1+x[1]*(1+x[2]))-0.1)^2*0.0324+(x[1]*(1+x[2])^2/(1+x[1]*(1+x[2])^2)-0.1)^2*0.0036+(x[1]*(1+x[2])^4/(1+x[1]*(1+x[2])^4)-0.1)^2*0.0001)/0.09)-0.03
c(f1=f1,f2=f2)
}
solution=multiroot(f=model, start=c(1,1))
答案 0 :(得分:2)
修复(并稍微整理)你的模型功能:
model=function(x){
f1=((x[1]/(1+x[1]))*0.9639+
((x[1]*(1+x[2]))/(1+x[1]*(1+x[2])))*0.0324 +
((x[1]*(1+x[2])^2)/(1+x[1]*(1+x[2])^2))*0.0036+
(x[1]*(1+x[2])^4)/(1+x[1]*(1+x[2])^4)*0.0001)-0.1
f2=(((x[1]/(1+x[1])-0.1)^2*0.9639 +
(x[1]*(1+x[2])/(1+x[1]*(1+x[2]))-0.1)^2*0.0324 +
(x[1]*(1+x[2])^2/(1+x[1]*(1+x[2])^2)-0.1)^2*0.0036+
(x[1]*(1+x[2])^4/(1+x[1]*(1+x[2])^4)-0.1)^2*0.0001)/0.09)-0.03
c(f1=f1,f2=f2)
}
我可以毫无错误地运行multiroot
:
> multiroot(model,start=c(1,1))
diagonal element is zero
[1] 2
$root
[1] -1.827359e+00 1.749761e+06
$f.root
f1 f2
2.065032 47.916572
$iter
[1] 3
$estim.precis
[1] 24.9908
Warning messages:
1: In stode(y, time, func, parms = parms, ...) :
error during factorisation of matrix (dgefa); singular matrix
2: In stode(y, time, func, parms = parms, ...) : steady-state not reached
但警告告诉我它可能找不到真正的解决方案。对于这些问题,您必须尝试使用起始值,尤其是因为您的问题非常非线性。在尝试调用model(c(a,b))
以获取a
和b
的各种值以查看我可能找到零的方向之后,我点击了这个:
> multiroot(model,start=c(.1,3.5))
$root
[1] 0.09989584 3.44808411
$f.root
f1 f2
-6.647460e-13 3.676781e-13
$iter
[1] 3
$estim.precis
[1] 5.162121e-13
没有任何警告,声称非常接近于零。您的答案位于$root
部分。
可能还有其他解决方案 - 你的x[2]
最多可达4个,所以这可能意味着四个解决方案(其中一些可能是复数)。
如果你能得到一个代数系统来精确求解方程式(用常数替换你的十进制数)那么你可能会得到一个封闭形式的解决方案。