반응형
[적분구간을 충분히 늘린 후 시행횟수를 비교]
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 |
반응형
'학습공간 > 수치해석, 확률과통계, 이산수학' 카테고리의 다른 글
[선형대수] 벡터, 행렬, n 차원 구조 (0) | 2020.09.04 |
---|---|
[Intro] 데이터마이닝연구세미나 (0) | 2020.09.04 |
[C언어 수치해석] 직사각형 방법, 사다리꼴 방법, Simpson 방법 (수치적분) (0) | 2019.11.28 |
[C언어 수치해석] 라그랑지(Lagrange) 곡선 그리기 (MFC 활용) (0) | 2019.11.28 |
[C언어 수치해석] Pivoting 전략 (연립방정식의 해) (0) | 2019.11.28 |