如何用一系列值的常数求解R中的非线性方程?

如何用一系列值的常数求解R中的非线性方程?,r,function,R,Function,我使用nleqslv来解R中的一个非线性方程。常数b是“21.csv”中的值列表。b有10137个值,所以我想得到这个函数的10137个根(x的10137个值)。为什么x的结果只有一个值(x的长度为)?代码有什么问题吗?如何用10137 b(s)获得x的10137个值的列表?谢谢 a=read.csv("21.csv",header=TRUE) b=c(a$c) library(nleqslv) target= function(x, a=1.239448) { y = numeric(1

我使用nleqslv来解R中的一个非线性方程。常数b是“21.csv”中的值列表。b有10137个值,所以我想得到这个函数的10137个根(x的10137个值)。为什么x的结果只有一个值(x的长度为)?代码有什么问题吗?如何用10137 b(s)获得x的10137个值的列表?谢谢

a=read.csv("21.csv",header=TRUE)
b=c(a$c)

library(nleqslv)
target= function(x, a=1.239448)
{
  y = numeric(1)
y[1] = -a*(1+exp(a*x[1]-b))^(-2)*exp(a*x[1]-b)*x[1]-a+b
y
}

xstart = c(10)
target(xstart)
nleqslv(xstart, target, control=list(ftol=.0001, allowSingular=TRUE),jacobian=TRUE,method="Newton")


>
$x
[1] 9.68385

> head(a)
         c
1 11.83898
2 11.72014
3 14.86955
4 18.20404
5 17.69610
6 17.51668
> head(b)
[1] 11.83898 11.72014 14.86955 18.20404 17.69610 17.51668

正如我在评论中提到的,您的函数
target
总是返回标量,
xstart
是标量。 如果
b
是一个向量,则应重写
target
,返回一个向量并提供适当长度的起始值。 见下文

target
函数编写为向量的函数
x
并返回向量

target <- function(x, a=1.239448)
{
  y <- numeric(length(x))
  y <- -a*(1+exp(a*x-b))^(-2)*exp(a*x-b)*x-a+b
  y
}
结果是现在

$x
[1] 0.8771918 2.9811141

$fvec
[1] 0.000000e+00 2.960259e-08

$termcd
[1] 1

$message
[1] "Function criterion near zero"

$scalex
[1] 1 1

$nfcnt
[1] 6

$njcnt
[1] 4

$iter
[1] 4

$jac
           [,1]      [,2]
[1,] -0.3627487 0.0000000
[2,]  0.0000000 0.2279917

方法
Broyden
也有效,在这种情况下不需要
control
参数。

您确实需要为您的问题添加更多信息,请格式化它,并添加21.csv的一些内容(因为我们不知道里面有什么)。标签页顶部有关于如何提出问题的说明。请至少分享
head(a)
。使用
head(a)
head(b)
显示
a
和/或
b
的一些数据。您得到的是单个返回值,因为
xstart
是标量,
target
使用
y[1]
返回标量。您的代码必须更改。
$x
[1] 0.8771918 2.9811141

$fvec
[1] 0.000000e+00 2.960259e-08

$termcd
[1] 1

$message
[1] "Function criterion near zero"

$scalex
[1] 1 1

$nfcnt
[1] 6

$njcnt
[1] 4

$iter
[1] 4

$jac
           [,1]      [,2]
[1,] -0.3627487 0.0000000
[2,]  0.0000000 0.2279917