物理のかぎしっぽ

総和の計算

home > 計算物理学 > 数値計算アルゴリズム >

総和(summation,記号 Σ)の計算は, プログラムで実装するのがとても簡単です. forループで回して足し合わせればよいだけです.

アルゴリズム

$\displaystyle \sum_{k=1}^{n}k$

という総和記号があった場合,実際には

$\displaystyle \sum_{k=1}^{n}k = 1+2+3+\cdots +n$

と足し算で計算する決まりになっています. Σ の下の記号からはじまって,1ずつ増やしながら上の記号まで足すのです. これがそのままアルゴリズムです.

プログラム例

数学の公式から

$\displaystyle \sum_{k=1}^{n}k$ $\displaystyle =\frac{1}{2}n(n+1)$
$\displaystyle \sum_{k=1}^{n}k^2$ $\displaystyle =\frac{1}{6}n(n+1)(2n+1)$
$\displaystyle \sum_{k=1}^{n}k^3$ $\displaystyle =\left\{\frac{1}{2}n(n+1)\right\}^2$

となることが分かっています. 数値計算で純粋に足し算計算したものと, この公式で計算したものとを比較してみます. n は変数ですのでこのままでは計算できませんから, ここでは n = 10 の場合を計算しておきます.

解析解

まず,公式を利用した場合ですが,n=10とおくと

$\displaystyle \sum_{k=1}^{10}k$ $\displaystyle =\frac{1}{2}10(10+1)=55$       (1)
$\displaystyle \sum_{k=1}^{10}k^2$ $\displaystyle =\frac{1}{6}10(10+1)(2\times10+1)=385$       (2)
$\displaystyle \sum_{k=1}^{10}k^3$ $\displaystyle =\left\{\frac{1}{2}10(10+1)\right\}^2=3025$       (3)

となります.これが解析解です.

数値解

実際にプログラムを書いてみます. 赤字が直接アルゴリズムに関係した部分です.

#include <stdio.h>

#define N 10

int func(int n) {
  return n;
}

int main(void) {
  int sum = 0, i;

  for (i=1; i<=N; i++) {
    sum += func(i);
  }
  
  printf("sum = %d\n", sum);

  return 0;
}

これをコンパイルして実行すると

sum = 55

という結果が表示されます.いまのプログラムは, 関数 func で n を返すように設定しています. ですからこれは,式 (1) の結果です. 式 (2) の計算するには n*n を返すように, 式 (3) を計算するには n*n*n を返すようにすればいいです.

いまは整数の計算なのですべて int 型で宣言していますが, 一般には整数でないことが多いです. その場合は double 型で宣言しておきます.

Valid XHTML 1.1! [home] [計算物理学] [ページの先頭]