自适应积分问题 [英] Adaptive Quadrature issues

查看:90
本文介绍了自适应积分问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

 #include< stdio.h> 
#include< math.h>

double f( double x)
{
return (1 /(x * sin(x * x)));
// return(2 * x * x);
}

int main()
{
int i = 1 ,num = 20 ,N;
double b,APP,TOL [num],a [num],h [num],FA [num],FB [num],FC [ num],S [num],S1,S2,L [num],FD,FE,v [num];

printf( 左端点:);
scanf( %lf,& a);

printf( 右端点:);
scanf( %lf,& b);

printf( Desired Tolerence:);
scanf( %lf,& TOL);

printf( 级别数:);
scanf( %d,& N);

APP = 0 ;
TOL [num] = 10 .0 * TOL;
a [num] = a;
h [num] =(b-a)/ 2;

FA [num] = f(a);
FC [num] = f(a + h [num]);
FB [num] = f(b);

S [num] = h [num] *(FA [num] + 4 * FC [num] + FB [num])/ 3; // 辛普森一家近似
L [num] = 1 ;

while (i> 0)
{
FD = f(a [num] + h [num] / 2);
FE = f(a [num] + 3 * h [num] / 2);

S1 = h [num] *(FA [num] + 4 * FD + FC [num])/ 6;
S2 = h [num] *(FC [num] + 4 * FE + FB [num])/ 6;

v [ 1 ] = a [num];
v [ 2 ] = FA [num];
v [ 3 ] = FC [num];
v [ 4 ] = FB [num];
v [ 5 ] = h [num];
v [ 6 ] = TOL [num];
v [ 7 ] = S [num];
v [ 8 ] = L [num];

i = i-1;

if (abs(S1 + S2 - v [ 7 ])< ; v [ 6 ])
{
APP = APP +(S1 + S2);
}
其他
{
如果(v [ 8 ] > = N)
{
printf( 等级超过);
return ;
}

else
{
i ++;
a [num] = v [ 1 ] + v [ 5 ];
FA [num] = v [ 3 ];
FC [num] = FE;
FB [num] = v [ 4 ];
h [num] = v [ 5 ] / 2;
TOL [num] = v [ 6 ] / 2;
S [num] = S2;
L [num] = v [ 8 ] + 1 ;

i ++;
a [num] = v [ 1 ];
FA [num] = v [ 2 ];
FC [num] = FD;
FB [num] = v [ 3 ];
h [num] = h [num-1];
TOL [num] = TOL [num-1];
S [num] = S1;
L [num] = L [num-1];
}
}
}

printf( 积分近似是%lf。,APP);

}







构建消息:



C:\Users\Mal \Desktop \MTH 415 \自适应正交2.c ||功能'main':|

C:\ Users \ Maltion \Desktop \MTH 415 \自适应正交2.c | 34 |错误:二进制操作数无效*(有'double'和'double *')|

C:\ Users \ Maltion \Desktop \ MTH 415 \自适应正交2.c | 35 |错误:从类型'double *'分配类型'double'时出现不兼容的类型

C:\ Users \ Maltion \Desktop \MTH 415 \自适应正交2.c | 36 |错误:二进制操作数无效 - (有'double'和'double *' )|

C:\ Users \ Maltion \Desktop \MTH 415 \自适应正交2.c | 38 |错误:'f'参数1的不兼容类型|

C:\ Users \ Maltion \Desktop \ MTH 415 \自适应正交2.c | 10 |注意:预期'双'但参数是类型'double *'|

C:\ Users \ Maltion \Desktop \MTH 415 \自适应正交2.c | 39 |错误:无效操作数到二进制+(有' double *'和'double')|

|| ===构建完成:5个错误,0个警告(0分0秒)=== |





之前我没有使用过数组,这可能是我问题的重要部分。我相信我至少走了很长一段路,因为在本学期之前我还不知道任何编程。谢谢你的帮助。



[edit]

我编辑了你所描述的程序:

#include < stdio.h >
# include < math.h >
#define num 20

