2016-11-21 6 views
0

Я пытаюсь написать функцию квадратного корня в R. Функция должна вести себя как sqrt(), но не использовать эту функцию, конечно. Я должен использовать метод Ньютона для вычисления квадратного корня, который является:Запись функции квадратного корня в R

у (а + 1) = [у (а) + х/у (а)]/2

Здесь х число, которое я пытаюсь вычислить квадратный корень из и y (0), будет начальным предположением квадратного корня из x.

Функция должна принимать четыре аргумента: x (число, которое я пытаюсь вычислить квадратный корень), eps (разница в значениях между итерациями, которые считаются равными), iter (максимальное число итераций) и подробный (говорит, что я хочу вывести промежуточные результаты).

Моя проблема заключается в том, что я не очень хорошо разбирается в написании функций в R. У меня есть опыт работы в C++, но они немного отличаются в R.

Я считаю, что я должен написать что-то, что идет как это.

Попросит пользователя ввести число в качестве предположения для значения, которое мы хотим вычислить из квадратного корня. Сделайте цикл for от 1 до iter с двумя операторами if 1), которые останавливают функцию и выводят значение y, если максимальное количество итераций достигнуто. 2) прекратите выполнение функции и выведите значение y, если разница между последовательными итерациями меньше чем eps.

Вот код, который я до сих пор:

MySqrt <- function (x, eps = 1e-6, iter = 100, verbose = TRUE) { 
for (i in 0:itmax) { 
    y[0] <- readline(prompt="Please enter your initial square root  guess: ") 
    y[i + 1] = (y[i] + x/y[i])/2 
    if (i == 100) { 
    stop (return(y[i + 1])) 
    } 
    if (abs(y[i + 1] - y[i]) < eps) { 
    stop (return(y[i + 1])) 
    } 
} 
return(y[i + 1]) 
} 

Здесь ошибка я получаю после ввода начальной квадратного корня догадки: Ошибка в у [0] < - Readline (подсказка = «Пожалуйста, введите исходный квадратный корень догадки: "): объект 'y' не найден

Честно говоря, я не ожидал, что код будет работать, потому что я уверен, что существует несколько ошибок.

+1

Во-первых, R не использует 0 индексирование , поэтому 'y [0]' является проблемой - 'y [1]' является первой частью вектора. Во-вторых, 'y' не существует до того, как вы попытаетесь присвоить его подраздел, поэтому ошибка« объект «y» не найден ». – thelatemail

+0

'stop' используется для (намеренно) повышения ошибки, поэтому вы, вероятно, не захотите использовать это здесь. 'return' - для завершения выполнения раньше; в противном случае будет возвращена последняя строка выражения. – alistaire

+0

@thelatemail Итак, первая строка определения функции создаст y как пустой вектор i.e. y <- vector (mode = "numeric", length = 0)? – Steve

ответ

1

Вы должны использовать iter вместо itmax.
Я инициализировал y внутри функции, и ввод y должен быть отформатирован как число, а не символ. Вы также можете упростить оператор if, используя | (или).
Я также добавил функцию «cat», чтобы вы могли видеть, что я есть до того, как функция выведет значение квадратного корня.

MySqrt <- function (x, eps = 1e-6, iter = 100, verbose = TRUE) { 
    y = 0 
    y[1] = as.numeric(readline(prompt="Please enter your initial square root  guess: ")) 
    for (i in 1:iter) { 
    y[i+1] = as.numeric((y[i] + (x/y[i]))/2) 
    if (i == 100 || abs(y[i+1] - y[i]) < eps) { 
     cat("This is", i,"th try: \n") 
     return(y[i+1]) 
    } 
    } 
} 
0

Попробуйте это просто:

newton.raphson <- function(x, start, epsilon=0.0001, maxiter=100) { 
    y <- c(start) # initial guess 
    a <- 1  # number of iterations 
    while (TRUE) { 
    y <- c(y, (y[a] + x/y[a])/2) 
    if (abs(y[a+1] - y[a]) < epsilon | a > maxiter) { # converged or exceeded maxiter 
     return(y[a+1]) 
    } 
    a <- a + 1 
    } 
} 

newton.raphson(2, 0.5, 0.01) 
# [1] 1.414234 

newton.raphson(3, 0.5, 0.01) 
# [1] 1.732051 
0

так SQRT (п) < п/2, то с точностью до 1/10000

sqrnt=function(y){ 
    x=y/2 
    while (abs(x*x-y) > 1e-10) 
    {x=(x+y/x)/2 } 
    x 
} 
Смежные вопросы