スタートページ >
JavaScript >
ライブラリ目次
数値解析関連 JavaScript関数ライブラリ na.js の利用解説書
ご利用にあたって
代数系 f(x) を指定する
代数方程式 f(x) = 0 の根:はさみうち法
naFx0HasamiuchiTrace(表示場所, fx, xmin, xmax[, eps]) コード表示
var x = naFx0Hasamiuchi(fx, xmin, xmax[, eps]) コード表示
はさみうち法による f(x) = 0 の解(参照:「方程式の根」 )を求める。
fxは文字列として、全体を" "で囲む。
xmin~xmaxの間に唯一の実根があることを前提にしている( f(xmin) と f(xmax) が同符号ではいけません。
二分法でxmin~xmaxの範囲を狭めていき、絶対誤差 |f(x)| < eps になるまで繰り返す。epsを省略すると、(xmax-xmin)/1000とする。
ケース1
入力
var fx = "x*x-1";
var xmin = 0;
var xmax = 3;
var eps = 0.001;
出力
var x = naFx0Hasamiuchi(fx, xmin, xmax, eps);
// x:1
Trace実行
Return実行
ケース2
Trace実行
Return実行
方程式の根(ニュートン法)
naFx0NewtonTrace(表示場所, fx, x0[, eps]); コード表示
var x = naFx0Newton(fx, x0[, eps]); コード表示
ニュートン法により、方程式の実根を求める。
xn = xn-1 - f(xn-1 )/f'(xn-1 ) (f'=df/dx)
を繰り返して根に近づく。参照:「方程式の根」
x0は初期値。その値により異なる解に達したり、解が得られないことがある。
fxは文字列として、" "で囲む。eps を省略すると 0.001 になる、
ケース1
入力
var fx = "x*x-1";
var x0 = 0.3;
var eps = 0.001;
出力
var x = naFx0Newton(fx, x0, eps);
// x:1
Trace実行
Return実行
ケース2
Trace実行
Return実行
3次方程式の複素数根 a0 + a1 x + a2 x2 + a3 x3 = 0
naFx03jiTrace(表示場所, a0, a1[, a2[, a3]]) コード表示
var x = naFx03ji(a0, a1[, a2[, a3]]) コード表示
a3 を省略すると2次方程式、さらにa2 を省略すると1次方程式になる。
2次方程式は根の公式による。3次方程式は、特殊なケースを除き、ニュートン法により一つの実根を求め、式の変形により2次方程式にして求める。
戻り値は2次元配列である。下の[出力]参照
ケース1
入力
var x = naFx03ji(2, 0, -1, 1); // 2x3 - x + 1 = 0
出力
x[k][0] 実数部 x[k][1] 虚数部
x[0][0]= 1.000 x[0][1]= 0.9999
x[1][0]= 1.000 x[1][1]=-0.9999
x[2][0]=-1.000 x[2][1]= 0
Trace実行
Return実行
ケース2
Trace実行
Return実行
数式 f(x) を最大にする x
naFxMaxTrace(表示場所, fx, xmin, xmax [, eps]) コード表示
var x = naFxMax(fx, xmin, xmax [, eps]) コード表示
数式 f(x) が最大となるxの値を戻します。
xmin~xmaxを100等分してdxとし、for (x=xmin, x<=xmax; x=x+dx) でf(x) を最大にする x を求め、次に x-dx~x+dx で同様な操作を繰り返すことにより、最終的な最適値 x を求めます。epsを省略すると(xmax-xmin)/1000になります。
ケース1
入力
var fx= "x*(x-1)*(x-2)";
var xmin = -1;
var xmax = 2;
var eps = 0.0001;
出力
var x = naFxMax(fx, xmin, xmax, eps);
// x = 0.4226
Trace実行
Return実行
ケース2
Trace実行
Return実行
代数式 f(x) のxにおける微分係数a
naFxDiffTrase(表示場所, fx, x [, d, eps]) コード表示
var a = naFxDiff(fx, x [, d, eps]) コード表示
fxのxにおける微係数aを求めます。xの近傍の2点 x-d*xとx-d*xでの勾配をa0とし、dを1/2にしたときの勾配aとの差が、相対誤差 |(a-a0)/a| < eps になるまで繰り返します。
dを省略すると0.01、epsを省略すると0.001にしています。
ケース1
入力
var fx= "x*x";
var x = 1;
var d = 0.01; // 微小区間
var eps = 0.001; // 打切誤差
var a = naFxDiff(fx, x, d, eps);
出力
a = 2
Trace実行
Return実行
ケース2
Trace実行
Return実行
微分方程式(ルンゲクッタ法)
naFxRungeKutta(表示場所, fxy, x, dx) コード表示
a = naFxRungeKutta(fxy, x, dx) コード表示
一階微分 dy/dx = f(x,y) の式を与えて y(x+dx) = y(x) + a*dx の a の値を、4次のルンゲクッタ法により求めます。
ルンゲクッタ法では、次のステップで定義します。
k1 = f(x,y)
k2 = f(x+dx/2, y+k1*dx/2)
k3 = f(x+dx/2, y+k2*dx/2)
k4 = f(x+dx, y+k3*dx)
a = (k1 + 2*k2 + 2*k3 + k4) / 6
ケース1
入力
var fxy= "x*y"; // 文字列 f(x,y) をJavaScript形式で記述
var x = 2; // fxy に x がなくても形式的に適当な値を与える
var y = 1; // fxy に y がなくても形式的に適当な値を与える
var dx = 0.01;
var a = naFxRungeKutta(yx, x, y, dx);
出力
a=2.0252
Trace実行
Return実行
ケース2
Trace実行
Return実行
微分方程式(ルンゲクッタ法)作表
var [x, y, a, dy] = naFxRungeKuttaTable(fxy, xmin, xmax, dx, y0) コード表示
一階微分 dy/dx = f(x,y) の式を与えて 4次のルンゲクッタ法により x = xmin~xmax に対応する y の値、および関連する値を算出します(y0 は x = xmin のときの y の値)。
x: x = xmin, xmin+dx, xmin+2*dx, …, xmax の値
y: x に対応する y の値
a: (x,y) における微分係数
dy: y の増分 a*dx
ここでは参考のために、表の一部を表示していますが、関数自体は表示機能は持っていません。
実行
連立微分方程式(ルンゲクッタ法)
naFxRungeKutta2Trace(表示場所, ft, gt, x, y, dt) コード表示
var [ax, ay] = naFxRungeKutta2(ft, gt, x, y, dt) コード表示
二つの一階微分 dx/dt = f(x,y), dy/dt = g(x,y) の式を与えて、
点(x,y) で x(t+dt) = x(t) + ax*dt, y(t+dt) = y(t) + ay*dt となる偏微分係数 ax, ay の値を 4次のルンゲクッタ法により求めます。
ルンゲクッタ法では、次のステップで定義します。
k1 = f(x,y)
k2 = f(x+dx/2, y+k1*dx/2)
k3 = f(x+dx/2, y+k2*dx/2)
k4 = f(x+dx, y+k3*dx)
a = (k1 + 2*k2 + 2*k3 + k4) / 6
ケース1
入力
var ft = "4*x - x*y"; // dx/dt を 文字列 ft として与える
var gt = "-10*x + 2*x*y"; // dy/dt を 文字列 gt として与える
var x = 10;
var y = 15;
var dt = 0.01;
var ax. ay = naFxRungeKutta2(ft, gt, x, y, dt);
出力
ax = -104.728, ay = 221.522
Trace実行
Return実行
ケース2
Trace実行
Return実行
連立微分方程式(ルンゲクッタ法)作表
var [t, x, ax, dx, y, ay, dy] = naFxRungeKutta2Table(ft, gt, x0, y0, tmin, tmax, dt); コード表示
二つの一階微分 dx/dt = f(x,y), dy/dt = g(x,y) の式と t = tmin における x0, y0 を与えて、t = tmin~tmax (刻み dt)での x(t), y(t) などを表の形式で戻します。
t: t[i] = t t = tmin, tmin+dt, tmin+2*dt, …, tmax の値
x: x[i]
ax:偏微分係数 ∂x/∂t(t)
dx:x の増分 ax[i]x*dt
y: y[i]値
ay:偏微分係数 ∂y/∂t(t)
dy:y の増分 ay[i]*dx
ここでは参考のために、表の一部を表示していますが、関数自体は表示機能は持っていません。
実行
数式 f(x) の極値(複数)
naFxExtremeTrace(表示場所, fx, xmin, xmax [, eps]) コード表示
var [極値, 大小] = naFxExtreme(fx, xmin, xmax [, eps]) コード表示
数式 f(x) の極値 f'(x) が正から負へ、負から正に変化する点(複数)を戻します。
まず、xmin~xmaxを100等分してdxとし、x-dx と x+dx の間で f'(x) の符号が変化したら極値があることになります。
次に x-dx~x+dx で同様な操作を繰り返すことにより、最終的な最適値 x を求めます。精度は0.0001 になります。
戻り値の形式
極値:xi
大小:xi が極大なら1、極小なら-1
ケース1
入力
var fx= "x*(x-1)*(x-2)";
var xmin = -1;
var xmax = 3;
var [極値, 大小] = naFxExtreme(fx, xmin, xmax);
出力
極値[0] = 0.423 大小[0] = 1 // x=0.423 のとき、極大になる
極値[1] = 1.578 大小[1] = -1 // x=1.578 のとき、極小になる
Trace実行
Return実行
ケース2
Trace実行
Return実行
代数式 f(x) の定積分(シンプソン則)
naFxSimpsonTrace(表示場所, fx, xmin, xmax [, n2, eps]) コード表示
var s = naFxSimpson(fx, xmin, xmax [, n2, eps]) コード表示
シンプソン則は、2次式で近似します。
閉区間[xmin,xmax]を2n等分して、h=(xmax-xmin)/2にすると(すなわち
x0 (=xmin),x1 ,x2 ,....,x2n (=max)
ととして、xi に対応するfxの値を yi とすると)
S=(xmax-xmin)/6n *{(y0 +y2n )+4(y1 +y3 +...y2n-1 )+2(y2 +y4 +...y2n-2 ) }
となります。参照:「定積分」
最初のn2で計算した値をs0、次にn2を2倍(すなわちキザミ幅を1/2)にして計算した値を s として、相対誤差 |(s-s0)/s| <eps となるまで繰り返します。
n2を省略すると20、epsを省略すると (xmax-xmin)/1000 にしています。
ケース1
入力
var fx = "x*x";
var xmin = 1;
var xmax = 2;
var n2 = 20;
var eps = 0.001;
出力
var s = naFxSimpson(fx, xmin, xmax, n2, eps);
// s = 2.333
Trace実行
Return実行
ケース2
Trace実行
Return実行
漸化式の特性方程式
漸化式の係数と初期値を与えて、an の一般解を「文字列」として戻します。
ここでは一般解が1命令で表現できる漸化式に限定しています。
Trace では、元の漸化式を順次計算した数列と、一般解にnを代入した数列を表示するので、一般解の確認ができます。
(係数と初期値の値によっては、一般解が得られないこともあります)
an+1 =p*xn +q
naZenka2Trace(表示場所, a1, p, q) コード表示
var an = naZenka2(a1, p, q) コード表示
an+1 =p*xn + q + rn
naZenka2nTrace(表示場所, a1, p, q, r) コード表示
var an = naZenka2n(a1, p, q, r) コード表示
an+1 =p*an + q*rn
naZenka2eTrace(表示場所, a1, p, q, r) コード表示
var an = naZenka2e(a1, p, q, r) コード表示
an+1 =p*an q
naZenka2expTrace(表示場所, a1, p, q) コード表示
var xn = naZenka2exp(a1, p, q) コード表示
a1 および(あるいは)p が負数のときは、q を整数に限定しています。
その場合でも、適切な解がえられないことがあります、
an+2 =p*an+1 + q*an
naZenka3Trace(表示場所, a1, a2, p, q) コード表示
var an = naZenka3(a0, a1, p, q) コード表示
特性方程式の判別式 D = q2 + 4q の正負により、計算方法が異なります。
D > 0 (実根)の例:a1=0, a2=1, p=2, q=3
D = 0 (重根)の例:a1=0, a2=3, p=6. q=-9
D < 0 (虚根)の例:a1=2, a2=4, p=2, q=-3
多点系 点(x,y) を与える
多点系 最小二乗法
最小二乗法(1次式)y = a[0] + a[1]x
naLsm1Trase(表示場所,x,y)コード表示
var a = naLsm1(x,y) コード表示
ケース1
入力
var x = [ 0, 2, 4, 6, 8, 10, 12 ];
var y = [ 1, 20, 30, 45, 50, 60, 70 ];
var a = naLsm1(x, y);
出力
a[0] = 6.54, a[1] = 5.48
// y = 6.54 + 5.48x
Trace
Return
ケース2
Trace
Return
最小二乗法(1次式)の拡張 相関係数と95%信頼区間
naLsm1ExTrace(表示場所, x,y) コード表示
var [a, r, CI] = naLsm1Ex(x,y) コード表示
ケース1
入力
var x = [ 0, 2, 4, 6, 8, 10, 12 ];
var y = [ 5, 20, 30, 45, 50, 60, 70 ];
var rtn = naLsm1Ex(x, y);
出力
係数 a[0]=8.393, a[1]=5.268
相関係数 r=0.993
信頼区間 CI[0]=4.830, CI[1]=3.789, … ,CI[6]=4.830
Trace
Return
ケース2
Trace
Return
最小二乗法(n次式)y = a[0] + a[1]x + … + a[n]*xn の a[i] を求める
naLsmMDTrace(表示場所, x,y.n) コード表示
var a = naLsmMD(x,y.n) コード表示
n次式、
y=a[0]+a[1]x+a[2]x2 +・・・+a[n]xn
の a[i] は、次の連立方程式の解になります。
a[0] a[1] a[2] ・・・ a[n] 定数項
n ∑x ∑x2 ・・・ ∑xn ∑y
∑x1 ∑x2 ∑x3 ・・・ ∑xn+1 ∑yx
∑x2 ∑x3 ∑x4 ・・・ ∑xn+2 ∑yx2
: : : : : :
∑xn ∑xn+1 ∑xn+2 ・・・ ∑x2n ∑yxn
ケース1
入力
var y = [ 8, 5, 2, 0, 3, 6, 8 ];
var x = [-3, -2, -1, 0, 1, 2, 4 ];
var n = 2;
var a = naLsmMD(x, y, n);
出力
a[0] = 2.12, a[1] = -0.27, a[2]=0.50
// y = 2.12 - 0.27 x + 0.50 x2
Trace
Return
ケース2
Trace
Return
最小二乗法(多項式)y = a[0] + a[1]x[0] + … + a[n]*x[n-1] の a[i] を求める
naLsmMVTrace(表示場所, x,y) コード表示
var a = naLsmMV(x,y) コード表示
多項一次式
y=a[0]+a[1]x[0]+a[2]x[1]+・・・+a[n]x[n-1]
の係数 a[i] は、次の連立方程式の解になります。
a[0] a[1] a[2] ・・・ a[n] 定数項
n ∑x[0] ∑x[1] ・・・ ∑x[n-1] ∑y
∑x[0] ∑x[0]x[0] ∑x[0]x[1] ・・・ ∑x[0]x[n-1] ∑yx[0]
∑x[1] ∑x[1]x[0] ∑x[1]x[1] ・・・ ∑x[1]x[n-1] ∑yx[1]
: : : : : :
∑x[n-1] ∑x[n-1]x[0] ∑x[n-1]x[1] ・・・ ∑x[n-1]x[n-1] ∑yx[n-1]
ケース1
入力
var y = [12, 15, 4, 2, 18, 1, 14];
var x = [ [ 0, 1, 2, 3, 4, 5, 6], // x[0][j]
[ 2, 5, 3, 1, 7, 1, 4], // x[1][j]
[ 4, 3, 0, 1, 5, 2, 6] ]; // x[2][j]
var a = naLsmMVTrace(x, y);
出力
a[0]=1.08, a[1]=-1.046, a[2]=1.68, a[3]=1.98
// y= 1.08 - 1.04 x[0]+1.68 x[1]+1.98 x[2]
Trace
Return
ケース2
Trace
Return
多点系 補間法
ニュートンの補間法
naPolNewtonTrace(表示場所, x, y, px) コード表示
var py = naPolNewton(x, y, px) コード表示
n+1個の点(x0 ,y0 ), (x1 ,y1 ), …,(xn ,yn )を通るn次式 f(x)を、
f(x)=c0 + c1 (x-x0 ) + c2 (x-x0 )(x-x1 )
+ … + cn (x-x0 )(x-x1 )…(x-xn-1 )
の形で表します。そして、
f(x0 )=y0 、f(x1 )=y1 、…、f(xn+1 )=yn+1
の関係から、cの値を求めて、n次式 f(x) を決定します。参照:「ニュートンの補間公式」
その式に、x=px に対応する y の値 py を戻します。
ケース1
入力
var x = [ 0, 2, 3, 5 ];
var y = [ 1, 5, 8,10 ];
var px = [1, 4];
var py = naPolNewton(x, y, px);
出力
py[0] = 2.267, py[1]=10.067
Trace
Return
ケース2
Trace実行
Return実行
ラグランジュの補間法
naPolLagrangeTrace(表示場所, x, y, px) コード表示
var py = naPolLagrange(x, y, px) コード表示
n+1組の点xa[0]~xa[n]、ya[0]~ya[n] を通るn次式をラグランジュの補間法により求め、m 個の、xa[n+1]~xa[n+1} における ya[n+1]~ya[n+m] を戻します。
n次式に一般化して、
y=c0 y0 +c1 y1 +c2 y2 +・・・+cn yn
としたときの、ck は、次の式になります。
ck = (x-x0 )/(xk -x0 ) * (x-x1 )/(xk -x1 ) * … * (x-xk-1 )/(xk -xk-1 )
((x-xk )/(xk -xk )の項がないことに注意)
* (x-xk+1 )/(xk -xk+1 ) * … * (x-xn )/(xk -xn )
この式に、x = px を与えたときの y の値 py を戻します。
参照:「ラグランジュの補間法」
ケース1
入力
var x = [ 0, 2, 3, 5, 7, 8 ];
var y = [ 4, 3, 6, 8, 6, 8 ];
var px = [1, 4. 6 ];
py = naPolLagrange(x, y, px);
出力
py = 1.067, 7.905, 6.829
Trace実行
Return実行
ケース2
Trace実行
Return実行
スプライン補間(3次)
naPolSplineTrace(表示場所, x, y, px) コード表示
var py = naPolSpline(x, y, px) コード表示
スプライン補間は、n+1個の点 (x0 ,y0 ), (x1 ,y1 ), … , (xn ,yn ) を、2つの点の区間 [xj ~xj+1 ]ごとに別々の式(一般には3次式)Sj (x) を設定して緩やかな曲線にし、極端な補間値にならないようにする補間法です。参照:「スプライン補間」
区間 [xj ~xj+1 ] における3次式を
Sj =aj (x-xj )3 + bj (x-xj )2 + cj (x-xj ) + dj (j=0~n-1)
とします。
ここで aj , bj , cj , dj を求めることになります。
これらの3次式が滑らかにつながっている必要があります。それで、xj におけるSj-1 とSj の1次導関数(傾き)S(1) と2次導関数(滑らかさ)S(2) の値が等しいという条件を加えます。さらに、始点 x0 と終点 xn での2次導関数の値が0であるとの仮定をします。
ケース1
入力
var x = [ 0, 2, 3, 5, 7, 8 ];
var y = [ 4, 2, 6, 8, 6, 8 ];
var px = [1, 4. 6 ];
var py = naPolSpline(x, y, px);
出力
py = 1.614, 8.189, 6.499
Trace実行
Return実行
ケース2
Trace実行
Return実行
最小二乗法(高次式)による補間
naPolLeastSquareTrace(表示場所, 次数, x, y, px> コード表示
var [c, py] = naPolLeastSquare(次数, x, y, px>) コード表示
n組の(x,y)から、最小二乗法により、r次の近似式 y=c0 +a1 x+c2 x2 +...+cr xr の係数 ci を求め。この近似式により、f個の px に対応する py を計算します。; ソースコード
参照:「回帰分析・最小二乗法」 、
「多項式、高次式での最小二乗法」
ケース1
入力
var 次数 = 3;
var x = [ 0, 2, 3, 5, 7, 8 ];
var y = [ 4, 2, 6, 8, 6, 8 ];
var px = [1, 4. 6 ];
var [c, py] = naPolLeastSquare(表示場所, 次数, x, y, px);
出力
c = 3.610, -0.778 ,0.523, -0.046
// 近似式 = 3.610 - 0.778x + 0.523 x2 - 0.046 x3
py = 3.309, 5.894, 7.731
Trace実行
Return実行
ケース2
Trace実行
Return実行
ベジェ曲線(2次、3次)
var [X, Y] = naBezier(x, y, p) コード表示
ベジェ曲線とは、始点と終点を固定し、その直線を制御点から引っ張るような曲線にしたものです。
その計算方法は下式の通りです。
これらの式で、t=0 ~ 1 を p個に等分して、曲線の座標を (X[i], Y[i]) i=0 ~ p で戻します。
2次ベジェ(3点を与える。始点(x[0,y[0]), 終点(x[2],y[2]), 制御点(x[1],y[1])
X[i] = (1-t)2 *x[0] + 2(1-t)t*x[1] + t2 *x[2]
Y[i] = (1-t)2 *y[0] + 2(1-t)t*y[1] + t2 *y[2]
3次ベジェ(4点を与える。始点(x[0,y[0]), 終点(x[3],y[3]), 制御点(x[1],y[1]),(x[2],y[2])(x[2],y[2])
X[i] = (1-t)3 *x[0] + 3(1-t)2 t*x[1] + 3(1-t)*t2 *x[2] + t3 *x[3]
Y[i] = (1-t)3 *y[0] + 3(1-t)2 t*y[1] + 3(1-t)*t2 *y[2] + t3 *y[3]
式を求める手順は単純ですので、trace は省略します。
ケース1
始点 制御点 終点
var x = [ 0, 1, 2, 3];
var y = [ 0, 0.5, 3.5, 3];
p
var [X, Y] = naBezier(x, y, 10);
実行
ケース2
実行
正方行列系 線形連立方程式など
連立一次方程式(ガウス=ジョルダンの掃出し法)
naGaussJordanTrace(表示場所, 係数表, 定数項) コード表示
var x = naGaussJordan(係数表, 定数項) コード表示
説明変数や被説明変数の標本から、連立方程式の定式化を行い、解を求めるまでの一連の処理を行うには、
maMregEq 関数があります。
ケース1
入力
var 係数表 = [ [0, 3, 2], // 0x0 + 3x1 + 2x2 = 12
[2, 4, 0], // 2x0 + 4x1 + 0x2 = 10
[3, 1, 5] ]; // 3x0 + 1x1 + 5x2 = 20
var 定数項 = [12, 10, 20];
var x = naGaussJordan(係数表, 定数項);
出力
x[0] = 1, x[1] = 2, x[2] = 3
Trace実行
Return実行
ケース2
Trace実行
Return実行
N+1個の点を通るN次式の係数
naCoefNthDegTrace(表示場所, x, y) コード表示
var c = naCoefNthDeg(x, y) コード表示
例えば、4(=N+1)個の点 [x0,y0], [x1,y1], [x2,y2], [x3,y3] を通る3(=N)次式
y = c[0] + c[1] x + c[2] x2 + c[3] x3
の係数 c[i] を求めます。
x0 < x1 < … < xn にしてください。xn が極端に大きくならないように単位を調整してください。
連立一次方程式(ガウス=ジョルダンの掃出し法)の応用です。
ケース1
入力
var x = [-1, 0, 1, 2]; // 4つの点→3次式
var y = [ 2, 2, 6, 8];
var c = naCoefNthDeg(x, y);
出力
c[0] = 2, c[1] = 3, c[2] = 2, c[3] = -1
// y = 2 + 3 x + 2 x2 - 1 x3
Trace
Return
ケース2
Trace実行
Return実行
行列式の値
naDetSurrusTrace(表示場所, a) コード表示
var det = naDetSurrus(a) コード表示
4次以下の行列式の値をサラス法で求めます。
ケース1
var a = [ [ 2, 1, 5, 3],
[ 3, 0, 1, 6],
[ 1, 4, 3, 3],
[ 8, 2, 0, 1] ];
var det = naDetSurrus(a); // -7
Trace
Return
ケース2
Trace
Return
逆行列
naMtxInvTrace(表示場所, 行列) コード表示
var 逆行列 = naMtxInv(行列) コード表示
行・列のサイズn の正方行列 a[i][j] の逆行列を、ガウス=ジョルダンの掃出法で求めます。
ケース1
入力
var 行列 = [ [0, 3, 2],
[2, 4, 0],
[3, 1, 5] ];
var 逆行列 = naMtxInv(行列);
出力
逆行列 = [[ -0.4, 0.26, 0.16],
[ 0.2, 0.12, -0.08].
[ 0.2, -0.18, 0.12] ]
Trace
Return
ケース2
Trace実行
Return実行
対称行列の逆行列
rtn = naMtxInvS(行列) コード表示
共分散行列や相関行列のように、対角要素が0でない対称行列の逆行列を求めます。
対角要素を順に pivot とすればよいので単純になります。
ケース1
var S = [ [42.00, 15.00, 24.50],
[15.00, 31.50, 21.25],
[24.50, 21.25, 35.88] ];
naMtxInvSTest1実行
ケース2
naMtxInvSTest2実行
固有値・固有ベクトル
naMtxEigenTrace(表示場所, 行列) コード表示
var [λ, V] = naMtxEigen(行列) コード表示
かなり高度・複雑な処理なので、次の制約を設けました。
・次数は2次あるいは3次だけとする。
・固有値は実固有値だけを対象にする。
(注)多変量解析では、高次の対称行列から、実数で絶対値の大きい固定値を2,3だけ必要なことがあります。
その目的には、maEigenPower があります。
ケース1
入力
var 行列 = [ [ -1, 2, 2],
[ 2, 2, 2],
[ -3, -6, -6] ];
var [λ, V] = naMtxEigen(行列);
出力
λ V
0 0, 1, -1
-3 1, 0, -1
-2 -2, 1, 0
列の順序は、異なることがあります。
V は、各列を k 倍しても同じです。
Trace実行
Return実行
ケース2
Trace実行
Return実行