/* Monte-Carlo simulation code for statistical physics Copyright (C) 2001-2005 Sylvain Reynal Département de Physique Ecole Nationale Supérieure de l'Electronique et de ses Applications (ENSEA) 6, avenue du Ponceau, F-95014 CERGY CEDEX et Laboratoire de Physique Théorique et Modélisation (LPTM) Université de Cergy-Pontoise - Site de Neuville F-95031 CERGY CEDEX Tel : 00 +33 130 736 245 Fax : 00 +33 130 736 667 e-mail : reynal@ensea.fr web page : http://www.ensea.fr/staff/reynal/ */ package fr.ensea.montecarlo.data; import com.imsl.math.Complex; import fr.ensea.chart.Curve2D; import fr.ensea.chart.Point2D; import fr.ensea.math.FFT; import java.util.Vector; import java.awt.Color; /** * Cette classe permet de stocker une série d'échantillons d'une grandeur thermodynamique obtenus au cours d'une simulation, * puis de calculer quelques estimateurs statistiques de cette série. * */ public class Samples extends Vector implements Curve2D { private double minX, minY, maxX, maxY; private Histogram histo; private boolean autocomputeCorrelationTime=false; private Double correlationTime; private int mcsWait=1, mcsTherm=0; private final static double LOG2 = Math.log(2); /** * Construit un nouveau conteneur d'échantillon, initialement vide. */ public Samples(){ minX= minY= maxX= maxY=0; // pas encore initialisé } /** * Ajoute un nouvel échantillon */ public synchronized void addSample(double sample){ addElement(new Double(sample)); if (size()==1){ // premier élément ajouté minY = maxY = sample; } else { if (sample < minY) minY = sample; else if (sample > maxY) maxY = sample; } maxX = size(); if (histo != null) histo.updateIncremental(sample); // recompute correlation time ? if (autocomputeCorrelationTime){ double n = log2(size()); if (n==Math.floor(n)) computeCorrelationTime(); } } /** * Retourne le ième échantillon */ public synchronized double getSample(int i){ if (i>=size()) return 0.0; return ((Double)elementAt(i)).doubleValue(); } public void clear(){ super.removeAllElements(); if (histo != null) histo.update(); } /////////////////////////////////////// //// Statistiques /////////////////////////////////////// /** * Calcule et retourne */ public synchronized double computeMean(){ if (isEmpty()) return 0.0; int inc=0; if (mcsWait<1) inc = (int)(2.0*getCorrelationTime()); else inc = mcsWait; double mean = 0; int n=0; for (int i=mcsTherm; i - (i.e. les fluctuations thermodynamiques de la grandeur thermodynamique) * @param mean la moyenne de la série d'échantillons, préalablement obtenue en invoquant "computeMean()". */ public synchronized double computeVariance(double mean){ if (isEmpty()) return 0.0; int inc=0; if (mcsWait<1) inc = (int)(2.0*getCorrelationTime()); else inc = mcsWait; double sumOfSquaress = 0; int n=0; for (int i=mcsTherm; i²]/chi(0) * The computed time may then be retrieved by calling getCorrelationTime(); */ public synchronized void computeCorrelationTime(){ if (size()==0) { this.correlationTime = new Double(1.0); return; } // ensure length= 2**n : int n = (int)Math.floor(log2(size())); if (n < 5) { this.correlationTime = new Double(1.0); return; // if less than 32, not reliable => return 1.0 } int npts=1; for (int i=0; i