Importance Sampling

querty-votailprof
ho fatto dei "giochetti" nel calcolare un integrale con hit or miss , sample mean , variabili antitetiche e
Importance Sampling.

Dagli esperimenti è risultato che per n piccolo Importance Sampling è buono (il migliore)

ma per n grande a differenza degli altri tende ad un valore errato e aumentando il numero dei campioni la stima non migliora.

io credo che questo sia corretto.. perchè Importance Sampling da un approssimazione del risultato.

che ne pensate?

Risposte
apatriarca
Penso che se non converge al risultato corretto con l'aumentare del numero di campioni, hai implementato il metodo in modo errato. Mostra il codice che hai usato per fare i tuoi esperimenti.

querty-votailprof
devo trovare il valore di questo integrale

$ \int_0^1 cos(x\frac{\pi}{2})=\frac{2}{\pi}=0.63662 $

$ f(x)=frac{pi}{2}x $
con x numeri casuali con distribuzione g(x)

$ g(x)=frac{3}{2}(1-x^2) $

public class IS{
  public static void main (String args []){
    //numero di iterazioni
    final double NUMERO=50001;
    //approssimazione di pi greco
    final double PII=3.141592653589793;
    
    //variabili locali nella tecnica di reiezione
    double im=0;
    double im1=0;
    double im2=0;
    //valore i importance sampling
    double is=0;
    //contatore per stampare solo 100 risultati
    int count=0;
    
    for(int i=0; i<NUMERO; i++){

//(tecnica di reiezione)
        while(true){
        im1=Math.random();
          im1=im1*(3/2);
        im2=Math.random();
          if(im1<=3*(1-im2*im2)/2){
            im=im2;
            break;
          }
        }

is += ((Math.cos(PII*im/2))/((3*(1-im*im))/2)); 

if(count==500){
    System.out.println(is/(i+1));
count=0;
}

count++;

}
  }
}


ovviamente sono a disposizione per commentare il codice o altro :D grazie

querty-votailprof
errore trovato!

basta correggere l'if della tecnica di reiezione in questo modo

if(im1<=(3/2)*(1-(im2*im2))){

grazie per la dritta, (mi hai detto che c'era un errore)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.