【问题标题】:Trouble with the ifelse() statement in RR 中 ifelse() 语句的问题
【发布时间】:2019-02-07 03:34:36
【问题描述】:

我有一个家庭作业,我必须编写一个 Bessel 函数并将其与 r 中的内置 Bessel 函数进行比较。我必须在间隔(0.01:10)上绘制曲线。该函数有几个部分,对于区间 0 1,所以使用第一个元素”消息。我发现对于向量我需要 ifelse 语句,但我如何实际使用它?我玩过它,发现它只做真/假类型的东西。即 ifelse(x

我提供的代码是错误的,可能很草率,但我已经用 r 玩了一个星期了,现在差不多了

x <- seq(.01,10, .01) #sequence of numbers 0.01 - 10 in 0.01 intervals.

#Bessel function for a set of numbers
bess.J = function(x){  
  if(x<=3){
    #
    less3 =  1-2.249997*(x/3)^2+1.2656208*(x/3)^4-0.31638*(x/3)^6+0.044479*  (x/3)^8-0.0039444*(x/3)^10+0.00021*(x/3)^12
    return(less3)
  }
  #
  else{
    Tgreater3 = x - 0.78539816 - 0.04166397*(3/x) - (0.00003954*(3/x)^2) + (0.00262573*(3/x)^3) - (0.00054125*(x/3)^4) - (0.00029333*(3/x)^5) + (0.00013558*(3/x)^6)
    Fgreater3 = 0.79788456 - 0.0000077*(3/x) - (0.00552740*(3/x)^2) - (0.00009512*(3/x)^3) + (0.00137237*(3/x)^4) - (0.00072805*(3/x)^5) + (0.00014476*(3/x)^6)
    Jgreater3 = x^(-1/2)*Fgreater3*cos(Tgreater3)
    return(Jgreater3)
  }
}

plot(x,bess.J(x))

【问题讨论】:

    标签: r


    【解决方案1】:

    如您所说,您可以使用ifelse() 代替 if 和 else。我创建了 2 个函数(方程 1 和方程 2)以使代码更具可读性。

    equation1 <- function(x){
       1-2.249997*(x/3)^2+1.2656208*(x/3)^4-0.31638*(x/3)^6+0.044479*  (x/3)^8-0.0039444*(x/3)^10+0.00021*(x/3)^12
    }
    
    equation2 <- function(x){
      Tgreater3 = x - 0.78539816 - 0.04166397*(3/x) - (0.00003954*(3/x)^2) + (0.00262573*(3/x)^3) - (0.00054125*(x/3)^4) - (0.00029333*(3/x)^5) + (0.00013558*(3/x)^6)
      Fgreater3 = 0.79788456 - 0.0000077*(3/x) - (0.00552740*(3/x)^2) - (0.00009512*(3/x)^3) + (0.00137237*(3/x)^4) - (0.00072805*(3/x)^5) + (0.00014476*(3/x)^6)
      Jgreater3 = x^(-1/2)*Fgreater3*cos(Tgreater3)
      return(Jgreater3)
    }
    
    bess.J <- function(x){
      ifelse(x <= 3, equation1(x), equation2(x))
    } 
    
    plot(x, bess.J(x))
    

    【讨论】:

    • 好吧,我修改的问题是我仍然把两个方程放在同一个函数下,这是我的错误。你所做的事情是有道理的。
    【解决方案2】:

    一种可能的解决方案是编写两个函数,一个用于每个方程,然后使用ifelse 将 x 变量传递给适当的方程。
    下面我在x3定义了“eq2”。

    x <- seq(.01,10, .01) #sequence of numbers 0.01 - 10 in 0.01 intervals.
    
    #Bessel function for a set of number
    eq1<- function(x) {
      less3 =  1-2.249997*(x/3)^2+1.2656208*(x/3)^4-0.31638*(x/3)^6+0.044479*  (x/3)^8-0.0039444*(x/3)^10+0.00021*(x/3)^12
      return(less3)
    }
    
    eq2<- function(x){
      Tgreater3 = x - 0.78539816 - 0.04166397*(3/x) - (0.00003954*(3/x)^2) + (0.00262573*(3/x)^3) - (0.00054125*(x/3)^4) - (0.00029333*(3/x)^5) + (0.00013558*(3/x)^6)
      Fgreater3 = 0.79788456 - 0.0000077*(3/x) - (0.00552740*(3/x)^2) - (0.00009512*(3/x)^3) + (0.00137237*(3/x)^4) - (0.00072805*(3/x)^5) + (0.00014476*(3/x)^6)
      Jgreater3 = x^(-1/2)*Fgreater3*cos(Tgreater3)
      return(Jgreater3)
    }
    
    
    bess.jx<-ifelse(x<=3, eq1(x), eq2(x))
    plot(x,bess.jx)
    

    【讨论】:

    • 谢谢!我的问题是我修改后将两个方程放在同一个函数下,这是我的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多