如何将在程序中计算的变量数字积分为c语言中的指针(使用例如梯形规则)

时间:2011-06-26 18:44:00

标签: c pointers numerical-methods

我有一个代码,这不是我做的。 在这个复杂的代码中,许多规则被应用于计算数量d(x)。在代码中使用指针来计算它。

我想计算一个积分,比如:   W = Int_0 ^ L d(x)dx?

我这样做:

#define DX 0.003
void WORK(double *d, double *W)
{
    double INTE5=0.0;
    int N_X_POINTS=333;
    double h=((d[N_X_POINTS]-d[0])/N_X_POINTS); 
    W[0]=W[0]+((h/2)*(d[1]+2.0*d[0]+d[N_X_POINTS-1])); /*BC*/
    for (i=1;i<N_X_POINTS-1;i++) 
    {
        W[i]=W[i]+((h/2)*(d[0]+2*d[i]+d[N_X_POINTS]))*DX;
        INTE5+=W[i];
    }
    W[N_X_POINTS-1]=W[N_X_POINTS-1]+((h/2)*(d[0]+2.0*d[N_X_POINTS-1]+d[N_X_POINTS-2])); /*BC*/
}

我得到了“分段错误”。我想知道我是否正确计算W作为指针,还是应该将其声明为一个简单的双?我想分段错误就是为此而来的。

其他方面,我是否正确使用了梯形法则?

任何帮助/提示,​​都会非常感激。

路易斯

3 个答案:

答案 0 :(得分:1)

我不知道代码的来源,但是它很难看并且有一些硬编码的限制(333点并且增加0.003)。要使用它,您需要正确“采样”您的函数并生成对(x,f(x))......

问题的一个更明确的解决方案是here

让我们考虑你的功能,让我们假设它有效(我相信它不是,它是一个非常模糊的代码......;例如,当你整合一个函数时,你期望一个数字作为结果;这个数字在哪里?也许INTE5?没有回复......如果是这样的话,为什么最后更新W阵列?它没用,或者我们对W有什么意义?)。你会怎么用它?

原型

  void WORK(double *d, double *W);

意味着WORK需要两个指针。这些指针必须取决于代码;看看它表明你确实需要两个数组,每个数组都有N_X_POINTS个元素。代码从数组W读取和写入,并且仅从d读取。 N_X_POINTS int是333,所以你需要传递给至少333双打的函数数组:

   double d[333];
   double W[333];

然后你必须正确填写它们。我认为你需要用(x,f(x))填充它们,用适当的步骤对函数进行采样。但当然这没有多大意义。已经说代码是模糊的(现在我不想尝试逆向编写编码器的意图......)。

无论如何,如果你用WORK(d, W)调用它,你就不会得到seg错误,因为数组足够大。结果将是错误的,但这更难跟踪(再次,抱歉,没有“逆向工程”)。

最后的注释(也来自评论):如果您有double a[N],则a的类型为double *

答案 1 :(得分:0)

当您尝试访问不应访问的内存部分时,C中经常会发生分段错误错误。我怀疑表达式d[N_X_POINTS]是罪魁祸首(因为C中的数组是零索引的),但是没有看到d的定义,我无法确定。

尝试在函数中的每行代码之前/之后放置信息性printf调试语句,以便缩小问题的可能来源。

答案 2 :(得分:0)

这是一个简单的程序,它在[0..10]范围内集成了$ f(x)= x ^ 2 $。它应该向你发送正确的方向。

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

double int_trapezium(double f[], double dX, int n)
{
   int i;
   double sum;

   sum = (f[0] + f[n-1])/2.0;
   for (i = 1; i < n-1; i++)
       sum += f[i];
   return dX*sum;
}

#define N 1000
int main()
{
    int i;
    double x;
    double from = 0.0;
    double to = 10.0;
    double dX = (to-from)/(N-1);
    double *f = malloc(N*sizeof(*f));

    for (i=0; i<N; i++)
    {
        x = from + i*dX*(to-from);
        f[i] = x*x;
    }
    printf("%f\n", int_trapezium(f, dX, N));
    free(f);
    return 0;
}