matlab中非均匀网格上的数值积分。有什么功能吗?
我得到了向量matlab中非均匀网格上的数值积分。有什么功能吗?,matlab,math,Matlab,Math,我得到了向量f中的函数值,以及包含参数x值的向量。我需要找到f的定义整数值。但是参数向量x是不一致的。Matlab中是否有处理非均匀网格上积分的函数?摘自帮助: Z=trapz(X,Y)使用 梯形法。X和Y必须是相同的向量 长度,或X必须是列向量,Y必须是第一个 非单一维度是长度(X)。trapz沿着这条路线运行 维度 如您所见,x不一定要统一 例如: x = sort(rand(100,1)); %# Create random values of x in [0,1] y = x; trap
f
中的函数值,以及包含参数x
值的向量。我需要找到f
的定义整数值。但是参数向量x
是不一致的。Matlab中是否有处理非均匀网格上积分的函数?摘自帮助:
Z=trapz(X,Y)使用
梯形法。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
根据您的函数(以及
x
的分布方式),您可以通过先对数据进行样条插值来获得更高的精度:
pp = spline(x,y);
quadgk(@(t) ppval(pp,t), [range])
这是一种快速肮脏的方式。有一种更快、更直接的方法,但这是一种令人困惑、更不透明的方法:
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
));
作为一个例子,为什么所有这些都是有用的,我借用了这个例子。确切的答案应该是
>> 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
。对于后两种方法,误差要小一个数量级。此外,可读性较差的样条曲线方法的速度要快一个数量级
因此,有了这些知识:明智地选择:)你可以对每个分段对的x
进行高斯求积,然后求和得到完整的积分。谢谢你,安德烈。我认为这很适合我。看看辛普森法则——这是一种一次积分信号样条曲线的方法。@Andrey:Hmmm…辛普森法则基于对f(x)
的二次近似,其中近似多项式在端点和中点等于f(x)
。好了,样条曲线是三次近似,那么它是如何工作的呢?@Andrey:Gauss Kronrod应用得很好,因为它在每个区间上都使用了立方近似。我想更多的是使用pp.breaks
和pp.coefs`中的信息,用“某种聪明的方式”:)我认为有一个公式可以计算任意次数的多项式。不过我不记得了。辛普森规则是N=2的私有案例。你是说如何选择更好的X值?很好!但您还应该添加trapz具有更高精度的示例。当无法选择点位置时,选择更高的多项式次数不是一个简单的问题,高斯求积对于固定的点集没有意义。如果你想在插值拉格朗日多项式上做高斯求积,那么这并不比简单的直接法则好,我认为这是不对的。这在任何有限元程序中都是常规的——非均匀网格上的分段积分。我就是这么想的,错了。是的,有限元代码使用高斯积分来解决不同的问题。然而,给定一个一维函数的采样点列表,进行高斯积分是没有意义的。看来你误解了两者的区别。有一个。一个1-d的高斯积分,只给出了点列表简化为梯形规则。(你所能做的就是对每个区间使用一个中点规则,使用一个线性插值来插补一个值,因此梯形规则就不适用了。)如果你想使用一个高阶规则,积分高阶拉格朗日分段,那么你最好积分一条样条曲线,而不是积分一组不可微分段。同样,高斯法则是没有价值的。”@Andrey基本上这是一个非均匀网格的高斯求积;它本质上比梯形法则更精确。虽然不是所有函数都是如此,但无论如何大多数都是如此。”-我写它时没有价值,在你的评论中本质上更精确。是哪一个?