用C语言中的梯形规则进行双积分

时间:2018-01-03 04:14:17

标签: c math

我试图实现一个程序,在这个程序中,我可以用梯形法则计算一个双积分作为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()

1 个答案:

答案 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。

[注意:在早期版本中,我写道,两个方向的评估是无法分开的。上面的讨论清楚地表明这不是真的。]