2012-04-15 13 views
1

Hey, ich habe ein Problem mit meiner Simulation.Monte-Carlo-Simulation in Ruby

Ich bin ein Ruby-Starter und weiß nicht, was in meinem Code falsch ist. Das ist nur der Teil mit der Simulation:

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 

Ich habe keinen Fehler ohne die letzten zwei Puts, aber, wenn ich den Durchschnitt des Arrays berechnen will ren1_sim und rent_sim ich den Fehler:

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

Wissen Sie, wie Sie das beheben können?

Antwort

3

Sie versuchen zu berechnen mean auf einem Array aufzurufen, die keine Methode Array ist. Vielleicht wollten Sie Statsample::Vector verwenden, was Statsamples Erweiterung von Array ist, und hat mean?

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

Sie können auch to_vector auf einer Array Instanz rufen Sie einen Statsample::Vector zu bekommen.

+0

ok, aber wenn ich die Methode mean (s.o.) verwende, um den Durchschnitt der Array zu berechnen. aber ich bekomme immer noch den gleichen Fehler.Es muss ein anderer Fehler im Code sein? – jeffrey

0

haben einen Blick auf diesen Beitrag den Durchschnitt einer Reihe

How do I create an average from a Ruby array?

+1

Bitte poste nicht einfach einen Link zu einer anderen Frage, wenn du denkst, dass eine andere Frage diese vollständig beantwortet, solltest du dafür stimmen, als Duplikat zu schließen. –

+0

Ich habe es gerade versucht. Mean ist eine Methode aus dem Statsample-Juwel für den Durchschnitt ... Bist du sicher, dass der Rest des Codes fehlerfrei ist? – jeffrey

2

Sie haben am Anfang Ihrer Datei eine mean-Methode definiert, die jedoch nur eine Methode auf dem Objekt der obersten Ebene erstellt und Sie versuchen, sie auf einem einzelnen Array aufzurufen. Entweder könnte diesen Code

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

ändern und dann Ihre Nutzung der es später

oder Code ändern zu mean(ren1_sim) ändern, so dass Sie die Methode Array hinzufügen, dh

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

Ich bekomme immer noch den gleichen Fehler "undefined Methode '/' für #Array: 0x3462738". In der Simulation muss etwas nicht stimmen. Wenn ich die Werte im Array ren_sim1 ausdrucke, sehe ich, dass jede Iteration die gleichen Werte erzeugt. aber warum? die Zufallszahl in r [0] und r [1] sollte sich für jede Iteration ändern ... Ich suche nach zwei Arrays (ren_sim1 und ten_sim2), die die Werte aus der Berechnung in sim1 und sim2 für jede Iteration des monte carlo enthalten Simulation .... – jeffrey

+0

@ FrederickCheung Ok, ich denke, ich habe das Problem gefunden. Das Array ren1_sim enthält für jeden Wert der Simulation ein Array. daher habe ich Probleme, es für andere Berechnungen zu verwenden. Weißt du, wie man die Werte in ein "normales Array" schreibt? – jeffrey

+1

ren1 wird in der Tat aussehen wie '[[1], [2], ...]', weil Sie 'ren1 = * Math.exp (...)' tun, was bedeutet, dass 'ren1' ein Array mit 1 Wert ist –