如何用MATLAB 指令中的Monte Carlo法计算如下积分:
2个回答
展开全部
写一完整的比较费时,我给一个一次积分的求法,积分函数你可以任意写,一次积分就调用一次,两重积分就积分后再调用一次....
你如果matlab一点都不懂的话,下面程序你看不懂的。
其中,fun是exp(-x^2-y^2);你可以单独写一个.m文件或者inline。
下面是随机点法:
clear;clc;format long;
syms x
a=0 ;b=sin(x) ;
n=10^2 ;
k1=unifrnd(a,b,[1 n]);
for i=1:n
c1(i)=fun(k1(i));
end
c=min(c1-c1(n/2));d=max(c1+c1(n/2));
k2=unifrnd(c,d,[1 n]);
count=0;
for i=1:n
x(i)=k1(i);y(i)=k2(i);
if 0<y(i)&0<fun(x(i))&y(i)<fun(x(i))
count=count+1;
else if fun(x(i))<y(i)&fun(x(i))<0&y(i)<0
count=count+1;
end
end
end
u=(count/n)*((b-a)*(d-c))
u是积分后的函数,你再使用上面的方法积分一次(只不过上限和下限改变)
你如果matlab一点都不懂的话,下面程序你看不懂的。
其中,fun是exp(-x^2-y^2);你可以单独写一个.m文件或者inline。
下面是随机点法:
clear;clc;format long;
syms x
a=0 ;b=sin(x) ;
n=10^2 ;
k1=unifrnd(a,b,[1 n]);
for i=1:n
c1(i)=fun(k1(i));
end
c=min(c1-c1(n/2));d=max(c1+c1(n/2));
k2=unifrnd(c,d,[1 n]);
count=0;
for i=1:n
x(i)=k1(i);y(i)=k2(i);
if 0<y(i)&0<fun(x(i))&y(i)<fun(x(i))
count=count+1;
else if fun(x(i))<y(i)&fun(x(i))<0&y(i)<0
count=count+1;
end
end
end
u=(count/n)*((b-a)*(d-c))
u是积分后的函数,你再使用上面的方法积分一次(只不过上限和下限改变)
更多追问追答
追问
不好意思。我真的看不懂。虽然我MATLAB是懂一点点、、
书上要求说要用Monte Carlo算法。我只是在写M文件的时候出错了一直卡住了。你的方法我真的看不懂、
下面是我写的程序。你帮忙看下吧;同时很抱歉现在才有时间来处理、
clear;N=1000;
x=unifrnd0,pi,N,1);y=unifrnd0,sin(x),,N,1);
c1=(exp(-x.^2-Y.^2));
Nc=sum(c1);y=rand(N,1)
I=Nc/N*2;
追答
不瞒你说,你写的程序让我很受打击。
第一、Matlab大小写敏感;
第二、括号要配对;
第三、最重要的是你要对解决的问题有“鸟瞰”的认识,即蒙特卡罗的解决问题思想是什么,如何解决等。
我看你的程序,完全体会不到蒙特卡罗思想的精髓。但是为了让你能够运行,进行了第一、二的修改,并加上注释。
clear;N=1000;%内存变量清除和设置初始随机点数
x=unifrnd(0,pi,N,1);y=unifrnd(0,sin(x),N,1);%产生(0,pi)之间的N*1个随机点
c1=(exp(-x.^2-y.^2));%每个随机点计算值
Nc=sum(c1);y=rand(N,1);%将这些随机计算的值进行求和统计
I=Nc/N*2;%求均值
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
function y = MonteCarlo(fun,a,b,N)
A=unifrnd(a,b,N);
B=fun(A);
y=(b-a)/N^2*sum(sum(B));
自己编了个MonteCarlo求一维定积分的函数。在command里如下调用
fun=@(x) cos(x);
MonteCarlo(fun,-pi/2,pi/2,500) % N越大,结果可信度越高,速度也越慢。
用quad(fun,-pi/2,pi/2) 验证结果准确度。
A=unifrnd(a,b,N);
B=fun(A);
y=(b-a)/N^2*sum(sum(B));
自己编了个MonteCarlo求一维定积分的函数。在command里如下调用
fun=@(x) cos(x);
MonteCarlo(fun,-pi/2,pi/2,500) % N越大,结果可信度越高,速度也越慢。
用quad(fun,-pi/2,pi/2) 验证结果准确度。
追问
不好意思,对于这一题我不懂怎么运行你的程序,你能帮忙写出详细的过程么?谢谢了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询