Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.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
用c语言进行数值积分_C_Numerical Methods - Fatal编程技术网

用c语言进行数值积分

用c语言进行数值积分,c,numerical-methods,C,Numerical Methods,我必须对文本文件中的一组数据点进行数值积分 我的数据点看起来像 0.5 0.479425539 1 0.841470985 1.5 0.997494987 2 0.909297427 2.5 0.598472144 3 0.141120008 3.5 -0.350783228 4 -0.756802495 4.5 -0.977530118 5 -0.958924275 我的尝试是 #include <stdlib.h>

我必须对文本文件中的一组数据点进行数值积分

我的数据点看起来像

0.5   0.479425539
1     0.841470985
1.5   0.997494987
2     0.909297427
2.5   0.598472144
3     0.141120008
3.5   -0.350783228
4     -0.756802495
4.5   -0.977530118
5     -0.958924275  
我的尝试是

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <conio.h>

double trapezoidalRule (double size, double *x, double *y)
{
    double sum = 0.0,increment;
    int k;
    for (k=1; k<size; k++)
    {
        increment = 0.5 * (x[k]-x[k-1]) * (y[k]+y[k-1]);
        sum += increment;
    }
    return sum;
    _getch();
}
int main ( int argc, char * argv[])
{
    char*  fileName = argc > 1 ? argv[1] : "C:\\Users\\g\\Desktop\\test.txt";
    FILE*  inputFile = fopen (fileName, "r");
    int  k;
    double size,*x, *y;
    double integral;
    if ( inputFile ==NULL)
    {
        fprintf (stderr, "Open failed for %s\n", fileName);
        exit(666); 
    }
    fscanf (inputFile, "%d", &size);
    printf (" Number of points: %d\n", size);

    x = (double *) calloc (size, sizeof(*x));
    y = (double *) calloc (size, sizeof(*y));

    for (k=0; k< size; k++)
        fscanf (inputFile, "%lg%lg" , x+k, y+k);
    integral = trapezoidalRule (size, x, y);
    printf ("Integral:", "\n", integral);
    printf ("\n");
    //printf ("check: ","\n", x[size-1], log(x[size-1]) );
    _getch();
}
#包括
#包括
#包括
#包括
双梯形规则(双尺寸、双*x、双*y)
{
双倍和=0.0,增量;
int k;
对于(k=1;k 1?argv[1]:“C:\\Users\\g\\Desktop\\test.txt”;
FILE*inputFile=fopen(文件名,“r”);
int k;
双倍尺寸,*x,*y;
二重积分;
if(inputFile==NULL)
{
fprintf(stderr,“打开%s失败\n”,文件名);
出口(666);
}
fscanf(输入文件“%d”和大小(&S);
printf(“点数:%d\n”,大小);
x=(双*)calloc(大小,大小(*x));
y=(双*)calloc(大小,尺寸(*y));
对于(k=0;k

但是我没有得到所需的输出…我不知道有什么错…它应该计算整数值,但它没有…点数也是错误的…它只是取第一个数字,没有计算点数…请帮助…

您不应该使用
%d
读取双精度值,而应该使用格式说明符
%lf
。我也不明白为什么
大小
是双精度的。它似乎只能是一个非负整数,所以可能
无符号
在这里效果最好。

您不应该使用
%d
读取双精度值,而应该使用格式说明符
%lf
。我也不明白
大小
为什么是双精度的。它似乎它只能是一个非负整数,因此可能
无符号
在这里效果最好。

我认为你离解决方案不远。至少公式看起来不错

代码中最大的错误可能是,数据中缺少了要读取的点数。因此,代码中可能会读取“0.5”作为点数。然后,k上的循环只针对k=0(然后k=1>0.5),这可能就是为什么只有一个点数的原因。为了使其正常工作,我做了以下更改:

  • 在数据文件的开头添加点数
  • 更改
    int size
  • 打印整数的值
    printf(“整数:%lg\n”,整数);
这对我来说很有用


(大编辑,因为它被重新标记为C而不是C++)

我认为你离解决方案不远。至少公式看起来不错

代码中最大的错误可能是,数据中缺少了要读取的点数。因此,代码中可能会读取“0.5”作为点数。然后,k上的循环只针对k=0(然后k=1>0.5),这可能就是为什么只有一个点数的原因。为了使其正常工作,我做了以下更改:

  • 在数据文件的开头添加点数
  • 更改
    int size
  • 打印整数的值
    printf(“整数:%lg\n”,整数);
这对我来说很有用


(大编辑,因为它被重新标记为C而不是C++)

为什么不从知道结果的一个非常简单的测试输入(例如0;1)开始,并开始对该输入进行调试。你确定
printf(“Integral:,“\n”,Integral);
行正确吗?我在格式参数“Integral:”中没有看到任何格式说明符:当然,这不是C++代码。首先,为什么在C++中没有C++代码时,为什么要把它标记为C++?为什么,为什么使用“<代码>双<代码> >大小(这导致了你的问题,<代码>大小<代码> > <代码> fSCANF被告知要读取整数)。更好地使用辛普森法则,它对等间距点更精确。点来自何处?有更好的方法,但它们自己选择点…为什么不从一个非常简单的测试输入(例如0 0;1 1)开始,在那里你知道结果,然后开始调试该输入。你确定
printf(“Integral:”,“\n”,“整”;< /Cord>行是正确的吗?我在格式参数“整型:”中没有看到任何格式说明符。这肯定不是C++代码。首先,为什么在C++中没有C++代码时,将它标记为C++?为什么,为什么使用“代码”>双< /代码>?(这就导致了
size
的问题,因为
fscanf
被告知要读取一个整数)。最好使用辛普森法则,它对等距点更精确。点从何而来?有更好的方法,但他们自己选择点。。。