Riemann和在matlab中的二重积分


clear
n=45; // widht
m=23; // length
// total 990 blocks m*n

a=-2; b=1; // x-limits
c=2; d=4;  //  y-limits
f=@(x,y) 4.0*x.^3.*y+0.7.*x.^2.*y+2.5.*x+0.2.*y; //function
x=linspace(a,b,n);
y=linspace(c,d,m);
h1=(b-a)/n
h2=(d-c)/m
dA=h1*h2
[X,Y]=meshgrid(x,y); //did a meshgrid cause q wouldnt accept different index bounds without meshgriding.
q=sum((sum(dA*f(X,Y))))

在这个链接上,我一直在使用双黎曼的公式。https://activecalculus.org/multi/S-11-1-Double-Integrals-Rectangles.html

这些是的答案

1.I=81.3000.

2.I-left=-87.4287//-84.5523我的结果

3.I-Right=-75.1072

我看不出我做错了什么。我需要别人的意见。

我将使用伪常量函数调试集成方案

f = @(x,y) 1.0*ones(size(x))

结果应该是确切的总面积(b-a)*(d-c) = 6,但您的代码给出了6.415

问题是,您正在使用这些限制进行域外集成。您应该在每个维度中提前一步停止域离散化:

h1 = (b-a)/n
h2 = (d-c)/m
x = linspace(a, b - h1, n);
y = linspace(c, d - h2, m); 

这将为您提供虚拟功能的预期区域:

q =  6.0000

对于实际函数,在左上角进行评估,可以得到:

q = -87.482

您的代码没有任何错误。差异来自代码中使用的xy的分辨率,因为它们不够高。

例如,当您有n = 5000m = 5000

q = sum((sum(dA*f(X,Y)))); % your Riemann sum approach
l = integral2(f,a,b,c,d); % using built-in function for double integral to verify the value of `q`

你会看到现在的结果非常接近

q = -81.329
l = -81.300

相关内容

  • 没有找到相关文章

最新更新