基本問題(4)
[ edit ]
Contents
概要
[ edit ]
- 以下の関数を定義しましょう (定義は,上記リンクのwikipediaで確認してください)
- 引数は,整数のリスト
- 結果は,返戻値で返します
算術平均(相加平均)
arithmetic_mean( data_list )
総和を個数で割ったもの
幾何平均(相乗平均)
geometric_mean( data_list )
総乗のべき乗根
調和平均
harmonic_mean( data_list )
逆数の算術平均の逆数
- 相加平均
$$ \frac{1}{n}\sum_{i=1}^{n} x_i = \frac{x_1 + x_2 + \cdots + x_n}{n} $$
- 相乗平均
$$ \sqrt[n]{\prod_{i=1}^{n} x_i} = \sqrt[n]{x_1 x_2 \cdots x_n} $$
- 調和平均
$$ \frac{n}{\sum_{i=1}^{n} \frac{1}{x_i}} = \frac{n}{ \frac{1}{x_1} + \frac{1}{x_1} + \cdots + \frac{1}{x_n}} $$
ヒント
この課題で使うPythonの機能 (学習のヒント)
[ edit ]
この課題の解き方 (問題解決のヒント)
[ edit ]
- この課題の解き方 (問題解決のヒント) ....
- べき乗根 ... 関数 radical_root(x)を定義しましょう
xのn乗根: x ** (1/n)
- べき乗根 ... 関数 radical_root(x)を定義しましょう
$$ x^{\frac{1}{n}} $$
- 逆数 ... 関数 reciprocal( x )を定義しましょう
1 /x
$$ \frac{1}{x} $$
実行例
*
プログラム例: 本質的な部分 (授業中に順次公開します)
[ edit ]
- 解答例の核心部分は,下記の小さな関数群です.
# ===== 【関数定義】 算術平均(相加平均)を求める =====
def arithmetic_mean( data_list ):
sum_of_data = sum( data_list )
number_of_data = len( data_list )
return( sum_of_data / number_of_data )
# ===== 【関数定義】 幾何平均(相乗平均)を求める =====
# ※ 総乗のべき乗根
def geometric_mean( data_list ):
return( radical_root( product( data_list ), len( data_list ) ) )
# ===== 【関数定義】 調和平均を求める =====
# ※ 逆数の算術平均の逆数
def harmonic_mean( data_list ):
return( reciprocal( arithmetic_mean( reciprocal_list( data_list ) ) ) )
# ===== 【関数定義】 逆数を求める =====
def reciprocal( x ):
return( 1 / x )
# ===== 【関数定義】 べき乗根(xのn乗根)を求める =====
def radical_root( x, n ):
return( x ** reciprocal( n ) )
# ===== 【関数定義】 総乗を求める =====
def product( data_list ):
prod = 1
for i in range( len( data_list ) ):
prod *= data_list[i]
return( prod )
# ===== 【関数定義】 整数のリストの各要素を逆数にしたリストを求める =====
def reciprocal_list( data_list ):
result = list()
for i in range( len( data_list ) ):
result.append( reciprocal( data_list[i] ) )
return( result )
プログラム例: 配布コード (授業中に順次公開します)
[ edit ]
- 以下の解答例を配布します.
- 本質部分は替えませんが,コメントや,メインプログラム部分の実行例を,後々,分かり易く書き換える可能性はあります.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# ==============================================================================
# * Copyright (c) 2018 IIJIMA, Tadashi
# * (IIJIMA Laboratory, Dept. of Science and Technology, Keio University).
# ==============================================================================
# ソフトウェア工学[03] 基本課題[03]-(004a) BP_03_004a_mean_variations.py
# BP(Basic Problem) 03-004a: いろいろな平均(相加平均(算術平均),相乗平均(幾何平均), 調和平均)
# 2018-10-17 飯島 正 (iijima@ae.keio.ac.jp)
# ==============================================================================
# ===== 【関数定義】 逆数を求める =====
def reciprocal( x ):
return( 1 / x )
# ==============================================================================
# ===== 【関数定義】 整数のリストの各要素を逆数にしたリストを求める =====
def reciprocal_list( data_list ):
result = list()
for i in range( len( data_list ) ):
result.append( reciprocal( data_list[i] ) )
return( result )
# ==============================================================================
# ===== 【関数定義】 べき乗根(xのn乗根)を求める =====
def radical_root( x, n ):
return( x ** reciprocal( n ) )
# ==============================================================================
# ===== 【関数定義】 総乗を求める =====
# ※ 総和の方は,自分で定義せず,組込み関数sum()を使ってしまいましょう
# ※ 総和もそうですが,functoolsモジュールのreduce高階関数をつかって簡潔に定義する方法もあります
# ※ (reduceは授業で取り上げるとしても後日.Wikiに掲載しても参考にとどめ授業では取り上げないかもしれません)
# ※ (operatorモジュールのoperator.mulを組み合わせるとよい)
# ※ (itertoolsのproduct()関数は別もの→直積/デカルト積)
# ※ 後日使用するNumPyモジュールには,総積を求めるproduct()関数があります
def product( data_list ):
prod = 1
for i in range( len( data_list ) ):
prod *= data_list[i]
return( prod )
# ==============================================================================
# ===== 【関数定義】 算術平均(相加平均)を求める =====
def arithmetic_mean( data_list ):
sum_of_data = sum( data_list )
number_of_data = len( data_list )
return( sum_of_data / number_of_data )
# ==============================================================================
# ===== 【関数定義】 幾何平均(相乗平均)を求める =====
# ※ 総乗のべき乗根
def geometric_mean( data_list ):
return( radical_root( product( data_list ), len( data_list ) ) )
# ==============================================================================
# ===== 【関数定義】 調和平均を求める =====
# ※ 逆数の算術平均の逆数
def harmonic_mean( data_list ):
return( reciprocal( arithmetic_mean( reciprocal_list( data_list ) ) ) )
# ==============================================================================
# ===== 【関数定義】 =====
def input_sequence_of_int():
result = list()
while True:
data = input( "整数を入力してください(終了は\"X\")>>> " )
if data == "X":
break
result.append( int( data ) )
return( result )
# ==============================================================================
# ===== 【メイン・プログラム】 =====
# ----- オープニングメッセージ -----
print( "いろいろな平均(相加平均(算術平均),相乗平均(幾何平均), 調和平均): " )
print( " ※Xが入力されるまで,整数値をリストに読み込みます " )
print()
# ----- Xが入力されるまで,整数値をリストに読み込む -----
data_list = input_sequence_of_int()
print()
# ----- 計算結果を表示する -----
print( " 算術平均(相加平均):\t ", arithmetic_mean( data_list ) )
print( " 幾何平均(相乗平均):\t ", geometric_mean( data_list ) )
print( " 調和平均: \t ", harmonic_mean( data_list ) )
# ==============================================================================