matlab下二重积分的蒙特卡洛算法

时间:2022-01-14 06:04:05

%%monte_carlo_ff.m

%被积函数(二重)

function ff=monte_carlo_ff(x,y)

ff=x*y^2;%函数定义处

end

%%monte_carlo.m

%蒙特卡洛计算二重积分
function result=monte_carlo(a,b,c,d,n,m)
%先y后x积分,a是x积分下限,b是x积分上限,c是y积分下限,d是y积分上限,n,m是蒙特卡洛参数
sumxff=0;
for i=1:n
sumyff=0;
xff=a+(b-a)*rand();
for j=1:m
yff=c+(d-c)*rand();
sumyff=sumyff+monte_carlo_ff(xff,yff);
end
aversumyff=sumyff/m;
sumxff=sumxff+(b-a)*aversumyff;
end
result=sumxff/n;
end

%%show.m

clear all;
clc;
format long;
%二重积分的int函数法,用于校对蒙特卡洛法
syms x y;
z=x^2*y^2;
x1=1;
x2=2;
y1=3;
y2=4;
disp('int法结果')
ans_int=int(int(z,y,y1,y2),x,x1,x2)
%蒙特卡洛法计算结果
disp('monte_carlo法结果')
ans_monte_carlo=monte_carlo(1,2,3,4,10000,20000)
%二者误差
disp('误差')
error=abs(ans_monte_carlo-ans_int)