高校数学をプログラミングで解く(数学B編)「3-4 和の記号Σ、階差数列」
マガジンリスト > 数学B編 3.数列 > 3-4 和の記号Σ、階差数列
はじめに
今回は、数学Bで学ぶ「和の記号$${\sum}$$、階差数列」について、和の公式を確かめるプログラム、和の公式を利用したプログラム、数列の和から数列の一般項を求めるプログラムを作成します。
和の記号Σ
まず、和の記号$${\sum}$$を利用した和の公式と$${\sum}$$の性質についてまとめておきます。
和の公式
$$
\sum_{k=1}^n c = nc \ \ (c\mathrm{は}k\mathrm{に無関係}) \ \ \ \ 特に\sum_{k=1}^n1=n
$$
$$
\sum_{k=1}^nk = \frac{1}{2} n(n+1)
$$
$$
\sum_{k=1}^n k^2 = \frac{1}{6} n(n+1)(2n+1)
$$
$$
\sum_{k=1}^n k^3 = \left\{ \frac{1}{2} n(n+1) \right\}^2
$$
$$
\sum_{k=1}^n r^{k-1} = \frac{1-r^n}{1-r} = \frac{r^n-1}{r-1} \ \ \ \ (r \neq 1)
$$
$${\Sigma}$$の性質
$${p,q}$$が$${k}$$に無関係な定数のとき
$$
\sum_{k=1}^n (p a_k + q b_k) = p \sum_{k=1}^n a_k + q \sum_{k=1}^n b_k
$$
階差数列
次に、階差数列についてまとめておきます。
階差数列と一般項
$${b_n=a_{n+1}-a_n \ \ (n \geq 1)}$$で定められた数列$${\{b_n\}}$$を、数列$${\{a_n\}}$$の階差数列という。このとき
$$
a_n=a_1 + \sum_{k=1}^{n-1} b_k \ \ (n \geq 2)
$$
数列の和と一般項
数列$${\{a_n\}}$$の初項から第$${n}$$項までの和を$${S_n}$$とすると、
$$
a_1 = S_1 \ \ \ \ n \geq 2 \mathrm{のとき} \ \ a_n = S_n -S_{n-1}
$$
和の公式を確かめる
上記で和の記号$${\sum}$$を用いた公式をいくつか示しました。これらの和の公式は数学的帰納法などを用いることでその成立を証明することができます。今回は、これらの和の公式を証明する変わりに、プログラムを利用して和の公式が成り立っているかを確かめてみます。具体的には、
$$
\sum_{k=1}^nk = \frac{1}{2} n(n+1)
$$
の左辺を単純に足し上げて計算したものと右辺の公式を利用して計算したものとを$${n=1}$$から$${n=10}$$までの範囲で同じ結果になるかを確かめるプログラムを作成します。
このプログラムは以下のようになります。
// 和の公式Σkを確かめる
void setup(){
int n = 10; // 項数
float sum = 0.0; // 和の値
for(int k=1; k<=n; k++){
sum += k;
println(k+"番目までの和:", sum, ",和の公式:", sum_formula(k));
}
}
// Σkの公式
float sum_formula(
int n // 項数
){
return n*(n+1.0)/2.0;
}
ソースコード1 $${\sum k}$$の公式を確かめるプログラム
今回は、$${k=1,2,\cdots,10}$$を変数 sum に順に足していき、$${k}$$の値ごとに和の公式の値と比較するようにしています。また、和の公式として関数 sum_formula を作成しました。sum_formula 関数は引数として、
n:項数 int型
を取ります。また、返り値は和の公式の結果としての値を返します。
ソースコード1を、Processingの開発環境ウィンドウを開いて(スケッチ名を「check_sum_formula」としています)、テキストエディタ部分に書いて実行すると、開発環境ウィンドウのコンソール部分に
1番目までの和: 1.0 ,和の公式: 1.0
2番目までの和: 3.0 ,和の公式: 3.0
3番目までの和: 6.0 ,和の公式: 6.0
4番目までの和: 10.0 ,和の公式: 10.0
5番目までの和: 15.0 ,和の公式: 15.0
6番目までの和: 21.0 ,和の公式: 21.0
7番目までの和: 28.0 ,和の公式: 28.0
8番目までの和: 36.0 ,和の公式: 36.0
9番目までの和: 45.0 ,和の公式: 45.0
10番目までの和: 55.0 ,和の公式: 55.0
と出力され、和の公式の左辺と右辺とが少なくとも$${n=10}$$までは一致していることを確かめることができます(図1)。
今回は、$${\sum k}$$の公式を確かめてみましたが、その他の和の公式についても是非チェックしてみてください。
和の公式を利用して問題を解く
今度は和の公式を利用して数列の和の問題を解くプログラムを作成してみます。
問題1
次の和を求めよ。
$$
\sum_{k=1}^{10} (2k+4-3k^2)
$$
この問題1は、$${\sum}$$の性質を利用すると、
$$
\sum_{k=1}^{10} (2k+4-3k^2) = 2 \sum_{k=1}^{10}k+4 \sum_{k=1}^{10}1-3 \sum_{k=1}^{10}k^2
$$
と分解することができます。この左辺の各項は和の公式で計算することができます。そこで、それぞれの和の公式を関数として準備して、プログラムを作成していきます。
// 和の公式を利用して問題を解く
void setup(){
int n = 1; // 項数
// Σの性質を利用して計算する
float result = 2.0*sum_formula_k(n)+4.0*sum_formula_1(n)-3.0*sum_formula_k2(n);
println(result);
}
// Σ1の公式
float sum_formula_1(
int n // 項数
){
return n;
}
// Σkの公式
float sum_formula_k(
int n // 項数
){
return n*(n+1.0)/2.0;
}
// Σk^2の公式
float sum_formula_k2(
int n // 項数
){
return n*(n+1.0)*(2.0*n+1.0)/6.0;
}
ソースコード2 和の公式を利用して計算するプログラム
今回は、$${\sum 1}$$、$${\sum k}$$、$${\sum k^2}$$の和の公式に対してそれぞれ関数 sum_formula_1、sum_formula_k、sum_formula_k2 を作成しました。いずれの関数も引数として、
n:項数 int型
を取ります。また、返り値はそれぞれの和の公式の結果としての値を返します。
そして、$${\sum (2k+4-3k^2)}$$の結果は、これらの関数の結果の和として
float result = 2.0*sum_formula_k(n)+4.0*sum_formula_1(n)-3.0*sum_formula_k2(n);
で計算しています。
ソースコード2を、Processingの開発環境ウィンドウを開いて(スケッチ名を「use_sum_formula」としています)、テキストエディタ部分に書いて実行すると、開発環境ウィンドウのコンソール部分に「-1005.0」と表示されます(図2)。
数列の和から数列の一般項を求める問題
最後に、数列の和の一般項$${S_n}$$がわかっている場合に、そのもとの数列の一般項を求める問題をプログラムを作成して考えてみます。
問題2
初項から第$${n}$$項までの和が$${n^2-5n}$$で表される数列$${\{ a_n \}}$$について、その一般項を表す関数を作成せよ。
この問題は、この記事の最初にまとめた数列の和と一般項を利用することで解くことができます。つまり、項数$${n}$$を与えると数列の和$${S_n=n^2-5n}$$を返す関数(関数名を「sum_progression」とします)を準備して、その関数を用いて数列の一般項を$${a_n=S_n-S_{n-1}}$$の式から計算する関数 generalterm を作成します。
// 数列の和
float sum_progression(
int n // 項数
){
return n*n-5.0*n;
}
// 数列の一般項
float generalterm(
int n // 第n項
){
float gt = 0.0;
if( n == 1 ){
gt = sum_progression(n);
} else {
gt = sum_progression(n) - sum_progression(n-1);
}
return gt;
}
ソースコード3 数列の和と数列の一般項を表す関数
なお、数列の和から数列の一般項を求める場合、初項は$${a_1=S_1}$$となり、第$${2}$$項以降は$${a_n = S_n-S_{n-1}}$$で与えられるので、generalterm 関数の中で、$${n=1}$$の場合とそれ以外とで場合分けを行ってます。
問題2は一般項を表す関数を作成することでしたので、ソースコード3がその結果となりますが、関数が正しく動作するかを確認する意味も含めて、これらの関数を利用して数列の一般項の値を初項から第10項までコンソールに表示するプログラムを作成してみます。
// 数列の和の式から数列の一般項を算出する
void setup(){
int n = 10; // 項数
for(int k=1; k<=n; k++){
println("第"+k+"項:", generalterm(k), k+"項までの和:", sum_progression(k));
}
}
// 数列の和
float sum_progression(
int n // 項数
){
return n*n-5.0*n;
}
// 数列の一般項
float generalterm(
int n // 第n項
){
float gt = 0.0;
if( n == 1 ){
gt = sum_progression(n);
} else {
gt = sum_progression(n) - sum_progression(n-1);
}
return gt;
}
ソースコード4 数列の一般項の値を計算して表示するプログラム
ソースコード4を、Processingの開発環境ウィンドウを開いて(スケッチ名を「generalterm_from_sum」としています)、テキストエディタ部分に書いて実行すると、開発環境ウィンドウのコンソール部分に
第1項: -4.0 1項までの和: -4.0
第2項: -2.0 2項までの和: -6.0
第3項: 0.0 3項までの和: -6.0
第4項: 2.0 4項までの和: -4.0
第5項: 4.0 5項までの和: 0.0
第6項: 6.0 6項までの和: 6.0
第7項: 8.0 7項までの和: 14.0
第8項: 10.0 8項までの和: 24.0
第9項: 12.0 9項までの和: 36.0
第10項: 14.0 10項までの和: 50.0
のように表示されます(図3)。
なお、このスケッチの出力結果から、問題2の数列は、初項$${-4}$$、公差$${2}$$の等差数列であることがわかります。
まとめ
今回は、数学Bで学ぶ「和の記号$${\sum}$$、階差数列」について、和の公式を確かめるプログラム、和の公式を利用したプログラム、数列の和から数列の一般項を求めるプログラムを作成しました。
最初の、和の公式を確かめるプログラムでは左辺と右辺をそれぞれ計算して一致するかどうかを見てみました。なお、これは証明ではないことに注意してください。
和の公式を利用したプログラムは、和の公式を関数として準備し、それらの関数を利用して問題となっている数列の和を求めるようにしました。また、数列の和から数列の一般項を求めるプログラムでは、まず数列の和を表す関数を準備して、その関数を利用して数列の一般項を表す関数を作成しました。これらのプログラムのように、関数をうまく利用するとプログラムを簡潔でわかりやすい形で作成することができます。ぜひ、関数の扱いに慣れていってください。
参考文献
改訂版 教科書傍用 スタンダード 数学B(数研出版、ISBN9784410209468)
この記事が気に入ったらサポートをしてみませんか?