用蒙特卡罗方法计算定积分(随机投点法)matlab实现

本文介绍了蒙特卡罗方法,一种基于概率统计的数值计算技术,用于求解定积分。通过随机生成二维点,并判断点是否位于被积函数下方,利用大数定律估算积分值。提供的代码示例展示了如何运用该方法,并给出了一个具体的积分计算例子。此外,还讨论了线性变换的应用,以适应不同积分区间和值域。
摘要由CSDN通过智能技术生成

蒙特·卡罗方法(Monte Carlo method),也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法。

算法解释:

设   eq?0%5Cleqslant%20f%28x%29%5Cleqslant%201  求eq?f%28x%29在区间  eq?%5B0%2C1%5D  上的积分值

                                                      eq?J%3D%5Cint_%7B0%7D%5E%7B1%7Df%28x%29dx. 

设二维随机变量eq?%28X%2CY%29服从正方形eq?%7B0%5Cleqslant%20x%5Cleqslant%201%2C0%5Cleqslant%20y%5Cleqslant%201%7D上的均匀分布,可知eq?X%2CY服从eq?%5B0%2C1%5D均匀分布,且eq?X%2CY相互独立,又记事件

                                                    eq?A%3D%5Cleft%20%5C%7BY%5Cleqslant%20f%28x%29%20%5Cright%20%5C%7D

根据边际分布函数推导eq?A发生概率等于积分值(积分顺序交换):

                               eq?p%3Dp%28Y%5Cleqslant%20f%28x%29%29%3D%5Cint_%7B0%7D%5E%7B1%7D%5Cint_%7B0%7D%5E%7Bf%28x%29%7Ddydx%3D%5Cint_%7B0%7D%5E%7B1%7Df%28x%29dx

 根据如上推导,定积分的值eq?J即为事件eq?A发生概率eq?p(见图1)。而事件eq?A是一个二点分布,既每一次实验都只有1,0两种情况,且每次实验独立,根据伯努利大数定律我们可以用重复试验eq?A出现的频率作为eq?p的估计值,这种求积分的方法也叫随机投点法。既:

                                             eq?p%28%5Cleft%20%7C%20%5Cfrac%7BSn%7D%7Bn%7D-p%20%5Cright%20%7C%29%5Crightarrow%200%2C%5Cleft%20%28%20n%5Crightarrow%20%5Cinfty%20%5Cright%20%29

 

 

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6LS05Zyw6ICM6aOe,size_20,color_FFFFFF,t_70,g_se,x_16

                                                            图1  随机投点法

 

 当被积函数值域、积分区间不在eq?%5B0%2C1%5D上时,可通过对值域、积分区间做线性变换,即可转化为蒙卡特罗方法的领域之内,代码中包含线性转换,可通用于定积分计算。

代码如下:

%%蒙特卡罗方法计算定积分(随机投点法)
%%k累计数、x随机点、y随机点代表一组随机点(x(i),y(i)),z为转化后的被积函数

function [jifen]=kj(a,b,g,q)     %%输入(a,b)积分区域,g为t的匿名函数,q实验次数
k=0;                              %%累计y小于积分函数的次数
x=rand(1,q);                      %%生成随机数x,y组成(x(i),y(i))
y=rand(1,q);
t=x*(b-a)+a;                      %%积分区域与(0,1)区间线性转换

for i=1:1:length(x)
    g1(i)=g(t(i));
end

s=[t;g1];                         %% 得g(t)
c=min(s(2,:));                    %%得出被积函数在积分区域的上下限
d=max(s(2,:));

for i=1:1:q                      %%转化函数,线性转化将g(x)函数转化为指定定义域,值域的函数
    m=find(s(1,:)==t(i));        %%解决问题一
    if length(m)>2               %%解决问题二
        m=m(1);
        y1(i)=(s(2,m)-c)*(1/(d-c));
    else
        y1(i)=(s(2,m)-c)*(1/(d-c));
    end
end

for i=1:1:q                        %%转化后的函数进行卡蒙特罗随机试验
    if y(i)<y1(i)
        k=k+1;
    end
end
y2=k/length(x);                     %%卡蒙特罗实验结果
jifen=(b-a)*(d-c)*y2+c*(b-a)        %%g(X)逆向推理,根据积分性质得到积分值
end



%%三个问题1、x=y时,2、两个x相等时,3、给出确定的最大值最小值,4、形参为输入函数

 使用方法:输入积分上限b,积分下限a,投点次数q,变量为t的匿名函数g

举例:求积分           eq?%5Cint_%7B2%7D%5E%7B3%7Dx%5E%7B3%7D&plus;%5Cfrac%7B1%7D%7B2%7Dx%5E%7B2%7D&plus;5x%20dx  

>> a=2;
>> b=3;
>> g=@(t) t.^3+1/2*t.^2+5*t;
>> q=10000;
>> [jifen]=kj(a,b,g,q);

jifen =

   32.0070

 求解完毕!

 

如对线性转换具体操作方面感兴趣,欢迎留言。

 

 

 

 

  • 16
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贴地而飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值