II. CHỮA BÀI TẬP
E h I I h ba h
4.4.1 Cài đặt chương trình tổng quát trong MATLAB
Trong phần này, chúng tôi giới thiệu một chương trình MATLAB đã được cài đặt để thực hiện phương pháp Monte-Carlo tính tích phân có dạng:
... ( )
I F x dx
,
trong đó F(x) là hàm của xRn và miền lấy tích phân được mô tả bằng một bất phương trình có dạng x G x| 0 . Nếu được biểu diễn bởi một hệ bất phương trình có dạng
x G x| i( 0,i I
thì có thể đưa về dạng trên bằng cách đặt G(x)= i
i I
max G ( x )
. Giả thiết
thêm là miền nằm trong một hình hộp n-chiều {x | a≤ x ≤ b} và hàm F(x) là hàm bị chặn trong hình hộp đó: A ≤ F(x) ≤ B.
Nếu A 0 thì đây chính là bài toán tính thể tích của một siêu hình trụ cong (n+1)- chiều. Ngược lại nếu A<0 thì có thể thay thế nó bằng hiệu hai tích phân:
1 2 ... ( ) ... ( ) ... ( ) I F x dx F x dx F x dx , trong đó: F1(x) = ( ) nê'u ( ) 0 0 nê'u ( ) 0 F x F x F x và F2(x) = 0 nê'u ( ) 0 ( ) nê'u ( ) 0 F x F x F x .
Đặt Bound=[A B] và Box=[a b] là siêu hộp n-chiều và N là số điểm ngẫu nhiên cần gieo, mặc định của N =200000. Khi đó hàm để tính tích phân trên có thể cài đặt trong MATLAB như sau:
% MonteCarlo(F, Bound, G, Box, N) is a MATLAB function for % Intergration by Monte-Carlo Method;
function Tp=MonteCarlo(F, Bound, G,Box,N) if nargin == 4 N=200000; end V= Bound(2)-Bound(1); n=length(Box); M=0 ; for k=1: n V=V*(Box(k,2)-Box(k,1)); end for j =1:N
x = Box(:,1) + rand(n,1).*(Box(:,2)-Box(:,1)); %% Move x into Box y = Bound(1) + rand(1)*( Bound(2)-Bound(1));
if feval(G,x)<=0
if ( y >= 0) &( y <= feval(F,x)) %% y <=F1(x) M = M+1;
elseif (y < 0) &( y >=feval(F,x)) %% y >= F2(x) M= M -1;
end end end
Tp = V*M/N;
Kết quả thử nghiệm tính một số tích phân bội đã cho thấy sai số của phương pháp Monte-Carlo có thể “chấp nhận được”.