簡単な数値計算


   数値積分(台形公式)

  y = f(x) なる関数の区間[a,b]における定積分を行う際、
それを計算するための関数(不定積分で得られる関数、原始関数という)が簡単に得られる(表記できる)とは限らない。
 その際、数値積分は(特に工学的観点から)有用である。
その数値積分の中でももっとも簡易で理解しやすいものに台形公式がある。


  上図のように、xに対応するyが既に離散的に得られていると仮定する。
また、分割数はnで、間隔は等間隔Δxとする。
  よって、全体の面積は分割されたそれぞれの台形近似面積(中括弧内)を足し算して
下式中央のように示せることは容易に理解できる。
 ※中括弧内 { (上底+下底)×高さ÷2 }


  台形公式は中央の形をさらにまとめて右辺のように計算数を減らしたものである。
これを以下にプログラムで表現する。
このプログラムでは、汎用性を高めるために y = f(x) の離散データを配列変数に作成してから
台形公式を用いて積分する。もちろん、サンプルでは関数式が既知であるので配列変数を使わなくとも計算できる。
また、コンパイル時には数学関数を使えるようにするので注意。
 サンプルを実行すると、与式の理論値は円周率となるので、それに近い値が計算されていることが
わかる。分割数をnを大きくとり、さらに近づくことを確認してみよう。

  

   台形公式を用いた数値積分
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024:
025:
026:
027:
028:
029:
030:
031:
032:
033:
034:
035:
036:
037:
038:
039:
040:
041:
042:
/*  trarule.c  [Trapezoidal Rule] */
 
#include <stdio.h>
#include <math.h>
 
double func(double x)
{
    double y;
 
    y = 2.0 / ( 1.0 + x * x );
 
    return y;
}
 
int main(void)
{
    int i,n;
    double x[1000],y[1000];
    double x1,x2,dx,a;
 
    n=40;
 
    x1 = -1.0;
    x2 =  1.0;
 
    for (i=0; i<=n; i++)  {
        x[i] = x1+(x2-x1)*i/n;
        y[i] = func(x[i]);
    }
 
    dx = x[1]-x[0];
 
    a = 0.5 * (y[0]+y[n]);
    for (i=1; i<n; i++)  {
        a = a + y[i];
    }
    a = a * dx;
 
    printf("Sekibunchi = %f\n",a);
 
    return 0;
}
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024:
025:
026:
027:
028:
029:
030:
031:
032:
033:
034:
035:
036:
037:
038:
039:
040:
041:
042:
このサンプルでは使用していないが。
(数学関数を使いたい場合は多い)
ここにxの関数となる数式を記述する。
配列変数を多めに確保
分割数 n
積分範囲の始点
積分範囲の終点
配列に離散データを作成
この記述は非常に重要
ここで関数の呼び出し
等間隔の分割幅はこれでOK
ここからが台形公式の適応
繰り返しの範囲に注意
総和の計算
最後に分割幅をかける。
積分値の表示


 
   
上のプログラムで積分される関数の変更
   上のプログラムで積分される関数と積分範囲、分割数を変更してみよう。
   そしてそれがその理論値とどれくらい一致しているか考察しよう。


 ● 移動平均の計算

    移動平均とは、X−Yのデータにおいて、対象となるXの前中後のYを用いて平均化した値を新たなYとし
   それを領域全体に適用することで変化曲線をなめらかにするものである。
   一般には局所的に変化が激しい時系列動向の大局的変化傾向をみるために用いる。
   (例えば金融、気象などの分野)
 
     これをプログラムで実現するには2重ループを用いるのが一般的である。
 また、配列変数を用いるやや複雑なプログラムとなる。
   移動平均の計算プログラムをここに示す。
   このようなデータ(データ総数、平均個数を上に記入)を用意し、"mavdo.txt"というファイル名で
   プログラムと同じフォルダに保存する。
             

       $ ./a.out < mavdo.txt  > mavdc.txt  [Enter]

      とする(リダイレクト入出力という機能を用いている)ことで
     "mavdc.txt"という移動平均計算結果ファイルが作成される。
      表計算ソフトなどを用いてグラフ化してみよう。

 戻る