Location : Home > Languages > Perl > Package
Title : Math::LinearCombination
Toolbox Logo

名称

 Math::LinearCombination - 一次結合を処理


概要

use Math::LinearCombination;
use Math::SimpleVariable; # for the variable objects

# 一次結合を構築
my $x1 = new Math::SimpleVariable(name => 'x1');
my $x2 = new Math::SimpleVariable(name => 'x2');
my $lc = new Math::LinearCombination();
$lc->add_entry(var => $x1, coeff => 3.0);
$lc->add_entry(var => $x2, coeff => 1.7);
$lc->add_entry(var => $x2, coeff => 0.3); # x2 の係数は 2.0
print $lc->stringify(), "\n";

# 計算を行う
$lc->negate_inplace(); # 係数の符号を反転
$lc->multiply_with_constant_inplace(2.0); # 全係数を2倍

# 一次結合を評価
$x1->{value} = 3;
$x2->{value} = -1;
print $lc->evaluate(), "\n"; # -14 を出力する。

説明

 変数の数学的1次結合すなわちフォーマットの表現を行うモジュールである。

a1 * x1 + a2 * x2 + ... + an * xn

 ただし、x1, x2, ..., xn は変数で a1, a2, ..., an は係数である。
 線型結合の評価と計算もサポートしている。係数 a_i と変数 x_i は内部データでは対で格納され、直接操作されない。あらゆるアクセス及び操作はメソッドを通じて行われる。
 変数オブジェクトに対しては特定のクラスを要求していないことに留意することは重要である。いかなるクラスのオブジェクトも、以下に示すメソッドで提供できる。

name( )

 変数名を文字列で返す。

id( )

 変数に対するユニークな識別子を返す。たいていのアプリケーションでは id() は name() を呼び出すだけで足りる。

evaluate( )

 変数の数値的評価を返す。

 Math::LinearCombination クラスは Math::SimpleVariable とともに利用するように設計されている。後者はあらゆる必要なメソッドをサポートし、線型結合で Math::SimpleVariable オブジェクトだけを利用することも論理的である。Math::SimpleVariable から導出された自身のクラスを用いてもよい。
 以下のメソッドは Math::LinearCombination オブジェクトに対して利用可能である。

$lc = new Math::SimpleVariable([$other_lc])

 新たな Math::SimpleVariable オブジェクトを生成する。 既存の Math::SimpleVariable オブジェクトを引数として渡すこともできるがその場合はそのオブジェクトのクローンを返す。(clone() メソッドを見よ。)

$lc = make Math::SimpleVariable($x1,$a1,$x2,$a2,...)

 新たな Math::SimpleVariable オブジェクトを生成するが、変数と係数の対 x_i, a_i で初期化することができる。引数の数は偶数でなければならず、変数オブジェクトは変数に対して与えられる必要がある。

$lc->clone( )

 変数も係数も共有せずに $lc の正確なコピーを返す。すなわち新しい(古い)線型結合の内容を古い(新しい)線型結合に影響を与えることなしに変更できる。

$lc->add_entry('var' => $x, 'coeff' => $a)

 線型結合に係数 $a をもった変数 $x を追加する。
 add_entry() は同じ id() が既に線型結合内にある場合にはエラーを返す。そのため線型結合を追加するのに add_entry() を用いてはならないが、代わりに add_inplace() または '+' 演算子(下を見よ)を用いることができる。

$ra_entries = $lc->get_entries()

 線型結合のあらゆる入力に対するハッシュへの参照を返す。ハッシュは変数の id() 順にソートされており、各入力は以下のフィールドを持つハッシュへの参照である。

@vars = $lc->get_variables()

 線型結合に含まれるあらゆる変数オブジェクトを配列で返す。get_variables() はコンテキストを判断するため、以下のように呼び出すことができる。

$ra_vars = $lc->get_variables

変数の配列への参照を返す。変数は id() の順にソートされている。

@coeffs = $lc->get_coefficients()

 get_variables() と同様であるが、係数を返す。係数は対応する変数の id() 順にソートされている。

$lc->add_inplace($lc2)

 mathematically adds the Math::LinearCombination オブジェクト $lc2 を数学的に $lc に加え、変更された $lc を返す。

$sum = $lc->add($lc2)

 $lc2 を $lc に数学的に加える。結果は新たに生成された Math::LinearCombination オブジェクトに格納される。$lc 及び $lc2 はそのままの状態である。

$lc->negate_inplace()

 線型結合における各変数の係数の符号を逆転させる。

$diff = $lc->subtract($lc2)

 $lc2 を $lc から数学的に減じる。結果は新たに生成された Math::LinearCombination オブジェクトに格納される。$lc 及び $lc2 はそのままの状態である。

$lc->multiply_with_constant_inplace($c)

 $lc の各係数に数学的定数 $c をそれぞれ乗じる。

$prod = $lc->mult($lc2)

 $lc2 を $lc に数学的に乗じる。結果は新たに生成された Math::LinearCombination オブジェクトに格納される。$lc 及び $lc2 はそのままの状態である。

$quot = $lc->div($c)

 $lc の各係数を数学的定数 $c でそれぞれ除する。結果は結果は新たに生成された Math::LinearCombination オブジェクトに格納される。$lc はそのままの状態である。
 線型結合同士の除算は結果が一般には線型結合とならないため不可能であることに注意。

$eval = $lc->evaluate()

 evaluate() を呼び出して得られた変数の値を用いて線型結合 $lc を数値的に評価する。

$lc->remove_zeroes()

 線型結合から係数が0である変数−係数の組み合わせを削除する。本メソッドはメソッド内部的に用い、通常は使う必要はない。

$lc->stringify()

 線型結合の文字列表現を返す。空の線型結合には '0.0' を返す。

 線型結合に対する数学的計算を冗長にならずに行うには、上記のメソッドをいくつかオーバーロードすることである。以下の演算子はオーバーロードする。

かつ '""' は線型結合を文字列化する際に用いられる。すなわち変数の挿入が可能な場所に線型結合オブジェクトを用いて文字列表現を取得する。


参考資料


バージョン

 現在の CVS $Revision は 1.11。
 最終の更新は 2001/10/31 12:50:02


著者

 Wim Verhaegen, <wimv@cpan.org>


著作権

 Copyright (C) 2001 Wim Verhaegen. All rights reserved.

 本プログラムはフリーソフトウェアであり、 Perl 本体と同等の条件で修正・再配布してもよい。

Toolbox Logo
Updated : 2007/04/02