1 基本クラス関数の概要
関数またはファンクター func と、個別の初期点 ax および
bx を指定すると、このルーチンは下り坂方向 (
初期点で評価されるように関数によって定義される) を検索し、
最小値を囲む新しい点 ax、bx、cxを返します。 function。fa
、fb、fc の 3 つの点の関数値も返されます。
関数またはファンクター func が与えられ、異なる初期点 ax および bx が与えられると、このルーチンは (初期点で評価される関数によって) 下り坂方向に検索し、新しい点 ax、bx、bz、cx を返します。関数。また、関数 fa、fb、fc の 3 点の値も返されます。
2 基本クラスの C# コード
システムを使用する;
namespace Legalsoft.Truffer
{ /// <summary> /// 一 次元最小化ルーチンの基底クラス。 ///最小限の関数といくつかのユーティリティ関数を /// まとめる ルーチンを提供します。 /// </summary> public class Bracketmethod { public double ax; パブリックダブルBX。 パブリックダブルCX; 公的ダブルファ。 パブリックダブルFB; パブリックダブルFC;
/// <summary>
/// 関数またはファンクター func と、個別の初期点 ax および
/// bx を指定すると、このルーチンは下り方向に検索します (
/// 初期点で評価される関数によって定義されます)。
/// 関数の最小値を囲む新しい点 ax、bx、/// cx を返します。また、 ///
3 つの点、fa、fb、fc における関数の値も返されます。
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
public void括弧(double a, double b, UniVarRealValueFun func)
{ const double GOLD = 1. 618034; const double GLIMIT = 100.0;
const double TINY = 1.0e-20;
斧 = a;
bx = b;
ダブルフー。
fa = func.funk(ax);
fb = func.funk(bx);
if (fb > fa)
{ Globals.SWAP(ref ax, ref bx); Globals.SWAP(ref fb, ref fa); cx = bx + GOLD * (bx - ax); fc = func.funk(cx); while (fb > fc) { double r = (bx - ax) * (fb - fc); ダブルq = (bx - cx) * (fb - fa);
double u = bx - ((bx - cx) * q - (bx - ax) * r) / (2.0 * Globals.SIGN(Math.Max(Math.Abs(q - r), TINY), q - r) );
double ulim = bx + GLIMIT * (cx - bx);
if ((bx - u) * (u - cx) > 0.0)
{ fu = func.funk(u); if (fu < fc) { ax = bx; bx = u; fa = fb; fb = ふ; 戻る; } else if (fu > fb) { cx = u;
fc = ふ;
戻る;
u
= cx + GOLD * (cx - bx);
fu = func.funk(u);
else
if ((cx - u) * (u - ulim) > 0.0)
{ fu = func.funk(u); if (fu < fc) { shft3(ref bx, ref cx, ref u, u + GOLD * (u - cx)); shft3(ref fb, ref fc, ref fu, func.funk(u)); else if ((u - ulim) * (ulim - cx) >= 0.0 ) {
u = ウリム;
fu = func.funk(u);
}
else
{ u = cx + GOLD * (cx - bx); fu = func.funk(u); shft3 (ref ax, ref bx, ref cx, u); shft3(ref fa, ref fb, ref fc, fu); } }
public void shft2(ref double a, ref double b, double c)
{ a = b; b = c; }
public void shft3(ref double a, ref double b, ref double c, double d)
{ a = b; b = c; c = d; }
public void mov3(ref double a, ref double b, ref double c, double d, double e, double f)
{ a = d; b = e; c = f; } } }