matlab中非均匀网格的数值积分。有什么功能吗?

时间:2012-11-15 11:25:24

标签: matlab math

我在向量f中有函数值,还有包含参数x值的向量。我需要找到f的定义积分值。但是参数向量x并不统一。 Matlab中是否有任何函数可以处理非均匀网格的集成?

3 个答案:

答案 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的每个分段对进行高斯求积,然后求它们得到完整的积分。