计算任意重积分

  • 一.基本问题
  • 二.问题的分析
  • 三.matlab实现代码
    • 1.基本的求解函数intCal.m
    • 2.多重积分计算的GUI实现
      • (1)基本架构
      • (2)结果显示
  • 四.结论拓展
  • 五.直接调用代码

用matlab设计计算一般多重积分的算法和GUI界面

一.基本问题

​ 先考虑计算多重积分的问题:
∫Ωf(x→)dΩ\int_{\Omega}f(\overrightarrow x)d \Omega ∫Ω​f(x)dΩ
​ 其中:x→=(x1,x2,...xn)T\overrightarrow x = (x_1,x_2,...x_n)^Tx=(x1​,x2​,...xn​)T ,且Ω:{(x1,x2,...xn)∣A(x→)<0}\Omega:\{(x_1,x_2,...x_n)|A(\overrightarrow x)<0\}Ω:{(x1​,x2​,...xn​)∣A(x)<0},其中AAA是(x1,x2,...xn)(x_1,x_2,...x_n)(x1​,x2​,...xn​)总的约束方程,为p×1p\times 1p×1维的向量。且对每个xi(i=1,2,3...n)x_i(i = 1,2,3...n)xi​(i=1,2,3...n)都有下界约束:a→:[a1,a2,.ai,..an]\overrightarrow a:[a_1,a_2,.a_i,..a_n]a:[a1​,a2​,.ai​,..an​],同时都是上界约束:

b→:[b1,b2,.bi,..bn]\overrightarrow b:[b_1,b_2,.b_i,..b_n]b:[b1​,b2​,.bi​,..bn​]。在这里我们求这个多重积分的积分值计算函数(用Matlab求解)同时绘制GUI界面,同时估计其精度。

二.问题的分析

Input:Input:Input:f(x1,x2,..xn)f(x_1,x_2,..x_n)f(x1​,x2​,..xn​),a:(a1,a2,...an)Ta:(a_1,a_2,...a_n)^Ta:(a1​,a2​,...an​)T,b:(b1,b2,...bn)Tb:(b_1,b_2,...b_n)^Tb:(b1​,b2​,...bn​)T,A:(A1(x1,x2,...xn),A2(x1,x2...xn),...Ap(x1,x2,..xn))TA:(A_1(x_1,x_2,...x_n),A_2(x_1,x_2...x_n),...A_p(x_1,x_2,..x_n))^TA:(A1​(x1​,x2​,...xn​),A2​(x1​,x2​...xn​),...Ap​(x1​,x2​,..xn​))T

Output:IntValue,errorOutput:IntValue,errorOutput:IntValue,error

用MonteCarloMonteCarloMonteCarlo方法计算多重积分的值:

考虑产生在[a→,b→][\overrightarrow a,\overrightarrow b][a,b]内的均匀随机变量ζ→\overrightarrow \zetaζ​,其密度函数为g(x→)=1Ωg(\overrightarrow x) = \frac{1}{\Omega}g(x)=Ω1​,其中Ω=∏i=1n(bi−ai)\Omega = \prod_{i=1}^n(b_i-a_i)Ω=∏i=1n​(bi​−ai​)。

