Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
matlab中非均匀网格上的数值积分。有什么功能吗?_Matlab_Math - Fatal编程技术网

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基本上这是一个非均匀网格的高斯求积;它本质上比梯形法则更精确。虽然不是所有函数都是如此,但无论如何大多数都是如此。”-我写它时没有价值,在你的评论中本质上更精确。是哪一个?