如何解决这个 Solver Excel like R 中的问题?
How can solve this Solver Excel like problem in R?
我很难实现以下优化问题,我知道 excel 中提供的解决方案,现在我正尝试在 R 中实现它。
数据为:
Kurt=4
Skew =-0.2
如图所示分别为k和t。
在 R 中找到较低和较高的 omega 很简单:
对于较低的欧米茄:
w1 = c(-Kurt-6,0,3,2,1)
f = polyroot(w1)
w11=max(Re(f));w11
[1] 1.206575
w2 = c(-4-(Skew)^2 ,0,3,1)
g = polyroot(w2);g
w22=max(Re(g));w22
wl = max(w11,w22) ;wl
1] 1.206575
对于上层omega:
wu = (-1+(2*(Kurt+2))^(0.5))^(0.5)
wu
[1] 1.569746
上下欧米伽R与Excel一致。
现在的问题是 excel 求解器发现 omega 值为 1.56425 但我不知道如何在 R 中验证它。
我也尝试了 optimize
上限和下限的功能:
m = function(x){ (4+2*( x^2 - ((Kurt +6) /(x^2+2*x+3) ) ))^(0.5) }
om = function(x){(x-1-m(x) )*(x+2+(m(x) /2))^2 - Skew}
optimize(om,interval = c(wl,wu), maximum = TRUE)
但我不知道如何找到上欧米茄和下欧米茄之间的结果 1.56425,如 photo.It 中所述,在 Excel 中创建求解器,但我不知道如何执行它在 R.
请原谅我的照片,但 stack overflow 没有 latex 无法正确显示它。
有什么帮助吗?我怎样才能在 R 中做到这一点?
excel sheet就是下面这张图:
您需要提供更多 information/explanations 以便人们可以真正复制您的示例。 (例如,什么是m
,为什么它是x
的函数?为什么在最后一步优化,而不是寻找零?)。
无论如何,验证 Excel 解的一种方法是将其代入方程,看看方程是否成立。
此外,您还可以绘制函数以了解优化可能失败的原因:
plot(x = seq(wl, wu, length.out = 50),
y = om(seq(wl, wu, length.out = 50)))
更新
感谢您的附加信息。 (您还想 post 描述的来源。)您的函数中似乎至少有两个编码错误。尝试:
m <- function(x){
(4 + 2*(x^2 - ((Kurt + 6) /(x^2 + 2*x + 3))))^(0.5) - 2
}
om <- function(x){
(x - 1 - m(x))*(x + 2 + (m(x) /2))^2 - Skew^2
}
uniroot(om, interval = c(wl,wu))
## $root
## [1] 1.56425
##
## $f.root
## [1] 3.204998e-05
##
## $iter
## [1] 3
##
## $init.it
## [1] NA
##
## $estim.prec
## [1] 6.103516e-05
请注意,我使用 uniroot
是因为您正在寻找一个零(a.k.a。一个根)。
我很难实现以下优化问题,我知道 excel 中提供的解决方案,现在我正尝试在 R 中实现它。
数据为:
Kurt=4
Skew =-0.2
如图所示分别为k和t。
在 R 中找到较低和较高的 omega 很简单:
对于较低的欧米茄:
w1 = c(-Kurt-6,0,3,2,1)
f = polyroot(w1)
w11=max(Re(f));w11
[1] 1.206575
w2 = c(-4-(Skew)^2 ,0,3,1)
g = polyroot(w2);g
w22=max(Re(g));w22
wl = max(w11,w22) ;wl
1] 1.206575
对于上层omega:
wu = (-1+(2*(Kurt+2))^(0.5))^(0.5)
wu
[1] 1.569746
上下欧米伽R与Excel一致。
现在的问题是 excel 求解器发现 omega 值为 1.56425 但我不知道如何在 R 中验证它。
我也尝试了 optimize
上限和下限的功能:
m = function(x){ (4+2*( x^2 - ((Kurt +6) /(x^2+2*x+3) ) ))^(0.5) }
om = function(x){(x-1-m(x) )*(x+2+(m(x) /2))^2 - Skew}
optimize(om,interval = c(wl,wu), maximum = TRUE)
但我不知道如何找到上欧米茄和下欧米茄之间的结果 1.56425,如 photo.It 中所述,在 Excel 中创建求解器,但我不知道如何执行它在 R.
请原谅我的照片,但 stack overflow 没有 latex 无法正确显示它。
有什么帮助吗?我怎样才能在 R 中做到这一点?
excel sheet就是下面这张图:
您需要提供更多 information/explanations 以便人们可以真正复制您的示例。 (例如,什么是m
,为什么它是x
的函数?为什么在最后一步优化,而不是寻找零?)。
无论如何,验证 Excel 解的一种方法是将其代入方程,看看方程是否成立。
此外,您还可以绘制函数以了解优化可能失败的原因:
plot(x = seq(wl, wu, length.out = 50),
y = om(seq(wl, wu, length.out = 50)))
更新 感谢您的附加信息。 (您还想 post 描述的来源。)您的函数中似乎至少有两个编码错误。尝试:
m <- function(x){
(4 + 2*(x^2 - ((Kurt + 6) /(x^2 + 2*x + 3))))^(0.5) - 2
}
om <- function(x){
(x - 1 - m(x))*(x + 2 + (m(x) /2))^2 - Skew^2
}
uniroot(om, interval = c(wl,wu))
## $root
## [1] 1.56425
##
## $f.root
## [1] 3.204998e-05
##
## $iter
## [1] 3
##
## $init.it
## [1] NA
##
## $estim.prec
## [1] 6.103516e-05
请注意,我使用 uniroot
是因为您正在寻找一个零(a.k.a。一个根)。