a)创建一个长度为20的向量X,其中第k个元素为X = 2k,k = 1 ... 20。打印出X的值。
b)创建一个长度为20的向量Y,Y中的所有元素都等于0.打印出Y的值。
c)使用for循环,在Y中重新分配第k个元素的值,k = 1 ... 20。当k <在图12中,Y的第k个元素被重新指定为k的余弦。当k≥12时,Y的第k个元素被重新分配为0到K之间的积分sqrt(t)dt的值。
前两个问题,很简单。
> x1 <- seq(1,20,by=2)
> x <- 2 * x1
> x
[1] 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40
> y <- rep(0,20)
> y
[1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
我被困在最后一个,
t <- function(i) sqrt(i)
for (i in 1:20) {
if (i < 12) {
y[i] <- cos(i)
}
else if (i >= 12) {
y[i] <- integral(t, lower= 0, Upper = 20)
}
}
y // print new y
有什么建议吗?谢谢。
答案 0 :(得分:2)
可能有帮助的是,计算一维积分的命令是integrate
而不是integral
。
你已经成功完成了前两个,所以我将演示一种获取这些向量的不同方法:
x <- 2 * seq_len(20)
y <- double(length = 20)
至于你的功能,你有正确的想法,但你需要稍微清理一下你的语法。例如,您可能需要仔细检查大括号(使用像Hadley Wickham's这样的设置样式将帮助您防止语法错误并使代码更具可读性),您不需要其他的“if”,你需要阅读integrate
并查看它的输入,重要的是它的输出(以及你需要哪些以及如何提取它),最后,你需要{ {1}}来自您的函数的值。希望这足以帮助您自己解决问题。祝你好运!
鉴于已发布工作答案,这就是我在查看您的问题时所做的。我认为这是值得发布的,因为我认为这是一个好习惯1)预先分配答案2)通过不重复使用输入变量名作为输出来防止对范围的混淆3)使用seq_len和seq_along对于for循环的构造,在我看来,每个R Inferno(pdf)是必读的:
return
返回:
tf <- function(y){
z <- double(length = length(y))
for (k in seq_along(y)) {
if (k < 12) {
z[k] <- cos(k)
} else {
z[k] <- integrate(f = sqrt, lower = 0, upper = k)$value
}
}
return(z)
}
答案 1 :(得分:1)
说实话,你几乎已经准备好了,你在这里展示了一些代码是好的:
y <- rep(0,20) #y vector from question 2
for ( k in 1:20) { #start the loop
if (k < 12) { #if k less than 12
y[k] <- cos(k) #calculate cosine
} else if( k >= 12) { #else if k greater or equal to 12
y[k] <- integrate( sqrt, lower=0, upper=k)$value #see below for explanation
}
}
print(y) #prints y
> print(y)
[1] 0.540302306 -0.416146837 -0.989992497 -0.653643621 0.283662185 0.960170287 0.753902254 -0.145500034 -0.911130262 -0.839071529 0.004425698
[12] 27.712816032 31.248114562 34.922139530 38.729837810 42.666671456 46.728535669 50.911693960 55.212726149 59.628486093
首先,stats::integrate
是计算积分
integrate( sqrt, lower=0, upper=2)$value
第一个参数是一个函数,在您的情况下是sqrt
。 sqrt
已在R中定义,因此无需将其自己明确定义为t <- function(i) sqrt(i)
您在代码中正确设置的其他两个参数是lower
和upper
。
函数integrate( sqrt, lower=0, upper=2)
将返回:
1.885618 with absolute error < 0.00022
这就是为什么你需要integrate( sqrt, lower=0, upper=2)$value
才能提取值。
在控制台中输入?integrate
以查看对我来说有用的文档。