如何使用while循环查找值的交叉点

时间:2013-09-01 05:28:40

标签: r

我是新来的和R.

问题是Par1(第1人)和第2人(第2人)最初在股票市场分别以400美元和120美元开始。 Par1将以每天10%的速度增加收入,而Par2则以20%/天的速度增加。我想出了如何写出一个循环方程来填补30天的收益。但是,我想使用“while循环和打印命令”来查找Par2增益不再低于标准1的那一天。

总结: Par1起价400美元,每天增加10% Par2从120美元开始,每天增加20%

使用while循环和打印功能,Par2何时会超过Par1。谢谢!!

用于为每个PAR(人)提供30天的每日收益的代码

 rm(list=ls())        #removes any lists from the workspace
    graphics.off()    #clears any graphics

   Par1=rep(0,30);    #sets vector of 30 zeros
   Par1[1]=400        #fill first position with 400
     Par2=rep(0,30);  #sets vector of 30 zeros
      Par2[1]=120     #fill first position with 120


   for (n in 2:30)              #For time points 2 through 30 (days 2 through 30)

 {                              #Start loop

       Par1[n]=Par1[n-1]*1.10   #Formula that calculates daily gains by 10%

         Par2[n]=Par2[n-1]*1.20 #Formula that calculates daily gains by 20%

  }                             #End loop

我需要一个while循环和打印命令来查找Par2> Par1的时间,如下所示:

  while (Par2<Par1) 
     {  "commands" 
         }
      print("day")

非常感谢任何帮助。谢谢!

3 个答案:

答案 0 :(得分:1)

为什么需要一个while循环?

floor(log(400/120)/log(1.2/1.1) + 1)

注意:这里的索引是从0开始的,这意味着它们有400美元的初始日期和120美元被认为是第0天。

答案 1 :(得分:1)

运行第一段代码后,在控制台中输入Par2 < Par1。看到你得到一个逻辑向量。找到逻辑向量的while不是您想要的。

查看which命令,从逻辑向量中提取TRUE值的索引。我想你可能会接近你想要的东西:

> min(which(Par2 > Par1))
[1] 15

另请注意,代码的第一部分不是很像R。我得到了相同的结果,用

替换了整个第一部分
Par1 <- 400*(1.10)^(0:29)
Par2 <- 120*(1.20)^(0:29)

您可以使用all.equal进行验证。这只是使用向量化操作构建变量并避免使用for的可能方法之一。

答案 2 :(得分:0)

感谢您的建议。我请求“while循环”的原因是因为这是一个类 - 这是作业。我能够弄明白......到目前为止,在学习R时,我的情况往往过于复杂。以下是我的答案:

> rm(list=ls())         #removes any lists from the workspace
> graphics.off()        #clears any graphics 
> Par1=400              #Sets Par1 at 400
> Par2=120              #Sets Par2 at 120
> day=1                 #Begin sumulation on day 1
> while (Par2<Par1)     #While Par2 is less than Par1
> {                     #begins loop
>  Par1=Par1*1.10       #Par1 gains 10% per day
>  Par2=Par2*1.20       #Par2 gains 20% per day
>  day=day+1            #Cycle throuh one day at a time
>}                      #Closes loop
>print(day)             #Output the day that Par2 surpasses Par1