我有一个代码,这不是我做的。 在这个复杂的代码中,许多规则被应用于计算数量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作为指针,还是应该将其声明为一个简单的双?我想分段错误就是为此而来的。
其他方面,我是否正确使用了梯形法则?
任何帮助/提示,都会非常感激。
路易斯
答案 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;
}