Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用R求函数的极值?_R - Fatal编程技术网

如何使用R求函数的极值?

如何使用R求函数的极值?,r,R,我有这样一个函数: (乳胶配方:$v[y]=\int_0^2(y'^2+23yy'+12y^2+3ye^{2t})dt$) 在给定的开始和结束条件下y(0)=-1,y(2)=18。 如何在R中找到这个函数的极值?例如,我知道如何在Excel中完成,但在R中没有找到合适的解决方案。在尝试在数值环境中解决此类任务之前,最好向后靠一靠,思考一下 这是“变分演算”的数学学科中典型处理的问题。函数y(t)成为函数极值(即积分)的一个必要条件是所谓的Euler-Lagrange方程,参见 在Wolfram

我有这样一个函数:

(乳胶配方:
$v[y]=\int_0^2(y'^2+23yy'+12y^2+3ye^{2t})dt$

在给定的开始和结束条件下
y(0)=-1,y(2)=18

如何在R中找到这个函数的极值?例如,我知道如何在Excel中完成,但在R中没有找到合适的解决方案。

在尝试在数值环境中解决此类任务之前,最好向后靠一靠,思考一下

这是“变分演算”的数学学科中典型处理的问题。函数
y(t)
成为函数极值(即积分)的一个必要条件是所谓的Euler-Lagrange方程,参见 在Wolfram Mathworld

将其应用于
f(t,y,y')
作为您请求中的被积函数,我得到(请检查,我很容易出错)

你现在可以找到这个微分方程的符号解(借助教科书或一些CAS),或者借助R软件包(如“deSolve”)进行数值求解


PS:作为一个基于离散化的优化问题来解决这个问题是可能的,但可能会让你走上一条漫长而崎岖的道路。我记得,仅通过应用几百个变量(不在R中)就可以将“短时间问题”解决到令人满意的精度。

在尝试在数值环境中解决这类任务之前,最好向后靠一靠,思考一下

这是“变分演算”的数学学科中典型处理的问题。函数
y(t)
成为函数极值(即积分)的一个必要条件是所谓的Euler-Lagrange方程,参见 在Wolfram Mathworld

将其应用于
f(t,y,y')
作为您请求中的被积函数,我得到(请检查,我很容易出错)

你现在可以找到这个微分方程的符号解(借助教科书或一些CAS),或者借助R软件包(如“deSolve”)进行数值求解


PS:作为一个基于离散化的优化问题来解决这个问题是可能的,但可能会让你走上一条漫长而崎岖的道路。我记得仅通过应用几百个变量(不在R中)就可以将“短时间问题”解决到令人满意的精度。

这里是在R中的数值解。首先是函数:

f<-function(y,t=head(seq(0,2,len=length(y)),-1)){
  len<-length(y)-1
  dy<-diff(y)*len/2
  y0<-(head(y,-1)+y[-1])/2
  2*sum(dy^2+23*y0*dy+12*y0^2+3*y0*exp(2*t))/len
}
在500分的评估中,使用BFGS只需几秒钟:

> system.time(yy<-findMinY(500,method="BFGS"))
Iterations: 90 18 
   user  system elapsed 
  2.696   0.000   2.703 

这里是R中的数值解。首先是函数:

f<-function(y,t=head(seq(0,2,len=length(y)),-1)){
  len<-length(y)-1
  dy<-diff(y)*len/2
  y0<-(head(y,-1)+y[-1])/2
  2*sum(dy^2+23*y0*dy+12*y0^2+3*y0*exp(2*t))/len
}
在500分的评估中,使用BFGS只需几秒钟:

> system.time(yy<-findMinY(500,method="BFGS"))
Iterations: 90 18 
   user  system elapsed 
  2.696   0.000   2.703 

现在是数值积分欧拉方程的解决方案

正如@HansWerner所指出的,这个问题归结为将Euler-Lagrange方程应用于OP问题中的被积函数,然后解析或数值求解该微分方程。在这种情况下,相关的ODE是

y'' - 12*y = 3/2*exp(2*t)
subject to:
y(0) = -1
y(2) = 18
所以这是一个边值问题,最好使用包
bvpSolve
中的
bvpcol(…)
来解决

library(bvpSolve)
F <- function(t, y.in, pars){
  dy  <- y.in[2]
  d2y <- 12*y.in[1] + 1.5*exp(2*t)
  return(list(c(dy,d2y)))
}
init <- c(-1,NA)
end  <- c(18,NA)
t    <- seq(0, 2, by = 0.01)
sol  <- bvpcol(yini = init, yend = end, x = t, func = F)

y = function(t){    # analytic solution...
  b <- sqrt(12)
  a <- 1.5/(4-b*b)
  u <- exp(2*b)
  C1 <- ((18*u + 1) - a*(exp(4)*u-1))/(u*u - 1)
  C2 <- -1 - a - C1
  return(a*exp(2*t) + C1*exp(b*t) + C2*exp(-b*t))
}

par(mfrow=c(1,2))
plot(t,y(t), type="l", xlim=c(0,2),ylim=c(-1,18), col="red", main="Analytical Solution")
plot(sol[,1],sol[,2], type="l", xlim=c(0,2),ylim=c(-1,18), xlab="t", ylab="y(t)", main="Numerical Solution")

其中,
a=-3/16
C1
C2
被确定为满足边界条件。如图所示,数值解和解析解完全一致,也与@mrip提供的解一致,现在是数值积分欧拉方程的解

正如@HansWerner所指出的,这个问题归结为将Euler-Lagrange方程应用于OP问题中的被积函数,然后解析或数值求解该微分方程。在这种情况下,相关的ODE是

y'' - 12*y = 3/2*exp(2*t)
subject to:
y(0) = -1
y(2) = 18
所以这是一个边值问题,最好使用包
bvpSolve
中的
bvpcol(…)
来解决

library(bvpSolve)
F <- function(t, y.in, pars){
  dy  <- y.in[2]
  d2y <- 12*y.in[1] + 1.5*exp(2*t)
  return(list(c(dy,d2y)))
}
init <- c(-1,NA)
end  <- c(18,NA)
t    <- seq(0, 2, by = 0.01)
sol  <- bvpcol(yini = init, yend = end, x = t, func = F)

y = function(t){    # analytic solution...
  b <- sqrt(12)
  a <- 1.5/(4-b*b)
  u <- exp(2*b)
  C1 <- ((18*u + 1) - a*(exp(4)*u-1))/(u*u - 1)
  C2 <- -1 - a - C1
  return(a*exp(2*t) + C1*exp(b*t) + C2*exp(-b*t))
}

par(mfrow=c(1,2))
plot(t,y(t), type="l", xlim=c(0,2),ylim=c(-1,18), col="red", main="Analytical Solution")
plot(sol[,1],sol[,2], type="l", xlim=c(0,2),ylim=c(-1,18), xlab="t", ylab="y(t)", main="Numerical Solution")

其中,
a=-3/16
C1
C2
被确定为满足边界条件。如图所示,数值解和解析解完全一致,也与@mrip

Excel提供的解一致??你的
y'
是什么
dy/dt
?在Excel中,我的做法与近似法类似:创建t、y、y'和v列,然后找到解决方案。y'是dy/dt。
?deriv
?optim
可能有用您所说的“找到极值”是什么意思?您是否正在寻找一个函数
y
,它可以最大化或最小化
v[y]
?你确定excel能做到这一点吗?我假设你的策略是做一个离散近似,然后优化。如果是这样的话,这可以在R中完成,但我不知道excel做了多维非线性优化。一个有效的excel解决方案会给我留下深刻的印象。你能和我们分享吗?Excel可以做到这一点??你的
y'
是什么
dy/dt
?在Excel中,我的做法与近似法类似:创建t、y、y'和v列,然后找到解决方案。y'是dy/dt。
?deriv
?optim
可能有用您所说的“找到极值”是什么意思?您是否正在寻找一个函数
y
,它可以最大化或最小化
v[y]
?你确定excel能做到这一点吗?我假设你的策略是做一个离散近似,然后优化。如果是这样的话,这可以在R中完成,但我不知道excel做了多维非线性优化。一个有效的excel解决方案会给我留下深刻的印象。你能和我们分享一下吗?有趣的方法。我喜欢它,但我担心OP会将
y
y'
的一些数值集合放入一个简单的解算器中。“这个问题措辞拙劣。@HansWerner-我认为应用于
f(t,y,y')
的Euler-Lagrange方程给出了
y'-12*y-3/2*exp(2*t)
有趣的方法。我喜欢它,但我担心OP会将
y
y'
的一些数值集合放入一个简单的解算器中。措辞拙劣的问题