Проблема с оператором ifelse () в R - PullRequest
0 голосов
/ 07 февраля 2019

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

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

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))

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Возможное решение - написать две функции, по одной для каждого уравнения, а затем использовать ifelse для передачи переменной x в соответствующее уравнение.
Ниже я определил функцию "eq1", когда x <= 3, и определил«eq2» для x> 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)

enter image description here

0 голосов
/ 07 февраля 2019

Как вы сказали, вы можете использовать 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...