Проблема с утверждением IfElse() в R

Вопрос задан: 8 месяцев назад Последняя активность: 8 месяцев назад
up 1 down

У меня есть домашнее задание, где я должен написать функцию Бесселя и сравнить его с помощью встроенного в функции Бесселя в р. Я должен построить кривую на интервале (0,01: 10). Функция состоит из нескольких частей и для интервала 0 <= х <= 3 я должен найти х, используя уравнение 1. На интервале 3 <х <= бесконечность Я должен использовать уравнение 2. Я попробовал, если и еще, но Я продолжал иметь «длина> 1, поэтому первый элемент используется» сообщение. Я узнал, что для векторов мне нужно заявление IfElse но как я на самом деле использовать его? Я играл с ним и обнаружил, что он делает только истина/ложь типа материала. т.е. IfElse (х <= 3, у, г), где все ниже число и равно х равно у и все числа, большие, чем х равно г. Как бы идти о написании функции, в которой он делает уравнение 1, если х <= 3 и уравнение 2 для всех остальных чисел?

Код я предоставил это неправильно и это может быть неаккуратным, но я играл с т в течение одной недели теперь, и это о том, как идти

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

2 ответа

up 1 down

Как вы сказали, вы можете использовать ifelse() а если и еще. Я создаю 2 функции (equation1 и equation2), чтобы сделать код более читаемым.

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))
up 1 down

Возможное решение заключается в написании две функции, по одному для каждого из уравнений, а затем использовать ifelse передать переменную х к соответствующему уравнению.
Ниже я определил функцию «EQ1», когда х <= 3 и определяется «EQ2» при х> 3.

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)

Проблема с утверждением IfElse() в R