那么其数学期望可以表示为:
Ef(x→)g(x→)=∫Ωf(x→)g(x→)g(x→)dΩ=∫Ωf(x→)dΩE\frac{f(\overrightarrow x)}{g(\overrightarrow x)} =\int_{\Omega}\frac{f(\overrightarrow x)}{g(\overrightarrow x)}g(\overrightarrow x)d \Omega = \int_{\Omega}f(\overrightarrow x)d \Omega Eg(x)f(x)​=∫Ω​g(x)f(x)​g(x)dΩ=∫Ω​f(x)dΩ
此时由大数定律:
∀ϵ>0,limN→∞P{∣1N∑i=1Nf(ζ→i)g(ζ→i)−∫Ωf(x→)dΩ∣<ϵ}=1\forall \epsilon>0,lim_{N\rightarrow \infty}P\{|\frac{1}{N}\sum_{i=1}^N\frac{f(\overrightarrow \zeta_i)}{g(\overrightarrow \zeta_i)}-\int_{\Omega}f(\overrightarrow x)d \Omega|<\epsilon\}=1 ∀ϵ>0,limN→∞​P{∣N1​i=1∑N​g(ζ​i​)f(ζ​i​)​−∫Ω​f(x)dΩ∣<ϵ}=1
上式构成了我们计算多重积分的基础。再由中心极限定理:
∀ϵ>0,limN→∞P{∣1N∑i=1Nf(ζ→i)g(ζ→i)−∫Ωf(x→)dΩ∣<λασN}=22π∫0λαe−t22dt=1−α\forall \epsilon>0,lim_{N\rightarrow \infty}P\{|\frac{1}{N}\sum_{i=1}^N\frac{f(\overrightarrow \zeta_i)}{g(\overrightarrow \zeta_i)}-\int_{\Omega}f(\overrightarrow x)d \Omega|<\frac{\lambda_{\alpha}\sigma}{\sqrt{N}}\}=\frac{2}{\sqrt{2\pi}}\int_0^{\lambda_{\alpha}}e^{-\frac{t^2}{2}}dt = 1-\alpha ∀ϵ>0,limN→∞​P{∣N1​i=1∑N​g(ζ​i​)f(ζ​i​)​−∫Ω​f(x)dΩ∣<N​λα​σ​}=2π​2​∫0λα​​e−2t2​dt=1−α
上面的式子构成了我们依概率估计精度的基础。

三.matlab实现代码

1.基本的求解函数intCal.m

function [intVal,error,xPoint,yPoint] = intCal(a,b,p,f,A,numbers)
%UNTITLED 此处显示有关此函数的摘要
%   有p个约束条件
[m1 n1] = size(a);
[m2 n2] = size(b);
if (m1 ~= m2)&&(n1~=n2)disp('Error of dimension of a and b!');return;
end
sum1 = 0;
sum2 = 0;
zeta = zeros(m1,1);
Omega = prod(b-a);
for k = 1:numbersfor i = 1:m1zeta(i) = unifrnd(a(i),b(i));endif sum(A(zeta)<0) == psum1 = sum1 + f(zeta);sum2 = sum2 + f(zeta)^2;endxPoint(k) = k;yPoint(k) = Omega*sum1/k ;
end
intVal = Omega*sum1/numbers ;
for k = 1:numberszPoint(k) = intVal;
end
sigma = sqrt(sum2/numbers-(sum1/numbers)^2);
error = 3*sigma/sqrt(numbers);%以99%的概率估计误差
hold on
plot(xPoint,yPoint,'b');
plot(xPoint,zPoint,'r');
legend('迭代值','实际值');
xlabel('迭代次数');
ylabel('积分值');
title('积分迭代曲线');
hold off
end

我们求以下三重积分的值做一下实验:
∭Vx2dV(V:{(x,y,z)∣(x2+y2<z<1)})\iiint_{V}x^2dV(V:\{(x,y,z)|(\sqrt{x^2+y^2}<z<1)\}) ∭V​x2dV(V:{(x,y,z)∣(x2+y2​<z<1)})

%Input:
>> a = [-1;-1;0];
>> b = [1;1;1];
>> p = 2;
>> f = @(x)(x(1)^2);
>> numbers = 1000;
>> A =@(x)[x(3)-1;sqrt(x(1)^2+x(2)^2)-x(3)];
%Output:
>> intCal(a,b,p,f,A,numbers)ans =0.1545

该积分值与实际值π20\frac{\pi}{20}20π​相差无几。

2.多重积分计算的GUI实现

(1)基本架构

(2)结果显示

四.结论拓展

​ 已知了重积分的计算公式之后,如果要计算曲面积分的公式也可用广义的牛顿斯托克斯公式进行转化后计算:
∫∂Ωω=∫Ωdω\int_{\partial \Omega}\omega = \int_{\Omega}d\omega ∫∂Ω​ω=∫Ω​dω

