如何在r中计算这个联立方程

时间:2014-05-27 06:55:56

标签: r

我正在尝试同时为R中的ab解决以下两个等式:

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))

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))以获取ab的各种值以查看我可能找到零的方向之后,我点击了这个:

> 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个,所以这可能意味着四个解决方案(其中一些可能是复数)。

如果你能得到一个代数系统来精确求解方程式(用常数替换你的十进制数)那么你可能会得到一个封闭形式的解决方案。