我试图实现一个程序,在这个程序中,我可以用梯形法则计算一个双积分作为x和y的函数(这是我理解的最好的一个)。但是,除了没有得到结果之外,我希望程序对于非常大的n个范围有非常大的计算时间。
我首先想到的是计算函数关于y的积分,然后在程序的主体中它根据所提出的参数调用它并计算它在x函数中的值,但它不能很好地工作好吧,我想不出办法去做。
有人可以帮助我正确且更有效地实施该计划吗?
这是我所做的代码:
#include <stdio.h>
#include <math.h>
double f(double x, double y, double ay,double by, double ny);
int main()
{
int i;
int nx = 0;
double ax, bx;
double sumx = 0;
double soma=0;
double hx,hy;
double x,y;
double ay,by;
int ny;
printf("inferior limit ax = ");
scanf("%lf", &ax);
printf("upper limit bx (b>a) = ");
scanf("%lf", &bx);
printf("interval nx (n>1) n = ");
scanf("%d", &nx);
hx = (bx - ax) / (nx - 1);
x = ax;
printf("inferior limit ay = ");
scanf("%lf", &ay);
printf("upper limit by (b>a) = ");
scanf("%lf", &by);
printf("interval ny (n>1) n = ");
scanf("%d", &ny);
for (i = 1; i <= nx - 1; i++)
{
sumx = sumx + f(x,y,ay,by,ny) + f(x + hx,y,ay,by,ny);
x = x + hx;
}
sumx = sumx * (hx / 2);
printf("O resultado da soma e': %lf\n", sumx);
return 0;
} // end main()
//
//
//
double f(double x, double y, double ay,double by, double ny)
{
double func;
int j=0;
double hy;
double sumy=0;
func= sin(x+y) / ((x*x) + y);
hy = (by - ay) / (ny -1);
y= ay;
for (j =1; j <= ny - 1; j++)
{
sumy = sumy + sin(x + (y + hy)/ (x*x) + y+ hy);
y = y +hy;
}
return sumy = sumy * (hy / 2);
} // end f()
答案 0 :(得分:2)
您的代码原则上有效,但是当您在y上累积时会出现两个错误。
最重要的错误是在计算函数时乱码。你的职能是:
func = sin(x + y) / (x*x + y);
当您在'f , you calculate
func(x,y + hy)中累积区域时,如下所示:
sumy = sumy + sin(x + (y + hy)/ (x*x) + y + hy);
如果我们假设第一个函数是正确的,那么应该写成:
sumy = sumy + sin(x + (y + hy)) / (x*x + y + hy);
如果先增加y
,则可以对func(x, y)
使用相同的表达式。更好的方法可能是将(f(x,y)的评估放入一个单独的函数中。
第二个错误是,当您在f
中累积梯形时,必须添加两个端点,但只需添加一个。修复此问题:
sumy = sumy + sin(x + y) / (x*x + y);
y = y + hy;
sumy = sumy + sin(x + y) / (x*x + y);
这些更改应该能为您提供正确的答案。还有其他一些小错误,例如您没有初始化y
,而是将其传递给f
。在您的情况下,这没关系,因为您不应该首先将y
传递给f
;它应该是一个局部变量,因为它不在f
之外使用。
计算梯形法则的代码是上面的代码是O(n²),其中n是x和y方向上的间隔数。这意味着如果你使用很多间隔,执行时间会急剧增加。
简单的优化是改善常数因子。算法必须评估n×m网格中的所有点,但上面的代码将对边缘上所有点的所有内点进行四次评估两次。您只能对所有点进行一次评估,并将中间,边缘和角点的点分别乘以1.0,0.5和1.25。
[注意:在早期版本中,我写道,两个方向的评估是无法分开的。上面的讨论清楚地表明这不是真的。]