nleqslv понять логику итерационной процедуры

Я использовал пакет nleqslv для решения системы двух нелинейных уравнений

library(nleqslv)
read.table("C:\\Users\\Livia\\Desktop\\firm.txt",header=TRUE)
firm.txt<-"Q K r X.E t E0
"
firm<-read.table(textConnection(firm.txt),header=TRUE,stringsAsFactors=FALSE)
firm
#Loop with solver for 9 dates:
for(i in 1:9){
K<-firm[i,2]
r<-firm[i,3]
X.E<-firm[i,4]
t<-firm[i,5]
E0<-firm[i,6]
BS<-function(x){
f<-rep(NA,length(x))
f[1]<-(x[1]*pnorm((log(x[1]/K)+(r+(x[2]^2/2))*t)/(x[2]*sqrt(t)))-exp(-r*t)*K*pnorm((log(x[1]/K)+(r+(x[2]^2/2))*t)/(x[2]*sqrt(t))-x[2]*sqrt(t)))-E0
f[2]<-X.E*E0-pnorm((log(x[1]/K)+(r+(x[2]^2/2))*t)/(x[2]*sqrt(t)))*x[2]*x[1]
f
}
p0<-c((E0+K),X.E*E0/(E0+K))
print(p0)
ans<-nleqslv(p0,BS,control=list(trace=1,allowSingular=TRUE))
print(ans)
}

Очень хотелось бы понять логику этого. У меня есть два неизвестных, и я устанавливаю их начальные значения в соответствии с

p0<-c((E0+K),X.E*E0/(E0+K))

Как работает процедура итерации? Я уже пытался достать из CRAN пакеты "nleqslv" 3.0 .pdf но безуспешно.