double f( double x)
{
return (1 /(x * sin(x * x)));
// return(2 * x * x);
}

int main()
{
int i = 1 ,N;
double b,APP,TOL [num],a [num],h [num],FA [num],FB [num],FC [ num],S [num],S1,S2,L [num],FD,FE,v [num];

printf( 左端点:);
scanf( %lf,& a);

printf( 右端点:);
scanf( %lf,& b);

printf( Desired Tolerence:);
scanf( %lf,& TOL);

printf( 级别数:);
scanf( %d,& N);

APP = 0 ;
TOL [num] = 10 0 * TOL;
a [num] = a;
h [num] =(b-a)/ 2;

FA [num] = f(a);
FC [num] = f(a + h [num]);
FB [num] = f(b);

S [num] = h [num] *(FA [num] + 4 * FC [num] + FB [num])/ 3; // 辛普森一家近似
L [num] = 1 ;

while (i> 0)
{
FD = f(a [num] + h [num] / 2);
FE = f(a [num] + 3 * h [num] / 2);

S1 = h [num] *(FA [num] + 4 * FD + FC [num])/ 6;
S2 = h [num] *(FC [num] + 4 * FE + FB [num])/ 6;

v [ 1 ] = a [num];
v [ 2 ] = FA [num];
v [ 3 ] = FC [num];
v [ 4 ] = FB [num];
v [ 5 ] = h [num];
v [ 6 ] = TOL [num];
v [ 7 ] = S [num];
v [ 8 ] = L [num];

i = i- 1 ;

if (abs(S1 + S2 - v [ 7 ])< ; v [ 6 ])> = N)
{
printf( 等级超过);
return ;
}

else
{
i ++;
a [num] = v [ 1 ] + v [ 5 ];
FA [num] = v [ 3 ];
FC [num] = FE;
FB [num] = v [ 4 ];
h [num] = v [ 5 ] / 2;
TOL [num] = v [ 6 ] / 2;
S [num] = S2;
L [num] = v [ 8 ] + 1 ;

i ++;
a [num] = v [ 1 ];
FA [num] = v [ 2 ];
FC [num] = FD;
FB [num] = v [ 3 ];
h [num] = h [num- 1 ];
TOL [num] = TOL [num- 1 ];
S [num] = S1;
L [num] = L [num- 1 ];
}
}
}

printf( 积分近似是%lf。,APP);

}





仍然获得:

 C:\Users\Mal \Desktop \MTH 415 \自适应正交2.c ||在函数'main'中: 
C:\ Users \ Maltion \Desktop \MTH 415 \自适应正交2.c | 35 |错误:无效操作数到二进制*(有'double'和'double *')|
C:\ Users \ Maltion \Desktop \MTH 415 \自适应正交2.c | 36 |错误:从类型'double *'分配类型'double'时出现不兼容的类型
C:\ Users \ Maltion \Desktop \MTH 415 \自适应正交2.c | 37 |错误:二进制操作数无效 - (有'double'和'double *')|
C:\ Users \ Maltion \Desktop \MTH 415 \自适应正交2.c | 39 |错误:'f'参数1的不兼容类型
C:\ Users \ Maltion \Desktop \MTH 415 \自适应正交2.c | 11 |注意:预期'双'但参数类型为'double *'|
C:\ Users \ Maltion \Desktop \MTH 415 \自适应正交2.c | 40 |错误:二进制操作数无效+(有'double *'和'double')|
|| ===构建完成:5个错误,0个警告(0分0秒)=== |< /math.h>< /stdio.h>



[/ edit]

解决方案

  int  i =  1 ,num =  20 ,N; 
double b,APP,TOL [num],a [num],h [num],FA [num],FB [num],FC [ num],S [num],S1,S2,L [num],FD,FE,v [num];



在这种情况下你不能使用变量来声明一个数组,你必须使用一个常量值,例如:

< pre lang =c ++> #define NUM $
int i = 1 ,N;
double b,APP,TOL [NUM],[NUM],h [NUM],FA [NUM],FB [NUM],FC [ NUM],S [NUM],S1,S2,L [NUM],FD,FE,v [NUM];


