1

我有一个代码,不是我制作的。在这个复杂的代码中,应用了许多规则来计算数量 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 计算为指针时做得对,还是应该将其声明为简单的双精度数?我想分段错误即将到来。

另一点,我是否正确使用了梯形规则?

任何帮助/提示,​​将不胜感激。

路易斯

4

3 回答 3

1

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

一个可能更清晰的解决您的问题的方法在这里

让我们考虑一下你的函数,让我们假设它有效(我相信它没有,它是一个非常晦涩的代码......;例如,当你集成一个函数时,你期望一个数字作为结果;这个数字在哪里?也许是 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),你就不会遇到段错误,因为数组足够大。结果将是错误的,但这更难跟踪(再次,抱歉,没有“逆向工程”)。

最后一点(也来自评论):如果你有double a[N],那么a有 type double *

于 2011-06-26T19:07:31.020 回答
0

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

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

于 2011-06-26T19:01:17.220 回答
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;
}
于 2011-06-26T19:46:09.393 回答