倭算数理研究所

科学・数学・学習関連の記事を、「倭マン日記」とは別に書いていくのだ!

2.4 True Basic のプログラム : プログラミング演習 2.1 関数値の計算 a

今回は『プログラミング演習 2.1 関数値の計算 a』です。 演習問題はこちら:

関数

  { \displaystyle
\begin{align*}
    f(x) = a e^{-bx}
\end{align*}
}

の値を画面に表示するプログラムを書け。 { a,\,b} はパラメータである。

Groovy による実装

まずは Groovy による実装。 Groovy のプログラミング演習です。

def params = initial()

double a = params.a
double b = params.b
def f = { double x -> a * Math.exp(-b * x) }    // 関数に対応するクロージャ(オブジェクト)の生成

calculate(f, params.xmin, params.xmax, params.dx)

/** パラメータを初期化する */
def Map initial(){
    def params = [:]    // 空の Map を生成
    def scan = new Scanner(System.in)

    println 'a :'     ; params.a       = scan.nextDouble()    // セミコロン (;) で行を区切ることも可
    println 'b :'     ; params.b       = scan.nextDouble()
    println 'xmin :' ; params.xmin  = scan.nextDouble()
    println 'xmax :' ; params.xmax = scan.nextDouble()
    println 'dx :'    ; params.dx     = scan.nextDouble()
    
    return params
}

/** 指定された区間、幅で関数を評価して表示する */
def calculate(Closure f, double xmin, double xmax, double dx){
    for(double x = xmin; x <= xmax; x += dx){
        double y = f(x)    // クロージャは () もしくは call() メソッドで評価を実行できる
        // double y = f.call(x) と同じ
        println "$x, $y"
    }
}
  • パラメータ a, b、xmin, xmax, dx は、それぞれ x の最小値、最大値、サンプリング幅です。
  • initial() メソッドは、a, b, xmin, xmax, dx の入力を求めて初期化します。
  • calculate() メソッドは、問題の関数に対応するクロージャとサンプリング情報 (xmin, xmax, dx) をとり、関数を評価して結果を出力します。

クロージャを使うと、関数をオブジェクトとして扱えるので分かりやすいと思います。

Groops による実装

次は Groops による実装。 値の入力は Groovy の場合と同様にできるので、ここでは実装していません。 Groops では、物理系として数学関数を扱いたい場合は function ノードで比較的簡単に対応する PhysicalSystem オブジェクトを取得できるようにしています。 また、xmin, xmax, dx などのパラメータを指定しておけば、初期条件や反復条件を書く必要はありません(書いても構いませんが)。

@GrabResolver('https://github.com/waman/groops-core/tree/master/repo')
@Grab('org.waman.groops:groops-core:0.1-beta')

import org.waman.groops.builder.SimulationBuilder

double a = 1d, b = 1d
double xmin = -5d, xmax = 5d, dx = 0.1d

new SimulationBuilder().simulation{
    
    function(y:{ double x -> a*Math.exp(-b*x) }, xmin:xmin, xmax:xmax, dx:dx)
    console()
    png(fileName:'exercise2_1a.png', overwrite:true){
        chart(title:'exercise 2.1 a'){
            line(label:'a*exp(-bx)', x:'x', y:'y')
        }
    }
}.simulate()

出力されるグラフは以下のようになります:


計算物理学入門

計算物理学入門

  • 作者: ハーベイゴールド,ジャントボチニク,Harvey Gould,Jan Tobochnik,鈴木増雄,石川正勝,溜渕継博,宮島佐介
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2000/12
  • メディア: 単行本
  • 購入: 1人 クリック: 28回
  • この商品を含むブログ (45件) を見る
プログラミングGROOVY

プログラミングGROOVY