微积分近似计算公式,可以帮助我们在不了解积分原函数的情况下,即无法采用牛顿-莱布尼茨公式求解微积分,可以采用一些近似计算公式来获得近似结果:
中点公式:
function res = mid(f,a,b)
res = (b - a) * feval(f, 0.5 * (a + b));
end
梯形公式:
function res = trapz(f,a,b)
res = 0.5 * (b - a) * (feval(f,a) + feval(f,b));
end
辛普森公式:
function res = simpson(f,a,b)
res = 1 / 6 * (b - a) * (feval(f,a) + 4 * feval(f,0.5 * (a + b)) + feval(f,b));
end
在以上公式的基础上,采用定步长分段来近似计算微积分结果:
复合中点公式:
function res = fmid(f,a,b,n)
h = (b - a) / n;
x = linspace(a + h / 2,b - h / 2,n);
y = feval(f,x);
res = h * sum(y);
end
复合梯形公式:
function res = ftrapz(f,a,b,n)
h = (b - a) / n;
x = linspace(a,b,n + 1);
y = feval(f,x);
res = 0.5 * h * (y(1) + 2 * sum(y(2:n)) + y(n + 1));
end
复合辛普森公式:
function res = fsimpson(f,a,b,n)
h = (b - a) / n;
x = linspace(a,b,2 * n + 1);
y = feval(f,x);
res = (h / 6) * (y(1) + 2 * sum(y(3:2:2 * n - 1)) + 4 * sum(y(2:2:2 * n)) + y(2 * n + 1));
end
我们采用一个简单测试函数,来验证一下近似公式的精度:
function test
a = 2;
b = 20;
f = @(x) x.^(-1);
n = 50;
true_val = log(b) - log(a);
mid_val = mid(f,a,b);
trapz_val = trapz(f,a,b);
simpson_val = simpson(f,a,b);
fmid_val = fmid(f,a,b,n);
ftrapz_val = ftrapz(f,a,b,n);
fsimpson_val = fsimpson(f,a,b,n);
end
精度如下:
true | 2.302585092994046 |
mid | 1.636363636363637 |
trapz | 4.950000000000000 |
simpson | 2.740909090909091 |
fmid | 2.301256120284895 |
ftrapz | 2.305249476494972 |
fsimpson | 2.302587239021587 |
复合辛普森公式的近似精度还是比较高的