#include <stdio.h>
#include <math.h>

double f(double x)
{
    return (1/(x*sin(x*x)));
    //return (2*x*x);
}

int main()
{
    int i=1, num=20, N;
    double b, APP, TOL[num], a[num], h[num], FA[num], FB[num], FC[num], S[num], S1, S2, L[num], FD, FE, v[num];

    printf("Left Endpoint: ");
    scanf("%lf", &a);

    printf("Right Endpoint: ");
    scanf("%lf", &b);

    printf("Desired Tolerence: ");
    scanf ("%lf", &TOL);

    printf("Number of Levels: ");
    scanf("%d", &N);

    APP = 0;
    TOL[num] = 10.0*TOL;
    a[num] = a;
    h[num] = (b-a)/2;

    FA[num] = f(a);
    FC[num] = f(a+h[num]);
    FB[num] = f(b);

    S[num] = h[num]*(FA[num]+4*FC[num]+FB[num])/3;    //Simpsons approximation
    L[num] = 1;

    while (i>0)
        {
            FD = f(a[num] + h[num]/2);
            FE = f(a[num] + 3*h[num]/2);

            S1 = h[num]*(FA[num]+4*FD+FC[num])/6;
            S2 = h[num]*(FC[num]+4*FE+FB[num])/6;

            v[1] = a[num];
            v[2] = FA[num];
            v[3] = FC[num];
            v[4] = FB[num];
            v[5] = h[num];
            v[6] = TOL[num];
            v[7] = S[num];
            v[8] = L[num];

            i=i-1;

            if (abs(S1 + S2 - v[7])<v[6])
            {
                APP = APP + (S1 + S2);
            }
                else
                {
                    if (v[8]>=N)
                     {
                         printf("Level Exceeded");
                         return;
                     }

                else
                {
                    i++;
                    a[num] = v[1] + v[5];
                    FA[num] = v[3];
                    FC[num] = FE;
                    FB[num] = v[4];
                    h[num] = v[5]/2;
                    TOL[num] = v[6]/2;
                    S[num] = S2;
                    L[num] = v[8] + 1;

                    i++;
                    a[num] = v[1];
                    FA[num] = v[2];
                    FC[num] = FD;
                    FB[num] = v[3];
                    h[num] = h[num-1];
                    TOL[num] = TOL[num-1];
                    S[num] = S1;
                    L[num] = L[num-1];
                }
            }
        }

    printf("The Integral Approximation is %lf." , APP);

}




Build Messages:

C:\Users\Mal\Desktop\MTH 415\Adaptive Quadrature 2.c||In function 'main':|
C:\Users\Mal\Desktop\MTH 415\Adaptive Quadrature 2.c|34|error: invalid operands to binary * (have 'double' and 'double *')|
C:\Users\Mal\Desktop\MTH 415\Adaptive Quadrature 2.c|35|error: incompatible types when assigning to type 'double' from type 'double *'|
C:\Users\Mal\Desktop\MTH 415\Adaptive Quadrature 2.c|36|error: invalid operands to binary - (have 'double' and 'double *')|
C:\Users\Mal\Desktop\MTH 415\Adaptive Quadrature 2.c|38|error: incompatible type for argument 1 of 'f'|
C:\Users\Mal\Desktop\MTH 415\Adaptive Quadrature 2.c|10|note: expected 'double' but argument is of type 'double *'|
C:\Users\Mal\Desktop\MTH 415\Adaptive Quadrature 2.c|39|error: invalid operands to binary + (have 'double *' and 'double')|
||=== Build finished: 5 errors, 0 warnings (0 minutes, 0 seconds) ===|


I have not used arrays before, which is probably a big part of my problem. I believe I have at least come a long way since I did not know any programming before this semester. Thanks for your help.

[edit]

I edited my program as you described:

#include <stdio.h>
#include <math.h>
#define num 20

