2301_77876143 2024-03-07 16:58 采纳率: 33.3%
浏览 25
已结题

如何用matlab计算不光滑曲面(函数)的二重积分?

首先自定义了一个算符o_plus:当a+b属于[-1,1]时,o_plus(a,b)=a+b;若a+b大于1时,o_plus(a,b)=1;若a+b小于-1时,o_plus(a,b)=-1。例如y=o_plus(x,0)的图像如图1所示。

img

二重积分的被积函数intexp(x,y)=phi(y)*p1(x)*p2(y),其中只有第一项phi(y)的表达式中引入了自定义算符o_plus,phi(y)函数图像如图2,曲面intexp(x,y)的图像如图3-1和3-2所示,由于引入了特殊算符,曲面在整个被积区间上并非是光滑的(导数不连续),经过分析,此时切面y=-17.4195将该曲面分成了两部分,而这两部分都是光滑的,这可以从phi(y)的图形(图2)以及图3-2中看出.

img

img

img

然后我使用integral函数用先积x后y的积分顺序、先y后x的积分顺序以及分段积分求和3种方法计算,积分区间如图4阴影部分所示,区间受直线x=30cos(b)控制。在不同的b值下获得了三种方法下的积分结果,如图5.

img

img

在我看来,分段积分的结果应该是正确的,而在不分段的情况下两种积分顺序的结果都与分段的结果偏离,所以针对这样的非光滑曲面能否用不分段的方法直接积分出较为精确的结果?因为针对图6这样更复杂的情形分段的方法实在过于复杂。

img

我也试过quadgk函数(高斯积分),其结果与integral函数一样,我的问题是:针对非光滑曲面(二元函数)能否用不分段的方法直接得到二重积分较为精确的结果,应该怎样操作?附我的代码。

clc,clear;close;
Hc=1;
Hm=30;
f=100000;
k=80000;
cf=2*pi*f/(k*Hc);
syms x y a b
uy1=acos(y/Hm);
uy2=2*pi-acos(y/Hm);
phi=o_plus(1/cf*int(Hm*cos(a)/Hc-y,a,uy1,uy2),1);%phi为y的函数,被积函数的第一项
subplot(1,2,1)
fplot(phi,[-Hm,Hm],'-','LineWidth',2)%画出phi(y)的图像
xlabel('y')
ylabel('phi(y)')
y_p=double(vpasolve(1/cf*int(Hm*cos(a)/Hc-y,a,uy1,uy2)+1==-1,y));%求出分段的位置
disp(['y_p的位置是:',num2str(y_p)])
intexp=phi*px*py;%被积函数表达式
intexp_mf=matlabFunction(intexp);%将被积函数转换为函数句柄的形式
A_yx=@(b) integral(@(y) integral(@(x) intexp_mf(x,y),Hm*cos(b),-y),-Hm,-Hm*cos(b),'ArrayValued',true);%积分顺序为先y后x,积分区间为b的函数
A_xy=@(b) integral(@(x) integral(@(y) intexp_mf(x,y),-Hm,-x),Hm*cos(b),Hm,'ArrayValued',true);%积分顺序为先x后y,积分区间为b的函数
a1=matlabFunction((1/cf*int(Hm*cos(a)/Hc-y,a,uy1,uy2)+1)*px*py);%分段积分,第一部分的被积函数
a2=matlabFunction(-px*py);%分段积分,第二部分的被积函数
A_fd_1=@(b) integral(@(y) integral(@(x) a1(x,y),Hm*cos(b),-y),-Hm,y_p,'ArrayValued',true);%分段积分,第一部分,积分区间为b的函数
A_fd_2=@(b) integral(@(y) integral(@(x) a2(x,y),Hm*cos(b),-y),y_p,-Hm*cos(b),'ArrayValued',true);%分段积分,第二部分,积分区间为b的函数
bb=1.5*pi:0.05*pi:2*pi;%b的取值,决定积分区域
BB=zeros(length(bb));
for i=1:length(bb)
BB(1,i)=A_yx(bb(i));%先积y后x的积分方法
BB(2,i)=A_xy(bb(i));%先积x后y的积分方法
BB(3,i)=A_fd_1(bb(i))+A_fd_2(bb(i));%分段积分求和的方法
end
subplot(1,2,2)
plot(bb,BB(1,:),'-','LineWidth',2)
hold on
plot(bb,BB(2,:),'-','LineWidth',2)
hold on
plot(bb,BB(3,:),'-','LineWidth',2)
xlabel('b')
ylabel('积分结果')
legend('先积x后y','先积y后x','分段积分')

%%%引用的函数%%%
function output=o_plus(a,b)%引入的特殊算符
output=min(max(a + b, -1), 1);
end
function output=px(~)%x分布的概率密度函数
syms x
sigma_x=20;%x分布的标准差
a=20;%x分布的平均值
output=1/((2*pi)^0.5*sigma_x)*exp(-(x-a)^2/(2*(sigma_x)^2));
end
function output=py(~)%y分布的概率密度函数
syms y
sigma_y=20;%y分布的标准差
a=-20;%y分布的平均值,值为x的相反数
output=1/((2*pi)^0.5*sigma_y)*exp(-(y-a)^2/(2*(sigma_y)^2));
end

  • 写回答

23条回答 默认 最新

  • 码农阿豪@新空间 新星创作者: 前端开发技术领域 2024-03-07 17:00
    关注
    获得0.40元问题酬金
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题:针对非光滑曲面能否用不分段的方法直接积分出较为精确的结果?应该怎样操作? 回答: 对于非光滑的曲面,一般来说不能直接使用不分段的方法求解二重积分。因为非光滑曲面在积分过程中会导致积分结果发散或不准确,因此需要采用分段积分的方法来处理。 在问题中,可以看到当被积函数包含特殊算符时,曲面不是光滑的,分段积分的结果较为准确,而在不分段的情况下,两种积分顺序的结果与分段的结果偏离。因此,在处理非光滑曲面的二重积分时,应采用分段积分的方法,以得到更加准确的结果。 具体操作上,可以根据被积函数的性质,选取合适的分段点将整个积分区间分为若干个子区间,然后对每个子区间分别进行积分,最后将所有子区间的积分结果加总起来,即可得到整个区间的积分结果。 示例代码中的A_fd_1和A_fd_2就是使用分段积分方法来进行求解的,将被积函数分为两部分,对两部分分别积分,最后将积分结果相加即可。
    评论

报告相同问题?

问题事件

  • 系统已结题 3月15日
  • 创建了问题 3月7日