首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R中的二分法

R中的二分法
EN

Stack Overflow用户
提问于 2015-03-15 18:12:05
回答 3查看 8.5K关注 0票数 0

我正试图用二分法求解一个方程。但是,当我尝试运行这个程序时,我会得到以下错误

代码语言:javascript
运行
复制
"Error in if ((fn(kVec, tVec, b) * fn(kVec, tVec, a) > 0) | (b > a)) { : 
  argument is of length zero"

二分法例程

代码语言:javascript
运行
复制
bisect<-function(kVec,tVec,fn,b,a,tol=1e-15){
  i<-0
  r<-(b+a)/2
  res<-c(i,r,fn(kVec,tVec,r))
  if ((fn(kVec,tVec,b)*fn(kVec,tVec,a)>0)|(b>a)) {
    return('Improper start values') }
  else
    while (abs(fn(kVec,tVec,r))>tol) {
      i<-i+1
      if (fn(kVec,tVec,b)*fn(kVec,tVec,r)>0) {
        b<-r
        r<-(b+a)/2 
      }
      else {
        a<-r
        r<-(b+a)/2 
      }
      res<-rbind(res,c(i,r,fn(kVec, tVec,r)))  
  }
return(res)
}

定义方程的函数

代码语言:javascript
运行
复制
FCfunc<-function(kVec,tVec,b){
for(i in 1:k){
    ((kVec[i]*(tVec[i]*exp(-tVec[i])-tVec[i-1]*exp(-b*tVec[i-1])))
    }
}

用一些初始估计调用二分例程

代码语言:javascript
运行
复制
bisect(kVec,tVec,FCfunc,0.00001,10.00001,tol=10e-16) 
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-20 18:13:35

代码语言:javascript
运行
复制
#bisection method
a<--give trial value-;a
b<--give trial value;b
f<-function(x){-give function-}
f(a)
f(b)
c<-(a+b)/2;c
while(f(c)!=0&&b-a>.00002)
{
    if(f(c)==0)
    {
        c
    }
    if(f(c)<0)
    {
        a<-c
    }
    else
    {
        b=c
    }
    {
        c<-(a+b)/2;c
    }
}
c
票数 0
EN

Stack Overflow用户

发布于 2017-09-27 11:31:16

二分法

代码语言:javascript
运行
复制
    rm(list=ls())
    x0<-0
    x1<-1
    e<-0.001 #Error of tolerance
    fun<-function(x)(x^3-9*(x^2)+18*x-6) # An example function
    y0<-fun(x0);y0
    y1<-fun(x1);y1
    x2<-x1
    i<-1
    if(sign(y0)==sign(y1)){

        print("Starting vaules are not suitable")
    }else
    {
        while(fun(x2)!=0){
            x2<-(x0+x1)/2

            y2<-fun(x2)

            if(sign(y1)==sign(y2)){x1<-x2}else{x0<-x2}
                y0<-fun(x0)
                y1<-fun(x1)
                cat(i,x2,"\n") #Print the value obtained in each iteration next line 
                i<-i+1
            }
        }

对于函数完全等于零的x2值,上面的while循环停止,现在,如果您希望在最短的迭代中允许错误,那么您可以在(abs(X2)>0.001)时替换条件并运行整个程序。其中0.001表示允许的误差范围。

票数 1
EN

Stack Overflow用户

发布于 2019-01-23 20:37:05

也许你会发现我在R中的二分法代码很有用

代码语言:javascript
运行
复制
f.acc <- function(x){
1+1/x-log(x)
}
f.acc(0.5)
f.acc(6)
# since f.acc is continuous, it must have a root between 0.5 and 6.
x.left <- 0.5
x.right <- 6
iter <- 1
tol <- 1e-6
max.iter <- 100
while ((abs(x.right-x.left) > tol) && (iter < max.iter)) {
x.mid <- (x.left+x.right)/2
if (f.acc(x.mid)*f.acc(x.right)<0) {
x.left <- x.mid
} else {
x.right <- x.mid
}
iter <- iter + 1
cat("At iteration", iter, "value of x.mid is:", x.mid, "\n")
}

cat("At iteration", iter, "value of x.mid is:", x.mid, "and the function value is",
f.acc(x.mid),"\n")

x.n.minus.1 <- 0.5
x.n <- 6
iter <- 1
while ((abs(x.n-x.n.minus.1) > tol) && (iter < max.iter)) {
x.n.plus.1 <- x.n - f.acc(x.n)*(x.n-x.n.minus.1)/(f.acc(x.n)-f.acc(x.n.minus.1))
x.n.minus.1 <- x.n
x.n <- x.n.plus.1
iter <- iter + 1
cat("At iteration", iter, "value of x.n is:", x.n, "\n")
}

cat("At iteration", iter, "value of x is:", x.n, "and the function value is",
f.acc(x.n),"\n")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29064335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档