2012-04-15 88 views
1

嘿,我的模拟有问题。Ruby中的蒙特卡洛模拟

我是Ruby-Starter,不知道我的代码中出了什么问题。这只是与模拟部分:

def mean 
mean = self.reduce(:+)/self.length.to_f 
return mean 
end 

def randn 
    begin 
    rg1 = (rand*2)-1 
    rg2 = (rand*2)-1 
    q = rg1**2 + rg2**2 
    end while (q == 0 || q > 1) 
    p = Math.sqrt((-2*Math.log(q))/q) 

    rn1 = rg1 * p 
    rn2 = rg2 * p 
    return rn1, rn2 
end 

monte_carlo = 10 
ren1_sim = Array.new 
ren2_sim = Array.new 

monte_carlo.times { 
(1..20).each{ |i| 
(1..250).each { |j| 
    r = randn() 
    ren1= * Math.exp(mu_ren1 + sigma_ren1 * r[0]) 
    # ren1 is an array with prices, mu_ren1 and sigma_ren1 are individual values 

    ren2= * Math.exp(mu_ren2 + chol_21 * r[0] + chol_22 * r[1]) 
    # chol_21 and chol_22 are also individual values 

    ren1_sim.push(ren1) 
    ren2_sim.push(ren2) 
    } 
    } 
} 
puts ren1_sim.mean 
puts ren2_sim.mean 

我不没有最后两个穿得到一个错误,但是当我要计算阵列的平均ren1_sim和rent_sim我得到的错误:

undefined method 'mean' for #<Array:0x2acf318> (NoMethodError) 

你知道如何解决这个问题吗?

回答

3

你试图调用meanArray,这不是Array方法的平均值。也许你打算使用Statsample::Vector,这是Statsample的扩展名Array,并且确实有mean

ren1_sim = Statsample::Vector.new 
ren2_sim = Statsample::Vector.new 

您也可以拨打to_vectorArray实例获得Statsample::Vector

+0

好的,但是当我使用方法mean(s.o.)来计算数组的平均值时。但我仍然得到相同的错误。代码中必须有其他错误吗? – jeffrey 2012-04-15 10:10:48

0

看看这个帖子来计算阵列

How do I create an average from a Ruby array?

+1

请不要简单地发布其他问题的链接,如果您认为另一个问题完全回答了这个问题,您应该投票结束重复。 – 2012-04-15 00:16:01

+0

我刚试过。平均值是来自statsample gem的平均值的一种方法...您确定其余代码没有错误吗? – jeffrey 2012-04-15 00:16:03

2

您已经在文件顶部定义了一个mean方法,但它只是在顶层对象上创建一个方法,并且您试图在单个数组上调用它。你可以要么代码更改

def mean(array) 
    array.reduce(:+)/array.length.to_f 
end 

,然后改变后来就mean(ren1_sim)

你对它的使用或更改代码,以便您添加的方法来排列,即

class Array 
    def mean 
    self.reduce(:+)/self.length.to_f 
    end 
end 
+0

我仍然得到相同的错误“未定义的方法”/'为#阵列:0x3462738“。模拟中一定有错误。当我打印出数组ren_sim1中的值时,我发现每次迭代都会产生相同的值。但为什么? r [0]和r [1]中的随机数对于每次迭代都应该改变......我正在寻找两个数组(ren_sim1和ten_sim2),其中包含sim1和sim2中的计算值,用于monte carlo的每次迭代模拟.... – jeffrey 2012-04-15 10:39:10

+0

@ FrederickCheung好的,我想我已经找到了问题。数组ren1_sim包含模拟的每个值的数组。所以我有问题用于其他计算。你知道如何写入“正常数组”的值吗? – jeffrey 2012-04-15 11:07:04

+1

因为你在做'ren1 = * Math.exp(...)'这意味着'ren1'将是一个具有1值的数组,所以ren1看起来确实像'[[1],[2],...] – 2012-04-16 04:40:00