五.直接调用代码

clc,clear;
aCell =  inputdlg('请输入各个变量的下界限(列向量)','变量下界',1,{'-1;-1 ;0'});
bCell =  inputdlg('请输入各个变量的上界限(列向量)','变量上界',1,{'1;1 ;1'});
a = str2num(['[',aCell{1},']']);
b = str2num(['[',bCell{1},']']);
m1 = size(b,1);
m2 = size(a,1);
if (m1 ~= m2)&&(n1~=n2)disp('Error of dimension of a and b!');return;
end
%以下是计算多重积分的值
numbers =  inputdlg('请输入计算次数','计算次数',1,{'5000'});
numbers = str2num(numbers{1});
f = inputdlg('请输入被积函数','被积函数',1,{'x(1)^2'});
f = str2func(['@(x)(',f{1},')']);
A = inputdlg('请输入基本约束条件(A<=0)','约束条件',1,{'x(3)-1;sqrt(x(1)^2+x(2)^2)-x(3)'});
p = size(strfind(A{1},';'),2) + 1;
endA = A{1};
endA = endA(end);
if endA == ';'p = p - 1;
end
A = str2func(['@(x)[',A{1},']']);
sum1 = 0;
sum2 = 0;
zeta = zeros(m1,1);
Omega = prod(b - a);
for k = 1:numbersfor i = 1:m1zeta(i) = unifrnd(a(i),b(i));endif sum(A(zeta)<0) == psum1 = sum1 + f(zeta);sum2 = sum2 + f(zeta)^2;endxPoint(k) = k;yPoint(k) = Omega*sum1/k ;sum1Value(k) = sum1;sum2Value(k) = sum2;sigmaValue(k) = sqrt(sum2Value(k)/k -(sum1Value(k)/k)^2);errorValue(k) = 3*sigmaValue(k)/sqrt(k);maxPoint(k) = yPoint(k) +  errorValue(k);minPoint(k) = yPoint(k) -  errorValue(k);
end
intVal = Omega*sum1/numbers ;
for k = 1:numberszPoint(k) = intVal;
end
sigma = sqrt(sum2/numbers-(sum1/numbers)^2);
error = 3*sigma/sqrt(numbers);
step = inputdlg('请设置置信区间显示步长','显示步长',1,{'50'});
step = str2num(step{1});
hold on
h = figure(1);
plot(xPoint,yPoint,'b');
plot(xPoint,zPoint,'r');
plot(xPoint(1:step:numbers),maxPoint(1:step:numbers),'o','color','y');
plot(xPoint(1:step:numbers),minPoint(1:step:numbers),'o','color','c');
legend('迭代值','实际值','最大置信值','最小置信值');
xlabel('迭代次数');
ylabel('积分值');
title(['积分值是:',num2str(intVal),' 有99.7%的概率认为置信区间是:',...'[',num2str(intVal - error),',',num2str(intVal + error),']']);
hold off

