我的目标是对 0 和 1 之间的可微函数的导数的平方进行积分:我尝试了 2 个代码: 尝试1:
expToFunc <- function(f) {
#input as an expression in terms of x
function(x) eval(f)
}
int <- function(f) {
Df2 <- substitute(expression(y^2), list(y = D(f,'x')))
integrate(expToFunc(Df2),0,1)
}
int(expression(x*(x-1)))
返回 integrate(expToFunc(Df2), 0, 1) 中的错误:函数求值给出的结果长度错误。
,
我认为我的第一个函数没有按预期运行 expToFunc(expression(x*(x-1)))
返回 function(x) eval(f)
,所以代码将 f
解释为该字母而不是输入?
尝试2 类似,只是尝试使用表达式字符串将表达式转换为函数
expToFunc <- function(str) {
#input as a string in terms of x
function(x) str
}
int <- function(f) {
Df2 <- substitute(expression(y^2), list(y = D(f,'x')))
integrate(expToFunc(Df2[[1]]),0,1)
}
int(expression(x*(x-1)))
它返回与尝试 1 相同的结果,并且用 Df2[[2]]
代替 Df2[[1]]
令人困惑
Df2 <- substitute(expression(y^2), list(y = D(expression(x * (x-1)),'x')))
Df2[[1]]
% expression
Df2[[2]]
% ((x - 1) + x)^2
我显然缺少表达式类或集成函数的某些内容,但我不确定是什么。非常感谢任何帮助。
最佳答案
1) 计算表达式并将其分配给函数 f
的主体。然后积分f
。
int <- function(expr) {
f <- function(x) {}
body(f) <- eval(substitute(expression(y^2), list(y = D(expr,'x'))))
integrate(f, 0, 1)
}
int(expression(x*(x-1)))
## .3333333 with absolute error < 3.7e-15
2) 这种变体也有效。
int2 <- function(expr) {
f <- function(x) {}
body(f) <- eval(substitute(D(expr, "x")))
integrate(function(x) f(x)^2, 0, 1)
}
int2(expression(x * (x - 1)))
## .3333333 with absolute error < 3.7e-15
3) gsubfn包中的as.function.formula可以将公式变成函数。
library(gsubfn)
int3 <- function(fo) {
integrate(function(x) as.function(fo)(x)^2, 0, 1)
}
int3(~ x*(x-1))
## .3333333 with absolute error < 3.7e-15
关于R:将表达式转换为积分函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73903171/