Importance Sampling
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?
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
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.
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) $
ovviamente sono a disposizione per commentare il codice o altro
grazie
$ \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

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)
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)