基本問題(4)

[ edit ]

*


概要

[ edit ]

$$ \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)を定義しましょう
      • xn乗根: x ** (1/n)

$$ x^{\frac{1}{n}} $$

  • 逆数 ... 関数 reciprocal( x )を定義しましょう
    •  1 /x 

$$ \frac{1}{x} $$

*


実行例

[ edit ]

  • 実行例(1) ... クリックすると拡大します

fig-01

*


プログラム例: 本質的な部分 (授業中に順次公開します)

[ 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 ) )
# ==============================================================================
*
*

SoftEng: Python/Prog/Practice/Basic/03/BP_004a (last edited 2018-10-21 12:21:35 by TadashiIijima)