【问题标题】:Loop in a function在函数中循环
【发布时间】:2021-09-07 12:07:12
【问题描述】:

雅可比矩阵包

install.packages('pracma')
library('pracma')

假设我有以下一组非线性函数

f <- function(beta) c(y[1]*beta[1]+z[1]*1/beta[2],
                      y[2]*beta[1]+z[2]*1/beta[2],
                      :   :     :    :
                    y[i]*beta[1]^2+z[i]*1/beta[2])

现在假设 i 变得很大,写出 i 的所有函数非常耗时。

如何编写这样的函数? 我尝试了以下方法:

f <- function(beta) cbind(y, z) %*% (c(beta^2,(beta^-1)), ncol = 1, nrow = 2)

当我应用这个函数来构造雅可比矩阵时,它不是我想要的格式

y = 1:10
z = 10:19
f <- function(beta) cbind(y, z) %*% matrix(cbind(beta^2,1/beta), ncol = 1, nrow = 2)
jacobian(f, c(1,1))

第一列的输出正确,第二列的输出正确:

     [,1] [,2]
 [1,]    2   20
 [2,]    4   22
 [3,]    6   24
 [4,]    8   26
 [5,]   10   28
 [6,]   12   30
 [7,]   14   32
 [8,]   16   34
 [9,]   18   36
[10,]   20   38

再试一次:

f <- function(beta) cbind(y, z) %*% cbind(beta^2,1/beta)
jacobian(f, c(1,1))

给出以下结果:

      [,1] [,2]
 [1,]    2   20
 [2,]    4   22
 [3,]    6   24
 [4,]    8   26
 [5,]   10   28
 [6,]   12   30
 [7,]   14   32
 [8,]   16   34
 [9,]   18   36
[10,]   20   38
[11,]   -1  -10
[12,]   -2  -11
[13,]   -3  -12
[14,]   -4  -13
[15,]   -5  -14
[16,]   -6  -15
[17,]   -7  -16
[18,]   -8  -17
[19,]   -9  -18
[20,]  -10  -19

第一列的前 10 个观察值和第二列的 11:20 观察值是我需要的一次。

有谁知道如何获得这两个向量?我应该在函数内部创建一个循环吗?

【问题讨论】:

    标签: r function for-loop matrix nonlinear-functions


    【解决方案1】:

    您可以在 R 中使用vectorisation,如下所示:

    y <- 1:10
    z <- 10:19
    beta <- c(1, 1)
    
    f <- function(y, z, beta = c(1, 1)) {
      y * beta[[1]] ** 2 + z * 1 / beta[[2]]
    }
    
    f(y, z, beta)
    
    
    #> f(y, z, beta)
    # [1] 11 13 15 17 19 21 23 25 27 29
    

    编辑:

    感谢@Hans W. 的评论和对我的回答的改进。这是编辑:

    # define y & z in global working environment:
    y <- 1:10
    z <- 10:19
    
    # The function:
    f <- function(beta) {
      y * beta[[1]] ** 2 + z * 1 / beta[[2]]
    }
    
    # Find Jacobian:
    pracma::jacobian(f, c(1, 1))
    
    #       [,1] [,2]
    #  [1,]    2  -10
    #  [2,]    4  -11
    #  [3,]    6  -12
    #  [4,]    8  -13
    #  [5,]   10  -14
    #  [6,]   12  -15
    #  [7,]   14  -16
    #  [8,]   16  -17
    #  [9,]   18  -18
    # [10,]   20  -19
    

    【讨论】:

    • 首先感谢您的回答。我想我没有正确地提出我的问题。目标是生成在第一行代码中指定的函数。这样我就可以使用它来生成它的雅可比行列式。现在手动创建该函数会使用大量迭代。因此,我一直在寻找一个迭代过程,它会自动为 i 之前的所有值创建函数。有了你提供的东西,我不知道如何得到雅可比。
    • 函数jacobian()在哪个包中?
    • 这可以在 pracma 包中找到
    • 函数的结构如下:jacobian(f, x0, heps = .Machine$double.eps^(1/3), ...), 现在 f 是 n 个变量的 m 个函数.就我而言,我需要两个变量的 i 函数。我试图通过对函数进行编码来获得
    • 这个解决方案是正确的,不过最好把函数写成f=function(beta) beta[1]^2*y+z/beta[2]。然后pracma::jacobian(f,c(1,1)) 将返回 [,1] [,2] [1,] 2 -10 [2,] 4 -11 ...
    猜你喜欢
    • 2019-06-29
    • 2018-07-23
    • 2018-11-16
    • 2014-02-27
    • 1970-01-01
    相关资源
    最近更新 更多