التجربة الافتراضية هى محاكاة عددية تعتمد بشكل جوهرى على احدى طرق مونتى كارلو..
الشيئ المشترك فى جميع طرق مونتى كارلو هو مولد الاعداد العشوائية..
هذا هو البنزين-العدد العشوائى-للمحرك-طريقة مونتى كارلو-
كتابة مولدات الاعداد العشوائية التى تنجج و تمر عبر اختبارات الاعداد العشوائية هو فن و علم وتخصص من اغرب ما يكون..
عموما فى محاكياتنا العددية نستخدم مولدات عشوائية معروفة و مشهورة اختبرها الناس منذ عقود مثلا ال ran2-وهذا الذى استعمله شخصيا- و ranlux -الذى يستخدم فى الكروموديناميك على الشبكة و الذى كتبه الفيزيائى الالمانى الشهير لوشر Luscher- وهناك ايضا ال rand وهو الذى تجدونه على انظمة اللينيكس Linux كاحدى دوال النظام الاصلية وغيرها..
كل هذه الطرق تستخدم بشكل او بآخر-لكن ذكى جدا جدا جدا- طريقة الموائم الخطى linear congruent method ..
ادناه تجدون هذه الطريقة مشفرة بالفورترون Fortran كعينة..
اولد الاعداد العشوائية ثم اختبرهم بعدة طرق للتحقق اذا كانوا فعلا شبه عشوائيين..لا احتاج ان اذكركم انه يستحيل رياضيا ان نولد عدد عشوائى..نحن فى الحقيقة نولد عدد شبه عشوائى يتصرف كعدد عشوائى بمعنى انه يمر عبر اختبارات معينة-مثل تلك الموجودة فى الشفرة ادناه- وهذا افضل ما يمكن ان نقوم به..اما الطبيعة فهى تولدهم بسهولة عجيبة...
كل شخص يعيد كتابة الشفرة ادناه فى لغة البرمجة التى تساعده..
فى الشفرة ادناه التعليقات-اى التى لا يراها النظام عند التجميع compilation- هى المذكورة بعد
c.......
جميع الحقوق محفوظة ل ب.ي..
الشيئ المشترك فى جميع طرق مونتى كارلو هو مولد الاعداد العشوائية..
هذا هو البنزين-العدد العشوائى-للمحرك-طريقة مونتى كارلو-
كتابة مولدات الاعداد العشوائية التى تنجج و تمر عبر اختبارات الاعداد العشوائية هو فن و علم وتخصص من اغرب ما يكون..
عموما فى محاكياتنا العددية نستخدم مولدات عشوائية معروفة و مشهورة اختبرها الناس منذ عقود مثلا ال ran2-وهذا الذى استعمله شخصيا- و ranlux -الذى يستخدم فى الكروموديناميك على الشبكة و الذى كتبه الفيزيائى الالمانى الشهير لوشر Luscher- وهناك ايضا ال rand وهو الذى تجدونه على انظمة اللينيكس Linux كاحدى دوال النظام الاصلية وغيرها..
كل هذه الطرق تستخدم بشكل او بآخر-لكن ذكى جدا جدا جدا- طريقة الموائم الخطى linear congruent method ..
ادناه تجدون هذه الطريقة مشفرة بالفورترون Fortran كعينة..
اولد الاعداد العشوائية ثم اختبرهم بعدة طرق للتحقق اذا كانوا فعلا شبه عشوائيين..لا احتاج ان اذكركم انه يستحيل رياضيا ان نولد عدد عشوائى..نحن فى الحقيقة نولد عدد شبه عشوائى يتصرف كعدد عشوائى بمعنى انه يمر عبر اختبارات معينة-مثل تلك الموجودة فى الشفرة ادناه- وهذا افضل ما يمكن ان نقوم به..اما الطبيعة فهى تولدهم بسهولة عجيبة...
كل شخص يعيد كتابة الشفرة ادناه فى لغة البرمجة التى تساعده..
فى الشفرة ادناه التعليقات-اى التى لا يراها النظام عند التجميع compilation- هى المذكورة بعد
c.......
جميع الحقوق محفوظة ل ب.ي..
program randomnumber1
integer i,M,idum,N,k
c.........modulus.......
parameter (M=32768)
doubleprecision r1,a,c,x,r(1:M),xN,ran2,sum,sum1,sum2
integer i,M,idum,N,k
c.........modulus.......
parameter (M=32768)
doubleprecision r1,a,c,x,r(1:M),xN,ran2,sum,sum1,sum2
c........seed...
r1=12.0d0
c.....multiplier
a=899
c.....increment...
c=0
r1=12.0d0
c.....multiplier
a=899
c.....increment...
c=0
c....this generates random numbers r1,...,rM in range [0,1] according to power residue method
r(1)=r1
sum=r1
c.......M is the maximum possible period
do i=1,M-1
x=a*r(i)+c
r(i+1)=mod(x,M)
r(i+1)=r(i+1)
sum=sum+r(i+1)
c...this allows us to draw a scatter plot...
write(10,*)i,r(i+1)/M
enddo
r(1)=r1
sum=r1
c.......M is the maximum possible period
do i=1,M-1
x=a*r(i)+c
r(i+1)=mod(x,M)
r(i+1)=r(i+1)
sum=sum+r(i+1)
c...this allows us to draw a scatter plot...
write(10,*)i,r(i+1)/M
enddo
c...normalizing the random numbers between 1 and 2...
do i=1,M
r(i)=r(i)/M
enddo
do i=1,M
r(i)=r(i)/M
enddo
c....this is a test for uniformity and randomness...
sum=sum/M**2
write(*,*)"sum=", sum
c....this is a test for correlation
do k=1,3000,15
sum1=0
sum2=0
do i=1,M-k
sum1=sum1+r(i)*r(i+k)
enddo
do i=1,M
sum2=sum2+r(i)*r(i)
enddo
sum1=sum1/(M-k)
sum2=sum2/M
sum2=1/(sum2-sum*sum)
sum2=sum2*(sum1-sum*sum)
write(11,*)k,sum1
write(12,*) k, sum2
enddo
c......test for period:random walk in one dimension
c....random walk position
xN=0
c........seed for attached function ran2
c idum=-12357
N=M
do i=1,N
c........Power Residue Method
x=r(i)
if(x.lt.0.5)then
xN=xN+1
else
xN=xN-1
endif
write(20,*)i,xN
enddo
sum=sum/M**2
write(*,*)"sum=", sum
c....this is a test for correlation
do k=1,3000,15
sum1=0
sum2=0
do i=1,M-k
sum1=sum1+r(i)*r(i+k)
enddo
do i=1,M
sum2=sum2+r(i)*r(i)
enddo
sum1=sum1/(M-k)
sum2=sum2/M
sum2=1/(sum2-sum*sum)
sum2=sum2*(sum1-sum*sum)
write(11,*)k,sum1
write(12,*) k, sum2
enddo
c......test for period:random walk in one dimension
c....random walk position
xN=0
c........seed for attached function ran2
c idum=-12357
N=M
do i=1,N
c........Power Residue Method
x=r(i)
if(x.lt.0.5)then
xN=xN+1
else
xN=xN-1
endif
write(20,*)i,xN
enddo
return
end
No comments:
Post a Comment