본문 바로가기

학습공간/수치해석, 확률과통계, 이산수학

[C언어 수치해석] 2차 Simpson 방법과 3차 Simpson 방법 비교

반응형

[적분구간을 충분히 늘린 후 시행횟수를 비교]

 

3차 Simpson 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// Simpson 방법 3차
#include <stdio.h>
#include <math.h>
#define r 3.141592/180
double f(double x){
    return exp(x)*sin(x);
}
double Fc(double x){
    return (1/2.0)*(exp(x)*sin(x)-exp(x)*cos(x));
}
double F(double x, double y){
    return Fc(y)-Fc(x);
}
void main()
{
    int n=3,k;
    double V1, sum=0,sum1=0;
    double a=1, b=3// 정적분 구간 (각도)
    a=a*r; b=b*r;    //    (라디안)
    while(1){
 
    double h = (b-a)/n;
 
    for(k=1; k<=n/3; k++)
    {
        sum += f(a+(3*k-2)*h)+ f(a+(3*k-1)*h) ;
    }
    for(k=0; k<=n/3-1; k++)
    {
        if(k==0)
            continue;
        sum1 += f(a+(3*k)*h);
    }
    V1 = 3*h/8*(f(a)+3*sum+2*sum1+f(b));
    
    if(fabs(F(a,b)-V1) <0.000001){    // 오차 10^-6
        printf("정적분 값 : %lf\n",F(a,b));
        printf("Simpson방법 = %lf \nn=%d\n",V1,n);
        break;
    }
    n=n+3;
    sum = 0;
    sum1 = 0;
    }
}
cs

2차 Simpson 방법과 3차 Simpson방법의 시행횟수 비교

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
// Simpson 방법 2차와 3차의 비교
// 비교를 위해 a ~ b 구간을 충분히 늘린 후 시행횟수를 비교합니다.
/* a=1, b=100     2차 Simpson 방법 */
#include <stdio.h>
#include <math.h>
#define r 3.141592/180
double f(double x){
    return exp(x)*sin(x);
}
double Fc(double x){
    return (1/2.0)*(exp(x)*sin(x)-exp(x)*cos(x));
}
double F(double x, double y){
    return Fc(y)-Fc(x);
}
void main()
{
    int n=2,k,cnt=1;
    double V1, sum1=0;
    double a=1, b=100// 정적분 구간 (각도)
    a=a*r; b=b*r;    //    (라디안)
    while(1){
 
    double h = (b-a)/n;
 
    for(k=0; k<=n/2-1; k++)
    {
        sum1 += f(a+2*k*h)+ 4*f(a+(2*k+1)*h)+ f(a+(2*k+2)*h);
    }
    
    V1 = h/3*sum1;
    
    if(fabs(F(a,b)-V1) <0.000001){    // 오차 10^-6
        printf("정적분 값 : %lf\n",F(a,b));
        printf("Simpson방법 = %lf \tn=%d\n시행횟수 = %d\n",V1,n,cnt);
        break;
    }
    n=n+2;
    cnt++;
    sum1 = 0;
    }
}
 
 
 
 
/* a=1, b=100     3차 Simpson 방법 */
#include <stdio.h>
#include <math.h>
#define r 3.141592/180
double f(double x){
    return exp(x)*sin(x);
}
double Fc(double x){
    return (1/2.0)*(exp(x)*sin(x)-exp(x)*cos(x));
}
double F(double x, double y){
    return Fc(y)-Fc(x);
}
void main()
{
    int n=3,k,cnt=1;
    double V1, sum=0,sum1=0;
    double a=1, b=100// 정적분 구간 (각도)
    a=a*r; b=b*r;    //    (라디안)
    while(1){
 
    double h = (b-a)/n;
 
    for(k=1; k<=n/3; k++)
    {
        sum += f(a+(3*k-2)*h)+ f(a+(3*k-1)*h) ;
    }
    for(k=0; k<=n/3-1; k++)
    {
        if(k==0)
            continue;
        sum1 += f(a+(3*k)*h);
    }
    V1 = 3*h/8*(f(a)+3*sum+2*sum1+f(b));
    
    if(fabs(F(a,b)-V1) <0.000001){    // 오차 10^-6
        printf("정적분 값 : %lf\n",F(a,b));
        printf("Simpson방법 = %lf \tn=%d\n시행횟수 = %d\n",V1,n,cnt);
        break;
    }
    n=n+3;
    cnt++;
    sum = 0;
    sum1 = 0;
    }
}
cs

2차 Simpson 방법과 3차 Simpson 방법의 시행횟수 비교

반응형