double f(double x)
{
    return (1/(x*sin(x*x)));
    //return (2*x*x);
}

int main()
{
    int i=1, N;
    double b, APP, TOL[num], a[num], h[num], FA[num], FB[num], FC[num], S[num], S1, S2, L[num], FD, FE, v[num];

    printf("Left Endpoint: ");
    scanf("%lf", &a);

    printf("Right Endpoint: ");
    scanf("%lf", &b);

    printf("Desired Tolerence: ");
    scanf ("%lf", &TOL);

    printf("Number of Levels: ");
    scanf("%d", &N);

    APP = 0;
    TOL[num] = 10.0*TOL;
    a[num] = a;
    h[num] = (b-a)/2;

    FA[num] = f(a);
    FC[num] = f(a+h[num]);
    FB[num] = f(b);

    S[num] = h[num]*(FA[num]+4*FC[num]+FB[num])/3;    //Simpsons approximation
    L[num] = 1;

    while (i>0)
        {
            FD = f(a[num] + h[num]/2);
            FE = f(a[num] + 3*h[num]/2);

            S1 = h[num]*(FA[num]+4*FD+FC[num])/6;
            S2 = h[num]*(FC[num]+4*FE+FB[num])/6;

            v[1] = a[num];
            v[2] = FA[num];
            v[3] = FC[num];
            v[4] = FB[num];
            v[5] = h[num];
            v[6] = TOL[num];
            v[7] = S[num];
            v[8] = L[num];

            i=i-1;

            if (abs(S1 + S2 - v[7])<v[6])>=N)
                     {
                         printf("Level Exceeded");
                         return;
                     }

                else
                {
                    i++;
                    a[num] = v[1] + v[5];
                    FA[num] = v[3];
                    FC[num] = FE;
                    FB[num] = v[4];
                    h[num] = v[5]/2;
                    TOL[num] = v[6]/2;
                    S[num] = S2;
                    L[num] = v[8] + 1;

                    i++;
                    a[num] = v[1];
                    FA[num] = v[2];
                    FC[num] = FD;
                    FB[num] = v[3];
                    h[num] = h[num-1];
                    TOL[num] = TOL[num-1];
                    S[num] = S1;
                    L[num] = L[num-1];
                }
            }
        }

    printf("The Integral Approximation is %lf." , APP);

}



Still Obtaining:

C:\Users\Mal\Desktop\MTH 415\Adaptive Quadrature 2.c||In function 'main':|
C:\Users\Mal\Desktop\MTH 415\Adaptive Quadrature 2.c|35|error: invalid operands to binary * (have 'double' and 'double *')|
C:\Users\Mal\Desktop\MTH 415\Adaptive Quadrature 2.c|36|error: incompatible types when assigning to type 'double' from type 'double *'|
C:\Users\Mal\Desktop\MTH 415\Adaptive Quadrature 2.c|37|error: invalid operands to binary - (have 'double' and 'double *')|
C:\Users\Mal\Desktop\MTH 415\Adaptive Quadrature 2.c|39|error: incompatible type for argument 1 of 'f'|
C:\Users\Mal\Desktop\MTH 415\Adaptive Quadrature 2.c|11|note: expected 'double' but argument is of type 'double *'|
C:\Users\Mal\Desktop\MTH 415\Adaptive Quadrature 2.c|40|error: invalid operands to binary + (have 'double *' and 'double')|
||=== Build finished: 5 errors, 0 warnings (0 minutes, 0 seconds) ===|</math.h></stdio.h>


[/edit]

解决方案

int i=1, num=20, N;
double b, APP, TOL[num], a[num], h[num], FA[num], FB[num], FC[num], S[num], S1, S2, L[num], FD, FE, v[num];


You cannot use a variable in this case to declare an array, you must use a constant value, like:

#define NUM 20
    int i=1, N;
    double b, APP, TOL[NUM], a[NUM], h[NUM], FA[NUM], FB[NUM], FC[NUM], S[NUM], S1, S2, L[NUM], FD, FE, v[NUM];


这篇关于自适应积分问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