我在向量f
中有函数值,还有包含参数x
值的向量。我需要找到f
的定义积分值。但是参数向量x
并不统一。 Matlab中是否有任何函数可以处理非均匀网格的集成?
答案 0 :(得分:6)
取自帮助:
Z = trapz(X,Y)计算Y相对于X的积分 梯形法。 X和Y必须是相同的向量 长度,或X必须是列向量,Y是第一个数组 非单一维度是长度(X)。 trapz沿此运作 尺寸。
正如您所看到的,x
不一定是统一的。
例如:
x = sort(rand(100,1)); %# Create random values of x in [0,1]
y = x;
trapz( x, y)
返回:
ans =
0.4990
另一个例子:
x = sort(rand(100,1)); %# Create random values of x in [0,1]
y = x.^2;
trapz( x, y)
返回:
ans =
0.3030
答案 1 :(得分:3)
根据您的功能(以及x
的分发方式),您可以先通过数据进行spline
插值,从而获得更高的准确性:
pp = spline(x,y);
quadgk(@(t) ppval(pp,t), [range])
这是快节奏的方式。 Ther是一种更快速,更直接的方法,但这种方法很简单,而且不那么透明:
result = sum(sum(...
bsxfun(@times, pp.coefs, 1./(4:-1:1)) .*... % coefficients of primitive
bsxfun(@power, diff(pp.breaks).', 4:-1:1)... % all 4 powers of shifted x-values
));
作为一个例子,为什么所有这些都有用,我借用here中的例子。确切的答案应该是
>> pi/2/sqrt(2)*(17-40^(3/4))
ans =
1.215778726893561e+00
定义
>> x = [0 sort(3*rand(1,5)) 3];
>> y = (x.^3.*(3-x)).^(1/4)./(5-x);
我们找到了
>> trapz(x,y)
ans =
1.142392438652055e+00
>> pp = spline(x,y);
>> tic; quadgk(@(t) ppval(pp,t), 0, 3), toc
ans =
1.213866446458034e+00
Elapsed time is 0.017472 seconds.
>> tic; result = sum(sum(...
bsxfun(@times, pp.coefs, 1./(4:-1:1)) .*... % coefficients of primitive
bsxfun(@power, diff(pp.breaks).', 4:-1:1)... % all 4 powers of shifted x-values
)), toc
result =
1.213866467945575e+00
Elapsed time is 0.002887 seconds.
因此trapz
低估了0.07
以上的价值。使用后两种方法,误差小一个数量级。此外,spline
方法的可读性较低的版本要快一个数量级。
所以,拥有这些知识:明智地选择:)
答案 2 :(得分:0)
你可以对x
的每个分段对进行高斯求积,然后求它们得到完整的积分。