<< mvvacov 5-5-2 parallel_concurrency >>
removed >> removed > 5-5-2 > numdiff

numdiff

ある点における数値的な傾きの推定

呼び出し手順

g = numdiff(fun, x)
g = numdiff(fun, x, dx)

引数

fun

外部, Scilab 関数またはリスト. 呼び出し手順については, 以下を参照ください. また,外部関数に関する詳細については, externalを参照ください. f: Rn --> Rp

x

傾きを探す点の n 座標のベクトル

dx

ベクトル, 有限差分ステップ. デフォルト値は dx = sqrt(%eps)*(1+1d-3*abs(x))です.

g

行列, 軌跡xにおける傾きの推定値

説明

Rn から Rpまで 関数 fun(x)を指定すると, 有限差分法により 以下のような p x n 行列 gを計算します.

g(i,j) = [(df_i)/(dx_j)](x)

1次の式を使用します.

パラメータがない場合, 関数funの呼び出し手順は, x ∈ Rn および y ∈ Rpとして, y = fun(x) となります. numdiff は, g = numdiff(fun, x)のようにコールできます. これ以外の場合,関数funの呼び出し手順は, y = fun(x, param_1, pararm_2, ..., param_q) となります. パラメータparam_1, param_2, ..., param_qが存在する場合, numdiff は以下のようにコールすることができます g = numdiff(list(fun, param_1, param_2, ..., param_q), x).

数値精度,2つのアルゴリズムの比較については, 微分を参照ください.

// 例1 (パラメータなし)
// myfun は R^2 から R への関数:   (x(1),x(2)) |--> myfun(x)
function f=myfun(x)
f = x(1)*x(1) + x(1)*x(2)
endfunction
x = [5 8];
g = numdiff(myfun, x)
// 正確な傾き (すなわち,最初の要素x(1)に関する微分および二番目の要素x(2)に関する
// 微分はexact=[2*x(1)+x(2)  x(1)]となります.
exact = [2*x(1)+x(2)  x(1)]
// 例2 (パラメータあり)
// myfun はRからRへの関数:  x(1) |--> myfun(x)
// myfun は3個のパラメータ a, b, cを有します
function f=myfun(x, a, b, c)
f = (x+a)^c + b
endfunction
a = 3; b = 4; c = 2;
x = 1;
g2 = numdiff(list(myfun, a, b, c), x)
// 正しい傾き, すなわち,x(1)に関する微分は以下のようになります:
exact2 = c*(x+a)^(c-1)
// 例3 (f: R^3 --> R^3)
// myfunはR^2からR^2への関数: (x(1), x(2), x(3)) |--> (myfun(x)(1), myfun(x)(2), mfun(x)(3))
function f=myfun(x)
f(1) = x(1) * x(1);
f(2) = x(1) * x(2) * x(3);
f(3) = 2*x(1) + 2*x(2) + 2*x(3);
endfunction
x = [5 8 10];
g = numdiff(myfun, x)
// 正確な傾斜は以下となります:
// [  df_1/dx_1  df_1/dx_2  df_1/dx_3 ;
//    df_2/dx_1  df_2/dx_2  df_2/dx_3 ;
//    df_3/dx_1  df_3/dx_2  df_3/dx_3 ; ]
exact3 = [2*x(1) 0 0  ;  x(2)*x(3) x(1)*x(3) x(1)*x(2)  ;  2 2 2]

参照

付録

我々は,numdiff関数を使用する numderivative関数を使うように更新できる方法について 議論しています.

以下の関数について考えてみましょう:

function f=myfun(x)
f = x(1)*x(1)+x(1)*x(2)
endfunction

および点:

x = [5 8]

ここで, 命令:

g1 = numdiff(myfun, x)

は以下で置換できます

g2 = numderivative(myfun, x)

正確に同じステップを使用することが重要です, numdiffと値が同じステップを使用します:

x = [5 8];
h = sqrt(%eps)*(1+1d-3*abs(x))
g1 = numdiff(myfun, x)
g2 = numderivative(myfun, x, h)
g1 == g2

履歴

VersionDescription
5.5.0 廃止予定となりました. Scilab 6.0.0で削除されます.
5.5.2 numdiff was removed after Scilab 5.5.2. numderivative replaces it.

<< mvvacov 5-5-2 parallel_concurrency >>