Я пытаюсь найти минимум заданной функции, используя параболическую интерполяцию.
Цель:
Используя функцию «g (x)», найдите минимум другой функции «f (x)».
Ограничения:
Участок:
Теоретический результат:
Результат предоставить по коду:
Ключевой вопрос:
Попытка решения:
Я сделал следующее, но мои значения не имеют смысла
# Actual function to estimate the minimum value of
actual <- function(x){
result <- -x *(1-x)
return(result)
}
# The estimation function whose parameters a0,a1,a2 are unknown
parabola <- function(par,x){
a0 <- par[1]
a1 <- par[2]
a2 <- par[3]
result <- a0+a1*x+a2*x^2
return(result)
}
# finding the difference between the functions for three given values (x0,x1,x2)
difference_function <- function(par,x){
x0 <- par[4]
x1 <- par[5]
x2 <- par[6]
result <- sum(actual(x0),actual(x1),actual(x2)) - sum(parabola(par,x0),parabola(par,x1),parabola(par,x2))
return(result)
}
find_parameters <- function(){
temp <- optim(par=c(0,-1,1,0.4,0.55,0.6), fn=difference_function)
a0 <- temp$par[1]
a1 <- temp$par[2]
a2 <- temp$par[3]
return(list=c(a0=a0,a1=a1,a2=a2))
}
find_parameters()





Похоже, что в более широком математическом смысле 3 точки недостаточно для однозначного определения параболы. 5 точек должно быть достаточно, чтобы однозначно определить любое коническое сечение. Видеть:
Если у вас нет достаточного количества точек для однозначного определения параболы, у вашей оптимизации будет несколько ответов.
Таким образом, ошибка заключалась в минимизации квадрата ошибки, поскольку это обеспечило бы уникальное решение.
Исправленное решение выглядит следующим образом:
# Actual function to estimate the minimum value of
actual <- function(x){
result <- -x *(1-x)
return(result)
}
# The estimation function whose parameters a0,a1,a2 are unknown
parabola <- function(par,x){
a0 <- par[1]
a1 <- par[2]
a2 <- par[3]
result <- a0+a1*x+a2*x^2
return(result)
}
# finding the difference between the functions for three given values (x0,x1,x2)
difference_function <- function(par,x){
x0 <- par[4]
x1 <- par[5]
x2 <- par[6]
result <- sum((actual(x0)-parabola(par,x0))^2,(actual(x1)-parabola(par,x1))^2, (actual(x2)-parabola(par,x2))^2)
return(result)
}
find_parameters <- function(){
temp <- optim(par=c(0,-1,1,0.1,0.8,0.9), fn=difference_function)
a0 <- temp$par[1]
a1 <- temp$par[2]
a2 <- temp$par[3]
return(list=c(a0=a0,a1=a1,a2=a2))
}
find_parameters()
Это метод оценки минимумов функции, аналогичный методу Ньютона. Вот отличное видео на эту же тему: youtube.com/watch?v=j6ikEASjbWE и ссылка на википедию en.wikipedia.org/wiki/Последовательная_параболическая_интерполяция