こんばんは!昨日に続いての更新です口笛
 
今回は数値積分に挑戦してみました。ときメモGS3 主人公 バンビ
数値積分にはいくつかの方法がありますが今回は台形法とシンプソン法をやってみました。
 
台形法は分割区間を一次関数近似するもので、シンプソン法は分割区間を二次関数で近似するものです。理論を書くと長くなるので書きませんが、プログラムは割と短くて済みます。
 
今回積分する関数は y = sinx です。以下ソースコードになります(・・*)+++
 
矢印矢印矢印矢印矢印矢印矢印矢印矢印矢印矢印矢印矢印矢印矢印矢印矢印矢印矢印矢印矢印矢印矢印矢印矢印矢印矢印矢印矢印矢印矢印矢印矢印矢印矢印矢印矢印
 
#include<stdio.h>
#include<math.h>

double trapezoid(double a,double b,double n);
double simpson(double a,double b,double n);
double formula(double x);

int main(void){
    double a,b;
    int k;
    
    printf("積分範囲\n");
    printf("a=");
    scanf("%lf",&a);
    printf("b=");
    scanf("%lf",&b);
    
    for(k=1;k<20;k++)
    {
        printf("分割回数=%d\n",k*2);/*シンプソン法では分割回数を偶数にする必要がある*/
        printf("I_trapezoid=%lf\n",trapezoid(a,b,k*2)); /*台形法*/
        printf("I_simpson=%lf\n",simpson(a,b,k*2));     /*シンプソン法*/
    }
    
    return(0);
}

double trapezoid(double a,double b,double n){
    double integral = 0.0, h = (b-a) / n; /* 積分結果の変数を初期化 */
    int i;
    
    for (i=0;i<n;i++) { /* 微小範囲の面積Δ A */
        integral += (formula(a)+formula(a+h))*h/2.0;/* Σ */
        a += h;
    }
    return integral;
}

double simpson(double a,double b,double n){
    double ss1 =0.0, ss2 =0.0;
    int i;
    
    for( i=1; i<=n/2-1; i++){
        ss1 += formula(a + (b-a)/n * (2.0*i));
    }
    for( i=1; i<=n/2; i++){
        ss2 += formula(a + (b-a)/n * (2.0*i-1.0));
    }
    return  ( formula(a)+formula(b) + 2.0 * ss1 + 4.0 * ss2 ) * (b-a)/(3.0*n);
}

double formula(double x){
    return sin(x); /*積分する関数*/
}
 
キラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラキラ
 
実行してみると台形法よりもシンプソン法のほうが正確な値が出ることがわかると思います。
二次関数で近似しているだけありますねキャッ*m
 
数値積分の方法はこれ以外にもあるので、ほかの方法も試してみたいと思っています。
 
それじゃまたねハートばいばい