用微元思想求解三重积分——基于Matlab

仅作自己学习使用


1. 题目

求解下列三重积分,其中A,μ,r都是常数。

求解的准确性可以用下式进行评估:

听过考研数一张宇课程的朋友应该指导,求解三重积分就是就一个面包,我们将面包无限细分为一个小块,我在代码中是将其细分为一个立方体,这样方便计算,通过设置不同的划分长度,可以获得不同的精度,但是随着划分区间的减少,计算量也会成倍增加。

2. Matlab实现代码

matlab 复制代码
clc
clear

A = 10;     % 源强密度
miu = 0.15;
m = 10;     % 布点数

r = linspace(0,200,m);
dr = r(2)-r(1);

theta = linspace(0,2*pi,m);
dtheta = theta(2)-theta(1);

fia = linspace(0,pi,m);
dfia = fia(2)-fia(1);

fx = 0;
for i = 1 : length(r)
    rr = r(i);
    suma = 0;
    for j = 1:length(fia)
        sumb = 0;
        jj = fia(j);
        for k = 1:length(theta)
              sumb = sumb + (A/(4*pi))*exp(-miu*rr)*sin(jj)*dtheta;
        end
        suma = suma + sumb*dfia;
    end
    fx = fx + suma*dr;
end


fx % 解析解
real = (A/miu)*(1-exp(-miu*max(r))) % 数值解

注意代码中的r,theta,fia我是直接通过linspace函数将其划分为了(m-1)个小的区间,计算的时候通过索引即可求解。其实代码中最重要的还是那三个for循环,如果不好想象的话可以从外到里逐步填空,具体思路如下:
step1:

matlab 复制代码
%% step 1
fx = 0;
for i = 1:length(r)
	rr = rr(i);
	suma = 0; % 第二个for整体的微元
	for j = 1:length(fia)
		%% 填空
	end
	fx = fx + suma * dr;	% 注意这一步df = fx * dx ,这是微元法的精髓
end

step2: 开始填空,这里就相当于是一个二重积分了,把里边的循环补充完整,就假设有无数个循环,里边个循环的写法和外边个循环的写法一样,直接模仿填空即可

matlab 复制代码
fx = 0;
for i = 1:length(r)
	rr = rr(i);
	suma = 0; % 第二个for整体的微元
	for j = 1:length(fia)
		jj = fia(j);
		sumb = 0;
		for k = 1:length(theta)
			%% 填空
		end
		suma = suma + sumb*dfia;
	end
	fx = fx + suma * dr;	% 注意这一步df = fx * dx ,这是微元法的精髓
end

step3: 继续填空,里边个循环最简单了,现在就只是一个简单的积分了,注意里边的积分变量是theta,所以把其他都当作是常数来看待

matlab 复制代码
fx = 0;
for i = 1:length(r)
	rr = rr(i);
	suma = 0; % 第二个for整体的微元
	for j = 1:length(fia)
		jj = fia(j);
		sumb = 0;
		for k = 1:length(theta)
			sumb = sumb + (A/(4*pi))*exp(-miu*rr)*sin(jj)*dtheta;
		end
		suma = suma + sumb*dfia;
	end
	fx = fx + suma * dr;	% 注意这一步df = fx * dx ,这是微元法的精髓
end

3. 结果

m(区间个数-1) fx(解析解) real(数值解)
100 78.0511 66.6667
300 70.3008 66.6667
600 68.4640 66.6667
1000 67.7404 66.6667

4. 问题

我是总感觉代码还有一点bug,也就是这行代码:

matlab 复制代码
sumb = sumb + (A/(4*pi))*exp(-miu*rr)*sin(jj)*dtheta;

可能首末点的取值不正确,还请有知道的朋友多多批评指教!

相关推荐
Larry_Yanan4 小时前
Qt多进程(三)QLocalSocket
开发语言·c++·qt·ui
醒过来摸鱼5 小时前
Java classloader
java·开发语言·python
superman超哥5 小时前
仓颉语言中元组的使用:深度剖析与工程实践
c语言·开发语言·c++·python·仓颉
小鸡吃米…5 小时前
Python - 继承
开发语言·python
JIngJaneIL5 小时前
基于java+ vue农产投入线上管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot
祁思妙想5 小时前
Python中的FastAPI框架的设计特点和性能优势
开发语言·python·fastapi
唐装鼠5 小时前
rust自动调用Deref(deepseek)
开发语言·算法·rust
Lucas555555556 小时前
现代C++四十不惑:AI时代系统软件的基石与新征程
开发语言·c++·人工智能
源代码•宸6 小时前
goframe框架签到系统项目(BITFIELD 命令详解、Redis Key 设计、goframe 框架教程、安装MySQL)
开发语言·数据库·经验分享·redis·后端·mysql·golang
吃喝不愁霸王餐APP开发者6 小时前
Java后端系统对接第三方外卖API时的幂等性设计与重试策略实践
java·开发语言