심슨 법칙 (수치 적분)
심슨 법칙이란?
산법
3점의 $y$좌표를 각각 $f(x_0)=y_0, f(x_1)=y_1, f(x_2)=y_2$로 한다.
근사에 사용되는 2차 방정식 $y=ax^2+bx+c$는 $(x_0,y_0),(x_1,y_1),(x_2,y_2)$를 통과하며, 또한 $x_2-x_1=h, x_1-x_0=h$라고 하면,
$$ a=\frac{y_0-2y_1+y_2}{2h^2}$$$$b=\frac{-(x_1+x_2)y_0+2(x_2+x_0)y_1-(x_0+x_1)y_2} {2h^2}$$$$c=\frac{x_1x_2y_0-2x_2x_0y_1+x_0x_1y_2}{2h^2}$$
이 2차 방정식 $y=ax^2+bx+c$를 $x_0$에서 $x_2$까지 적분하면,
$$\int_{x_0}^{x_2}(ax^2+bx+c)dx=\frac{a}{3}(x_2^3-x_0^3)+\frac{b}{2}(x_2 ^2-x_0^2)+c(x_2-x_0) $$$$=\frac{h}{3}(y_0+4y_1+y_2)$$
구간 $[a,b]$가 미세 거리 $h$에서 $2n$ 등분되어 있다고 하고, 각 $x_i\(i=0,1,\cdots,2n)$의 $y$좌표를 $f (x_i)=y_i$로 하면 구간 $[a,b]$ 내의 적분은 다음과 같다.
$$\int_a^bf(x)dx=\frac{h}{3}{(y_0+4y_1+y_2)+(y_2+4y_3+y_4)+\cdots+(y_{2n-2}+4y_{2n- 1}+y_{2n})}$$$$=\frac{h}{3}(y_0+4y_1+2y_2+4y_3+2y_4+\cdots+2y_{2n-2}+4y_{2n-1}+y_ {2n})$$
그러나 $h=(b-a)/(2n)$
샘플 코드
$f(x)=\sqrt{1-x^2}$에서 구간 $[0,1]$의 정적분의 값을 구하는 프로그램.
분할수는 4.
해석 솔루션은 $\pi/4$입니다.
simpsons_rule.c#include<stdio.h>
#include<math.h>
double f (double x) {
return sqrt(1-x*x);
}
/* シンプソン則(区間[a,b]をn分割) */
double simpsons_rule (double a, double b, int n) {
double h;
int i;
double value=0;
h = (b - a) / (2*n);
for (i = 0; i <= 2*n; i++) {
if (i == 0 || i == 2*n) value += f(a + i*h); // 0か2nのとき
else if (i % 2 == 1) value += 4 * f(a + i*h); // 奇数
else value += 2 * f(a + i*h); // 偶数
}
value = value*h/3;
return value;
}
int main (void) {
printf("Analytical solution: %f\n", M_PI/4);
printf("Numerical solution : %f\n", simpsons_rule(0, 1, 4));
return 0;
}
실행 결과
Analytical solution: 0.785398
Numerical solution : 0.780297
특징
$f(x)=\sqrt{1-x^2}$에서 구간 $[0,1]$의 정적분의 값을 구하는 프로그램.
분할수는 4.
해석 솔루션은 $\pi/4$입니다.
simpsons_rule.c
#include<stdio.h>
#include<math.h>
double f (double x) {
return sqrt(1-x*x);
}
/* シンプソン則(区間[a,b]をn分割) */
double simpsons_rule (double a, double b, int n) {
double h;
int i;
double value=0;
h = (b - a) / (2*n);
for (i = 0; i <= 2*n; i++) {
if (i == 0 || i == 2*n) value += f(a + i*h); // 0か2nのとき
else if (i % 2 == 1) value += 4 * f(a + i*h); // 奇数
else value += 2 * f(a + i*h); // 偶数
}
value = value*h/3;
return value;
}
int main (void) {
printf("Analytical solution: %f\n", M_PI/4);
printf("Numerical solution : %f\n", simpsons_rule(0, 1, 4));
return 0;
}
실행 결과
Analytical solution: 0.785398
Numerical solution : 0.780297
특징
Reference
이 문제에 관하여(심슨 법칙 (수치 적분)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/omu58n/items/4025ac6fafbe3d8c1a64텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)