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数据集的剧情:
你如何阅读你的数据点为c + +应用程序? – Tr1gZer0
简短的版本是它们是在我的源文件中的其他函数中生成的。我有另一个函数calculateSlowingEfficiency,它生成一个从1到150的500个均匀间隔点的数组,然后使用另一个名为calculateFinalVelocity的函数来获取500个点的数组。我选择500个数据点的一定范围,并使用“new double [n]”命令为这些特定点分配空间,其中n是类型const int。我将指针(xptr,yptr)传递给这些较短的数组,以便从函数 calcualteFinalVelocity中的trapz函数。 – Twigg
这里是我用csv格式解决特定数据的dropbox链接。 https://www.dropbox.com/s/qw0f0u5h3i6cdlu/trapzWeirdData.txt?dl=0 – Twigg