C# には、手続きを引数にする「delegate」の機能があります。 この英単語は「使節」という意味らしいですが、実体は「candidate(候補)」に近いのではないでしょうか。 稀にしか使わない機能だと思いますが、今回、逆関数を求めるために使ってみました。
例えば、次のプログラムでは、標準の関数 Math.Tan を引数とし、その逆関数(Math.Atan に相当)を実行しています。 同じように、自作のものなど任意の関数(引数リストと返す変数の形が同じもの)を引数にできます。
x と y の両方がベクトルである場合の y = f(x) という変換で、y = y0 を満たす x を求める場合、 y をノルムにしてしまって、その極値(普通は極小値ゼロ)を、最急降下法や共役勾配法で求めることがよく行われるように思います。 ですが、ノルムしか知られない場合にそういう計算をするのは仕方ないものの、折角目的のベクトルが知られているなら、その豊富な情報を使わないのは勿体ないです。 ベクトル値のまま、目的の点近傍につき逆行列を作って解きましょう。
次のプログラムの中の「vtovfuncinv」は、ベクトルからベクトルへの変換に対する逆変換を与えるもので、その第一引数が引き渡される元の変換を行う手続きです。 第二引数には、初期条件とする(なるべく)近傍の点、第三引数には目的とする y0 を置きます。
上のプログラムの中で、「matsqrt」は行列の平方根を与えます。 ここに平方根とは、A、B を(正方)行列で B = A・A とするとき、B から A を求めるものです。 ここでは行列の平方というものを、行列の各要素(を列挙したベクトル)から、平方たる行列の各要素(を列挙したベクトル)への変換と捉え、その逆を求める形で実装しています。 これらの要素の関係は、行列の次元を N とすると、N×N 個の変数による、N×N 個連立の二次式ということになります。 この計算例は四次元ですが、他の次元でも勿論できます。