我正在為我的學位做一些任務,并遇到了一個多變數函式成像的問題。下列的:
fb<-function(x) {5*x[1]^2 2*x[1]*x[2] 4*x[2]^2 4*x[1]-2*x[2]-2}
> x<--50:50
> y<--50:50
> z<-outer(x,y,fb)
Error in FUN(X, Y, ...) : unused argument (Y)
不僅如此,我還需要找到一個具有最大點的最優值,但是當我嘗試不使用向量時它會給出下一個:
optim(c(0,0), fb, control=list(fnscale=-5))
Error in fn(par, ...) : argument "y" is missing, with no default
請指教。
uj5u.com熱心網友回復:
看起來好像您有一個由兩個變陣列成的函式,x[1]并且x[2],您將作為單個向量傳遞給您的函式,x. 這將導致輸出矢量化出現問題。更好的寫法是
fb <- function(x, y) {
5 * x^2 2*x * y 4 * y^2 4 * x - 2 * y - 2
}
這允許您將函式可視化為表面,例如使用persp:
x <- -50:50
y <- -50:50
z <- outer(x, y, fb)
persp(x, y, z)

要使其與 一起使用optim,請創建一個包裝函式,將 x 和 y 放入單個向量中,使其在功能上與您的原始函式等效:
result <- optim(c(0, 0), function(x) fb(x[1], x[2]))$par
result
#> [1] -0.4736532 0.3684892
為了證明這是正確的結果,我們將在表面的 2D 表示上繪制最佳點。
library(ggplot2)
ggplot(cbind(expand.grid(x = x, y = y), z = c(z)), aes(x, y, fill = z))
geom_raster()
scale_fill_viridis_c()
geom_point(x = result[1], y = result[2], color = "white")

由reprex 包于 2022-06-15 創建(v2.0.1)
uj5u.com熱心網友回復:
如果你想使用outer,你應該嘗試一下Vectorize
x <- -50:50
y <- -50:50
z <- outer(x, y, Vectorize(function(a, b) fb(c(a, b))))
并且對于optiom
> optim(c(0, 0), fb, lower = c(-50, -50), upper = c(50, 50), method = "L-BFGS-B")
$par
[1] -0.4736842 0.3684211
$value
[1] -3.315789
$counts
function gradient
7 7
$convergence
[1] 0
$message
[1] "CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH"
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/492287.html
上一篇:類方法中的常見默認引數
下一篇:C#如何計算給定字串中有多少字謎
