2301_78376767 2025-04-04 21:28 采纳率: 0%
浏览 6

matlab定积分近似求解问题

我写了一个定积分用来表示高斯形状的电子团和高斯形状的激光团碰撞后的反应产额(这句话是物理内容可以跳过不看),为什么我把积分区域的X部分人为均匀划分后,得到的结果与不划分的结果相差很大啊,而且划分的区间数不一样,结果也都差别很大,按道理应该是随着人为均匀划分区间数越多,结果越接近一个值的?难道是划分的还不够细么?求各位指导一下matlab初学者。另外用了mathematica也是这样的结果。蓝线实验值,红线是定积分结算结果。第一张图的红线是人为平均将X区间分成100的子区间分别进行定积分然后相加,并且,第二张图的红线是不进行任何分区间操作,直接积分的结果。

img

img




ex=312/1000;
ez=4000/1000;
lx=32/1000;
lz=40000/1000;
theta=148*pi/180;
lambda=10.64/1000;
M2=1.068;
c=3*10^14/1000;
beta=1;

datanum=7;


expdata = [
     -sqrt((703.42 - 816)^2 + (583.65 - 730)^2)/1000*6, 173384/280000; ...
     -sqrt((741.80 - 816)^2 + (634.12 - 730)^2)/1000*6, 228568/280000; ...
     -sqrt((779.72 - 816)^2 + (684.12 - 730)^2)/1000*6, 272143/280000; ...
     sqrt((815.86 - 816)^2 + (735.48 - 730)^2)/1000*6, 277788/280000; ...
     sqrt((853.20 - 816)^2 + (784.25 - 730)^2)/1000*6, 264095/280000; ...
     sqrt((891.09 - 816)^2 + (836.08 - 730)^2)/1000*6, 215604/280000; ...
     sqrt((930.26 - 816)^2 + (890.64 - 730)^2)/1000*6, 169101/280000
];%实验值

computingdata=zeros(datanum,1);





edensity=@(t,z,x) exp(-x.^2/(2*ex^2)-(z-c*beta*t).^2/(2*ez^2));


ldensity=@(t,z,x,d) exp(-((x*cos(theta) - z*sin(theta)+d).^2) ./ (2*lx^2*(1+((x*sin(theta) + z*cos(theta))*lambda*M2/(pi*4*lx^2)).^2))...
    -(((x*sin(theta) + z*cos(theta))-0*c*t).^2) / (2*lz^2))./(1+((x*sin(theta) + z*cos(theta))*lambda*M2/(pi*4*lx^2)).^2);

luminositymax=@(t,z,x) edensity(t,z,x).*ldensity(t,z,x,0);



xwidth=[1000/1000];

tdata=[3*10^(-11)];
color=['r','g','y','c','m'];
xbinnumber=12;%人为均匀划分的X区间数
for j=1:1
figure;
hold on;
plot(expdata(:,1), expdata(:,2), '-o', 'LineWidth', 1.5, 'MarkerSize', 5, 'MarkerFaceColor', 'b');
for k=1:1
disp(['start'])
computingdatamax=0;
for n=1:xbinnumber

    computingdatamax= computingdatamax+integral3(luminositymax, -tdata(1,k), tdata(1,k),@(t) 3*10^(14)/1000*t-3*ez,@(t) 3*10^(14)/1000*t+3*ez, -xwidth(1,j)+2*xwidth(1,j)*(n-1)/xbinnumber, -xwidth(1,j)+2*xwidth(1,j)*n/xbinnumber,'AbsTol', 1e-12,'RelTol',1e-7);%默认d=0处是最大值

end

computingdatamax_s(j,k)=computingdatamax;
disp(['j,k=',num2str(j),',',num2str(k)])
for i = 1:datanum 


    luminosity=@(t,z,x) edensity(t,z,x).*ldensity(t,z,x,expdata(i,1));
    computingdata(i,1)=0;

    for n=1:xbinnumber

        computingdata(i,1)= computingdata(i,1)+integral3(luminosity,-tdata(1,k), tdata(1,k),@(t) 3*10^(14)/1000*t-3*ez,@(t) 3*10^(14)/1000*t+3*ez, -xwidth(1,j)+2*xwidth(1,j)*(n-1)/xbinnumber, -xwidth(1,j)+2*xwidth(1,j)*n/xbinnumber,'AbsTol', 1e-12,'RelTol',1e-7);

    end

computingdata_s(j,k,i)=computingdata(i,1);
computingdata(i,1)=computingdata(i,1)/computingdatamax;%利用最大值归一
disp(['i=',num2str(i)])
end





plot(expdata(:,1), computingdata(:,1), '-o', 'LineWidth', 1.5, 'MarkerSize', 5, 'MarkerFaceColor', color(1,k));
end
end





  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2025-04-04 21:28
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    Matlab 定积分近似求解问题

    你遇到了一个定积分近似求解问题,导致划分积分区域后结果与不划分的结果相差很大。这个问题可能是由于积分区域划分的方式或步长太大导致的。

    在 Matlab 中,你可以使用 quad 函数来计算定积分,可以指定积分区域的划分方式和步长。例如:

    f = @(x) x.^2;  % 定积分函数
    a = 0;  %积分下限
    b = 1;  %积分上限
    n = 100;  %划分步长
    
    x = linspace(a, b, n);  % 等差划分积分区域
    y = f(x);  % 计算函数值
    
    I = quad(f, a, b);  % 使用 quad 函数计算定积分
    I_approx = sum(y .* (x(2) - x(1)));  % 近似计算定积分
    
    fprintf('Exact value: %f\n', I);
    fprintf('Approximate value: %f\n', I_approx);
    

    在上面的代码中,我们使用 linspace 函数来等差划分积分区域,然后计算函数值和近似计算定积分。可以看到,近似计算的结果与 exact value 之间的差异。

    如果你想要提高近似计算的精度,可以尝试以下几点:

    1. 增加划分步长 n,这样可以提高近似计算的精度。
    2. 使用高阶方法,例如 Simpson 方法或 Gauss-Legendre 方法,可以提高近似计算的精度。
    3. 使用 adaptive integration 方法,可以根据函数的特点自动调整划分步长和方法。

    希望这些建议能够帮助你解决问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 4月4日