person Livia G    schedule 02.06.2016    source источник
comment
Привет, Ливия, добро пожаловать в StackOverflow. 2 вещи -- 1. Вы можете увидеть, как работает эта функция, посмотрев исходный код, 2. Если вам нужна дополнительная помощь, это вопрос для нашего родственного сайта Cross Validated. stats.stackexchange.com Исходный код доступен в CRAN, Github и при запуске функции в R без ()   -  person Hack-R    schedule 02.06.2016
comment
Используемые алгоритмы не задокументированы в .pdf. Вы можете найти больше в книге Денниса и Шнабеля. Кстати, вы представили эти уравнения в r-nleqslv-loop-bad-results. Почему вы не использовали временные переменные в моем ответе и почему не масштабировали f[1] с K?   -  person Bhas    schedule 02.06.2016
comment
Привет, Бхас, я не получал никаких уведомлений, поэтому я никогда не видел твоего ответа! Однако мой вопрос больше теоретический, я просто хочу понять механизм: система двух уравнений с двумя неизвестными; установите начальные значения этих неизвестных, чтобы начать процедуру итерации... а затем куда эти значения подставляются, чтобы получать все больше и больше результатов, пока они не сойдутся?   -  person Livia G    schedule 03.06.2016
comment
При заданных начальных значениях, якобиане и значениях функции вычисляется новый набор неизвестных. Они передаются вашей системе, которая возвращает новые значения функций. Учитывая возвращаемое значение и глобальный алгоритм, вычисляется новый набор неизвестных. Этот процесс повторяется до тех пор, пока не будет достигнута сходимость или когда используемый алгоритм не может развиваться. Подробности смотрите в исходном коде nleqslv. Не задокументировано в `nleqslv.pdf', так как это сделало бы руководство слишком большим. См. Деннис и Шнабель (в разделе «Ссылки»).   -  person Bhas    schedule 03.06.2016
comment
Бас, по-вашему, это звучит правильно? Учитывая систему двух нелинейных уравнений f[1] и f[2], начальные предположения x[1] и x[2] и методологию Ньютона/Бройдена, матрица производных первого порядка f[1] и f [2] (матрица Якоби) рассчитывается и предоставляет новый набор неизвестных после каждой успешной итерации. С каждым новым набором неизвестных одна и та же процедура будет начинаться снова и снова, пока не сойдется к аффинным значениям для x[1] и x[2].   -  person Livia G    schedule 03.06.2016
comment
Да, но что такое аффинные значения?   -  person Bhas    schedule 03.06.2016
comment
это означает аналогичные значения. Я имею в виду сходимость значений каждого неизвестного   -  person Livia G    schedule 03.06.2016
comment
Процедура предполагает сходимость, когда значения функции меньше заданного значения или когда изменения независимых переменных от итерации к итерации слишком малы. Но он не пытается уравнять x[1] и x[2], как кажется из вашего комментария.   -  person Bhas    schedule 04.06.2016
comment
Конечно, я не это имел в виду, я просто плохо объясняюсь. Спасибо!   -  person Livia G    schedule 04.06.2016


Ответы (1)


Пожалуйста, смотрите мой комментарий выше для предостережений.

При этом вот что происходит под капотом, когда вы запускаете эту функцию:

> nleqslv
function (x, fn, jac = NULL, ..., method = c("Broyden", "Newton"), 
    global = c("dbldog", "pwldog", "cline", "qline", "gline", 
        "hook", "none"), xscalm = c("fixed", "auto"), jacobian = FALSE, 
    control = list()) 
{
    fn1 <- function(par) fn(par, ...)
    if (is.null(jac)) {
        jacfunc <- NULL
    }
    else {
        if (!is.function(jac)) 
            stop("argument 'jac' is not a function!")
        jacfunc <- function(par) jac(par, ...)
    }
    method <- match.arg(method)
    global <- match.arg(global)
    xscalm <- match.arg(xscalm)
    con <- list(ftol = 1e-08, xtol = 1e-08, btol = 0.001, stepmax = -1, 
        delta = "newton", sigma = 0.5, scalex = rep(1, length(x)), 
        maxit = 150, trace = 0, chkjac = FALSE, cndtol = 1e-12, 
        allowSingular = FALSE, dsub = -1L, dsuper = -1L)
    if (global == "none") 
        con$maxit = 20
    if (length(control)) {
        namc <- names(control)
        if (!is.list(control) || is.null(namc)) 
            stop("'control' argument must be a named list")
        if (!all(namc %in% names(con))) 
            stop("unknown names in control: ", paste(sQuote(namc[!(namc %in% 
                names(con))]), collapse = ", "))
        con[namc] <- control
    }
    tmp <- con[["delta"]]
    if (is.character(tmp)) {
        k <- match(tolower(tmp), c("cauchy", "newton"))
        con[["delta"]] <- as.numeric(-k)
    }
    else if (!is.numeric(tmp)) 
        stop("control[\"delta\"] should be either character or numeric")
    on.exit(.C("deactivatenleq", PACKAGE = "nleqslv"))
    out <- .Call("nleqslv", x, fn1, jacfunc, method, global, 
        xscalm, jacobian, con, new.env(), PACKAGE = "nleqslv")
    out
}
<environment: namespace:nleqslv>

Если вы хотите увидеть, как работают другие функции, вы можете изучить их таким же образом (введите имя функции и нажмите клавишу ввода, не добавляя ()).

Если вы хотите погрузиться глубже, полный исходный код находится здесь:

https://cran.r-project.org/src/contrib/nleqslv_3.0.1.tar.gz

и тут:

https://github.com/cran/nleqslv

person Hack-R    schedule 02.06.2016
comment
Привет, Hack-R, спасибо за ответ. Однако мой вопрос более простой, я просто хочу понять механизм: система двух уравнений с двумя неизвестными; установить начальные значения этих неизвестных, чтобы начать процедуру итерации... а затем куда подставить эти значения, чтобы получить все больше и больше результатов, пока они не сойдутся? - person Livia G; 03.06.2016
comment
@LiviaG Понятно. Это определенно вопрос к stats.stackexchange.com, а не к StackOverflow. StackOverflow — это сайт для тех, у кого есть ошибки в коде, и вы пытаетесь понять, как их исправить. - person Hack-R; 03.06.2016