【问题标题】:Parabolic Interpolation using optim()使用 optim() 进行抛物线插值
【发布时间】:2019-03-12 19:48:05
【问题描述】:

我正在尝试使用抛物线插值找到给定函数的最小值。

目标:

使用函数 'g(x)' 找到另一个函数 'f(x)' 的最小值

  • 用于估计的函数 -> g(x) = a0+a1*x + a2*x^2
  • 需要找到最小值的函数 -> f(x) = -x(1-x)
  • 对于三个给定的 x1、x2 和 x3,找到参数 a0、a1、a2 使得 f(x0)=g(x0)、f(x1)=g(x1)、f(x2)=g(x2)。

约束:

  • x0,x1,x2 属于 (0,1) 范围

剧情:

理论结果:

  • 从图中可以清楚地看出,函数 (f(x)) 的最小值为 0.5
  • 如果 a0=0,a1=-1,a2=1 我们基本上得到 g(x)=f(x)

结果由代码提供:

  • a0
  • a1
  • a2

关键问题:

  • 我对这种方法的理解是正确的还是我的问题 代码?

尝试的解决方案:

我做了以下,但我的价值观没有意义

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

【问题讨论】:

    标签: r optimization


    【解决方案1】:

    看起来在更广泛的数学意义上,3 个点不足以唯一地定义抛物线。 5 个点应该足以唯一地定义任何圆锥截面。见:

    https://www.quora.com/How-many-points-are-needed-to-uniquely-define-a-parabola-and-the-other-conics-Is-there-only-one-parabola-passing-through-the-vertices-of-a-given-triangle

    除非你有足够多的点来唯一定义抛物线,否则你的优化会有多个答案。

    【讨论】:

    【解决方案2】:

    所以错误是最小化平方误差,因为这将提供一个独特的解决方案

    修正后的解决方案如下:

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

    【讨论】:

      猜你喜欢
      • 2021-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-13
      • 2012-11-09
      相关资源
      最近更新 更多