2017-08-11 83 views
0

我使用下面的函数C++编写的,其目的是把数据(Y)中的一个阵列的积分相对于另一个(X)C++梯形积分函数返回负数时它不应该

// Define function to perform numerical integration by the trapezoidal rule 
double trapz (double xptr[], double yptr[], int Npoints) 
{ 
    // The trapzDiagFile object and associated output file are how I monitor what data the for loop actually sees. 
    std::ofstream trapzDiagFile; 
    trapzDiagFile.open("trapzDiagFile.txt",std::ofstream::out | std::ofstream::trunc); 

    double buffer = 0.0; 
    for (int n = 0; n < (Npoints - 1); n++) 
    { 
     buffer += 0.5 * (yptr[n+1] + yptr[n]) * (xptr[n+1] - xptr[n]); 
     trapzDiagFile << xptr[n] << "," << yptr[n] << std::endl; 
    } 

    trapzDiagFile.close(); 
    return buffer; 
} 

我验证了这个函数的简单情况,其中x包含100个均匀间隔的点,从0到1,并且y = x^2,它返回0.33334,因为它应该。
但是,当我将它用于不同的数据集时,它将返回-3.431,这绝对没有意义。如果你查看附加的图像文件,我所指的整体是在垂直虚线之间的曲线下面的区域。
这绝对是一个正数。
此外,我使用MATLAB中的原生trapz命令对同一组数字进行了返回1.4376。
另外,我把上面的C++ trapz函数翻译成MATLAB,尽量贴近线条,并且再次得到了1.4376
我觉得有什么C + +相关我没有看到这里。如果相关,我使用minGW-w64。

对这篇文章的含糊不清的道歉。如果我更了解我所看到的问题,那么简明扼要就会容易些。

的量,trapz函数(我的自制C++版本)返回-3.431数据集的剧情:

enter image description here

+0

你如何阅读你的数据点为c + +应用程序? – Tr1gZer0

+0

简短的版本是它们是在我的源文件中的其他函数中生成的。我有另一个函数calculateSlowingEfficiency,它生成一个从1到150的500个均匀间隔点的数组,然后使用另一个名为calculateFinalVelocity的函数来获取500个点的数组。我选择500个数据点的一定范围,并使用“new double [n]”命令为这些特定点分配空间,其中n是类型const int。我将指针(xptr,yptr)传递给这些较短的数组,以便从函数 calcualteFinalVelocity中的trapz函数。 – Twigg

+0

这里是我用csv格式解决特定数据的dropbox链接。 https://www.dropbox.com/s/qw0f0u5h3i6cdlu/trapzWeirdData.txt?dl=0 – Twigg

回答

0

请检查XPTR的值[Npoints - 1]。它可能小于xptr [Npoints - 2],并且不包含在您输出的值中。