r-求解50个非线性方程的系统 - fn中的错误(PAR,..):缺少参数



我正在尝试求解50个非线性方程的系统:

给定一个载体y,其中包含49个不同的值,我想在另一个向量中将这49个值传输到略有不同的值中,例如:

log(x[1], y[1]) = n
...
log(x[49], y[49]) = n
x[1] + ... + x[49] = 1

出于清晰的原因,在上述方程式中, y[i]是对数的基础。

我编写了以下代码,但是似乎没有用:

library(xlsx)
rm(list=ls())
setwd("C:/Users/.../folder")
my_data <- read.xlsx("samplefile.xlsx", 1)
y <- matrix(0:0, nrow=49,ncol=1)
for(i in 1:49) {
  if(my_data[i,1]!=0) {
    y[i,1] = 1/my_data[i,1]
    }
  }
for(i in 1:49) {
  fn <- function(x,n) {
  dummy1 <- log(x[i],y[i])-n
  dummy2 <- sum(x[1:49])-1
  return(c(dummy1,dummy2))
}
}
guess <- matrix(0.5:0.5, nrow = 50, ncol = 1)
nleqslv(guess,fn)

我希望它为x[i]n解决。但是,我收到以下错误消息:

" fn中的错误(PAR,...(:丢失了参数" n",没有默认值"

编辑:格式

有两种解决您的问题的方法。

第一个使用nleqslv来求解50个方程的系统,该系统具有50个变量: x[1]x[49]nnleqslv要解决的函数必须返回包含50个元素的向量;方程式必须为正方形。

第二个将您的问题简化为n中的单个方程式。

第一个解决方案:

library(nleqslv)
fn <- function(z,y) {
    x <- z[1:49]
    n <- z[50]
    f <- numeric(50)
    for( k in 1:49 ) f[k] <- log(x[k],y[k]) - n
    f[50] <- sum(x) - 1
    f
}

生成y和xn的启动值的一些值,然后尝试求解

y <- rep(2,49)
guess <- c( rep(.5,49), 1)
res <- nleqslv(guess,fn,y=y)
res

检查结果:

# this should sum to 1
sum(res$x[1:49])
# value of n
res$x[50]

第二个解决方案:

使用log(a,b) = n暗示a <- b^n的事实。因此,log(x[k],y[k])=n等于x[k]=y[k]^n。因此,可以立即计算x[1:49]。我们只需要从x总和至1的元素的限制中确定n。这意味着一个简单的功能

f2 <- function(n,y) {
    x <- y^n  # gives values for x
    sum(x) - 1
}

现在使用uniroot,假设n的值将位于-10和10之间,并且端点处的f2的符号具有相反的符号。

uniroot(f2,c(-10,10), y=y)

您可以运行此代码作为给定的代码,并检查nleqslvuniroot是否为n给出相同的结果。

这是否适用于您的数据。

最新更新