通俗易懂的monteCarlo积分方法(八)相关推荐

  1. 通俗易懂的MonteCarlo积分方法(七)

    通俗易懂的MonteCarlo积分方法(七) 一.设计的基本GUIGUIGUI格式menteCarlo.figmenteCarlo.figmenteCarlo.fig 二.设计MatlabMatlab ...

  2. 通俗易懂的MonteCarlo积分方法(五)

    通俗易懂的MonteCarlo积分方法(五) ​ 这次主要目的是想办法提高MonteCarloMonteCarloMonteCarlo的计算精度. ​ 如果我们要求解一个定积分: J=∫abf(x)d ...

  3. 通俗易懂的MonteCarlo积分方法(六)

    足球门的危险区域威胁度衡量问题 一.问题的提出 二.问题分析 三.模型的建立 四.模型的求解 这次我们主要以足球门的危险区域威胁度衡量问题(无防守球员)来作为MonteCarlo积分的一个实际应用 一 ...

  4. 通俗易懂的Monte Carlo的积分方法(三)

    通俗易懂的Monte Carlo的积分方法(三) 考虑曾经在参加MCM时的一个多重积分的计算难题 ∫∫D(H−z(x,y))21+zx2+zy2dσ\int\int_{D}(H-z(x,y))^2\s ...

  5. 通俗易懂的Monte Carlo积分方法(二)

    通俗易懂的Monte Carlo积分方法(二) Monte Carlo积分的计算(期望法) Monte Carlo算法的期望法计算的数学基础: 辛钦大数定律: 如果Xi是独立的随机变量,且EXi是相应 ...

  6. 通俗易懂的Monte Carlo积分方法(一)

    通俗易懂的Monte Carlo积分方法(一) Monte Carlo积分的投点法计算: Monte Carlo算法(投点法)的数学基础: 伯努利大数定律: 设fA为n重伯努利试验中事件A发生的次数, ...

  7. 汽油与消费需求问题的MonteCarlo求解方法

    汽油与消费需求问题的MonteCarlo求解方法 一.问题的提出 二.问题的分析 三.代码的实现 一.问题的提出 ​ 你受雇于一家加油站连锁店当顾问,你现在的任务是要确定每隔多长时间把多少汽油运送到各 ...

  8. 中子穿墙问题的MonteCarlo求解方法

    中子穿墙问题的MonteCarlo求解方法 一.问题的提出 二.问题的分析 三.问题的求解 一.问题的提出 ​ 如下图所示,代表一个中子穿过用于屏蔽中子的铅墙的示意图.铅墙的高度远大于左右的厚度.设中 ...

  9. 打怪升级的monteCarlo仿真方法

    该题目来自公众号数学建模交流的清风老师之手.这个公众号有着学习数学建模的优质资源和课程,强烈推荐学习. 打怪升级的montecarlo仿真方法 一.问题说明 二.问题的分析 三.代码实现 四.结果 一 ...

最新文章

  1. Docker 安装registry (构建私有镜像库)
  2. 【怎样写代码】向现有类型“添加”方法 -- 扩展方法(四):在编译时绑定扩展方法的规则
  3. 【Dual-Path-RNN-Pytorch源码分析】Segmentation
  4. 浪潮存储linux登录密码,登录存储系统CLI管理界面(用户名+密码)
  5. UDP,你要耗子喂汁呀!
  6. U3D 动画帧事件问题
  7. java getmethod类_Java getMethod类型参数
  8. linux libodbc.so.1,CentOS6.0虚拟机上安装nginx启动的错误---缺少libpcre.so.1共享库
  9. MySQL(四)字段及常用函数
  10. flink int序列化
  11. linux后台执行脚本(产生日志和不产生日志)(大神请留言)
  12. lesson 2.4 - Converting MEL Commands to Python
  13. linux音频设备节点,Linux音频驱动之三:PCM设备的创建
  14. ae效果英文版翻译对照表_AE特效中英名字对照表
  15. web前端html5+css3学习笔记(1)
  16. 莫纳什大学计算机专业录取要求,2020年莫纳什大学计算机信息硕士申请条件
  17. morris算法(莫里斯遍历) [数据结构与算法]
  18. python英文单词
  19. POV系列制作之十字旋转LED
  20. jwt生成token与解析token

热门文章

  1. “敏捷”联袂“ALM” 上演市场模范夫妻秀
  2. 剑指offer——面试题5:从尾到头打印链表
  3. tensorflow: deep_dream代码及原理分析
  4. 数码相机如何当做摄像头(图文并茂版)
  5. jira7.3.6添加导出excel的按钮
  6. 《JavaScript高级程序设计》Chapter 10 DOM
  7. Appcan、apicloud、HBuilder 不同之处解析
  8. tnt_esri.dat Arcgis8.1安装license
  9. 【Javascript Demo】图片瀑布流实现
  10. Grunt的配置及使用(压缩合并js/css)