如何在RStudio中用for循环实现累积求和方程?
解决R中离散时间累积求和方程的问题
首先,咱们先拆解你的需求:你要计算的Zsec序列本质是系数乘以Zprm序列的累积和,完全不需要用for循环来实现,R的内置函数cumsum()就能直接搞定,而且效率更高。
最优解法
先定义你的固定系数:
coeff <- gamma * ((1 + c4) / (r + c4))
然后直接生成符合要求的Zsec向量:
Zsec <- coeff * cumsum(Zprm)
这样Zsec[1]就是coeff*Zprm[1],Zsec[2]是coeff*(Zprm[1]+Zprm[2]),完全匹配你给出的方程形式,一步到位。
分析你之前两种写法的问题
第一种for循环写法
for (t in Time) print(cumsum({gamma*((1+c4)/(r+c4))*Zprm[t]}))这里每次循环只取
Zprm的单个元素(比如Zprm[1]、Zprm[2]),cumsum()作用在单个数值上时,结果就是这个数值本身——因为单个值的累积和就是它自己,所以和移除cumsum()的输出完全一致,自然达不到你要的“累加前面所有项”的效果。第二种for循环写法
total=0 for (t in Time) print({total <- total + (gamma*((1+c4)/(r+c4))*Zprm[t])})这个写法逻辑上是对的(每次把当前项加到total里),但有两个小问题:
- 你只是打印了每次更新后的total,没有把结果存储到一个向量里,后续没法复用完整的
Zsec序列; - 这种手动循环的效率远不如内置的
cumsum(),尤其是当Zprm长度很大的时候。
- 你只是打印了每次更新后的total,没有把结果存储到一个向量里,后续没法复用完整的
如果你一定要用for循环实现(学习目的)
如果出于学习想手动写循环,可以这样做:
# 先初始化和Zprm长度相同的空向量 Zsec <- numeric(length(Zprm)) total <- 0 coeff <- gamma * ((1 + c4) / (r + c4)) for (t in seq_along(Zprm)) { total <- total + coeff * Zprm[t] Zsec[t] <- total # 把每次的累积值存到Zsec的对应位置 } # 查看结果 print(Zsec)
内容的提问来源于stack exchange,提问作者J. Bl
相关产品推荐
相关产品推荐

