ブログ

【Julia入門】Juliaのコレクション① タプル型オブジェクト

統計や機械学習に関するプログラミングではPythonRが用いられることが多いですが、近年Juliaも注目を集めています。そこで当シリーズではJuliaの基本構文からライブラリの用い方などについて取りまとめます。当記事ではJuliaのタプル型オブジェクトについて取りまとめを行いました。

Julia入門
https://www.hello-statisticians.com/julia

Julia 1.8 Documentation
https://docs.julialang.org/en/v1/

タプル

タプルの生成

タプルは複数の変数などをまとめるオブジェクトで、(1,2,3)のように括弧を用いて下記のように表記します。

t = (1, 2, 3)
println(t)

・実行結果

(1, 2, 3)

タプルの型の確認や要素の取得は下記のように行うことができます。

println(t[1])
println(typeof(t))
println(typeof(t[1]))

・実行結果

1
Tuple{Int64, Int64, Int64}
Int64

タプルでは下記のように値の変更ができないことに注意が必要です。

t = (1,2,3)
t[1] = 2

・実行結果

MethodError: no method matching setindex!(::Tuple{Int64, Int64, Int64}, ::Int64, ::Int64)

タプルの活用

配列のサイズを確認する際に用いるsize関数の出力はタプルであることを確認しておくと良いです。

array = rand(3,2)
println(size(array))
println(typeof(size(array)))

・実行結果

(3, 2)
Tuple{Int64, Int64}

また、関数の可変長引数は下記のようにTuple型のオブジェクトで与えられることも抑えておくと良いです。

f(x...) = x
println(f(1,2,3))
println(typeof(f(1,2,3)))

・実行結果

(1, 2, 3)
Tuple{Int64, Int64, Int64}

名前付きタプル

名前付きタプルは各要素に名前を付けることができるタプルです。名前付きタプルは元々NamedTuples.jlパッケージで開発されていましたが、Julia 0.7から標準ライブラリに組み込まれました。名前付きタプルは下記のように用いることができます。

t = (a=1, b=2, c=3)
println(t)
println(t.a)

・実行結果

(a = 1, b = 2, c = 3)
1

名前付きタプルは下記のように値を取得することもできます。

t = (a=1, b=2, c=3)
println(t[2])
println(t[:c])

・実行結果

2
3

また、名前付きタプルのキーと値は下記のようにkeys関数やvalues関数を用いて取得できることも抑えておくと良いです。

t = (a=1, b=2, c=3)
println(keys(t))
println(values(t))

・実行結果

(:a, :b, :c)
(1, 2, 3)

参考

Julia 1.8 Documentation
https://docs.julialang.org/en/v1/

【Julia入門】Juliaの多次元配列① 多次元配列の生成

統計や機械学習に関するプログラミングではPythonRが用いられることが多いですが、近年Juliaも注目を集めています。そこで当シリーズではJuliaの基本構文からライブラリの用い方などについて取りまとめます。当記事ではJuliaの多次元配列の生成について取りまとめを行いました。

Julia入門
https://www.hello-statisticians.com/julia

Julia 1.8 Documentation
https://docs.julialang.org/en/v1/

多次元配列の生成

zeros・ones関数を用いた多次元配列の生成

zeros関数を用いることで下記のように多次元配列を生成することができます。

x1 = zeros(2,3)
x2 = zeros(Int64,2,3)
println(x1)
println(typeof(x1))
println("===")
println(x2)
println(typeof(x2))

・実行結果

[0.0 0.0 0.0; 0.0 0.0 0.0]
Matrix{Float64}
===
[0 0 0; 0 0 0]
Matrix{Int64}

同様にones関数を用いることで下記のように多次元配列を生成することができます。

x1 = ones(2,3)
x2 = ones(Int64,2,3)
println(x1)
println(typeof(x1))
println("===")
println(x2)
println(typeof(x2))

・実行結果

[1.0 1.0 1.0; 1.0 1.0 1.0]
Matrix{Float64}
===
[1 1 1; 1 1 1]
Matrix{Int64}

rand・randn関数を用いた多次元配列の生成

一様分布$U(0,1)$に基づく乱数の生成を行うrand関数を用いた配列の生成は下記のように行うことができます。

using Random
Random.seed!(1234)

x1 = rand(5)
x2 = rand(2,3)

println(x1)
println(x2)

・実行結果

[0.32597672886359486, 0.5490511363155669, 0.21858665481883066, 0.8942454282009883, 0.35311164439921205]
[0.39425536741585077 0.7955469475347194 0.7484150218874741; 0.9531246272848422 0.4942498668904206 0.5782319465613976]

上記のRandom.seed!(1234)は値の再現ができるように乱数のseedの固定を行いました。同様に標準正規分布$\mathcal{N}(0,1)$に基づく乱数の生成を行うrandn関数を用いた配列の生成は下記のように行うことができます。

using Random
Random.seed!(1234)

x1 = randn(5)
x2 = randn(2,3)

println(x1)
println(x2)

・実行結果

[-0.3597289068234817, 1.0872084924285859, -0.4195896169388487, 0.7189099374659392, 0.4202471777937789]
[-0.685670902276119 0.3248927294469157 0.46169497427896844; 2.0547630560640364 -0.30490125519643224 -0.8449577163759787]

配列の生成にあたって抑えておくとよい関数

配列の生成にあたって抑えておくと良い関数について下記に取りまとめました。

関数 概要
zeros(T,dims...) 全ての値が0の配列
ones(T,dims...)全ての値が1の配列
rand(T,dims...) それぞれの要素の値が一様分布に基づく配列
randn(T,dims...) それぞれの要素の値が標準正規分布に基づく配列
fill(x,dims...) 全ての値がxの配列

上記のTは型、dimsは配列の次元にそれぞれ対応します。型を表すTを省略する場合はFloat64型が適用されることが多く、同様に配列の次元を表すdimsを省略する場合は0次元のスカラー値に対応するサイズが1×1の配列が生成されます。

print(typeof(zeros()))

・実行結果

Array{Float64, 0}

Juliaの多次元配列の特徴

多次元配列とArray型

Juliaでは多次元配列は基本的にArray{T,N}型で定義されます。Tは要素の型、Nは配列の次元の数にそれぞれ対応します。Vector{T}型やMatrix{T}型も存在する一方でそれぞれArray{T,1}型とArray{T,2}型と同義であることは抑えておくと良いです。

多次元配列のインデックス

Juliaの多次元配列のインデックスは1から始まることに注意が必要です。NumPyでは0から始まるので、Juliaを用いる際に注意が必要です。

column-major order

$$
\large
\begin{align}
A = \left(\begin{array}{ccc} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{array} \right)
\end{align}
$$

上記のような配列を定義する際に、決定する必要があるのが要素を並べる順番です。NumPyの多次元配列は$a_{11} \to a_{12} \to a_{13}$のように行から要素を並べるrow-major orderであるのに対し、Juliaでは$a_{11} \to a_{21} \to a_{31}$のように列から要素を並べるcolumu-major orderであることは抑えておくと良いです。row-major ordercolumu-major orderによって行列が転置されるので、注意が必要です。

参考

Julia 1.8 Documentation
https://docs.julialang.org/en/v1/

Ch.1 「数理計画モデル」の章末問題の解答例 〜数理計画入門(朝倉書店)〜

当記事では「数理計画入門(朝倉書店)」の読解サポートにあたってChapter.$1$の「数理計画モデル」の章末問題の解答の作成を行いました。
基本的には書籍の購入者向けの解説なので、まだ入手されていない方は購入の上ご確認ください。また、解説はあくまでサイト運営者が独自に作成したものであり、書籍の公式ページではないことにご注意ください。

・解答まとめ
https://www.hello-statisticians.com/answer_textbook_math_optimization#green

章末の演習問題について

問題1.1の解答例

$$
\large
\begin{align}
\mathrm{Objective} : \, & 20x_1 + 30x_2 + 60x_3 \, \to \, \mathrm{Minimize} \\
\mathrm{Constraint} : \, & x_1 + x_2 + x_3 \leq 10 \\
& 2x_1 + 5x_2 + 8x_3 \leq 40 \\
& x_1 \geq 0, \, x_2 \geq 0, \, x_3 \geq 0
\end{align}
$$

・考察
$$
\large
\begin{align}
A &= \left(\begin{array}{ccc} 1 & 1 & 1 \\ 2 & 5 & 8 \end{array} \right) \\
\mathbf{x} &= \left(\begin{array}{c} x_1 \\ x_2 \\ x_3 \end{array} \right) \\
\mathbf{b} &= \left(\begin{array}{c} 10 \\ 40 \end{array} \right) \\
\mathbf{0} &= \left(\begin{array}{c} 0 \\ 0 \\ 0 \end{array} \right)
\end{align}
$$

制約条件は上記のように定義した行列を用いて下記のように表記することもできる。
$$
\large
\begin{align}
A \mathbf{x} & \leq \mathbf{b} \\
\mathbf{x} & \geq \mathbf{0}
\end{align}
$$

問題1.2の解答例

問題1.3の解答例

問題1.4の解答例

問題1.5の解答例

まとめ

統計検定準1級 問題解説 ~2016年6月実施 選択問題及び部分記述問題 問4~

過去問

過去問題は統計検定公式が問題と解答例を公開しています。こちらを参照してください。

[1] 解答

$\boxed{ \ \mathsf{1}\ }$ : $②$

$\dfrac{T^2_B}{\sigma^2_B}$ は自由度 $15$ の$\chi ^2$ 分布に従う.$\chi^2_{0.025} = 27.49$,$\chi^2_{0.975} = 6.26$ であるから
$$
P\left(6.26 \leq \dfrac{T^2_B}{\sigma^2 _B} \leq 27.49\right) = 0.95
$$
が成り立つ.従って, $\sigma^2_B$ の$95\%$ 信頼区間は,
$$
\left[ \dfrac{T^2_B}{27.49}, \dfrac{T^2_B}{6.26}\right] = \left[ 3.27, 14.38\right]
$$
となる.

参考

[2] 解答

$\boxed{ \ \mathsf{2}\ }$ : ①
$$
H_0: \sigma^2_A = \sigma^2_B \quad \text{vs} \quad H_1: \sigma^2_A > \sigma^2_B
$$
であるような有意水準 $5\%$ の片側検定を考える.
$\dfrac{T^2_A}{\sigma^2_A}\sim \chi^2(15)$,$\dfrac{T^2_B}{\sigma^2_B}\sim \chi^2(15)$ であるから,帰無仮説 $H_0$ が正しいとき,$F = \dfrac{T^2_A}{T^2_B} = \dfrac{T^2_A/\sigma^2_A}{T^2_B/\sigma^2_B} \sim F(15,15)$ である.
$F(15,15)$ の上側 $5\%$ 点は$2.403$ であり,$F$ 統計量は$F = \dfrac{T^2_A}{T^2_B}= \dfrac{180}{90} = 2.0$ である.
$F = 2.0 < 2.403 = F_{0.95}(15,15)$ となるので,帰無仮説は棄却できない.

統計検定準1級 問題解説 ~2016年6月実施 選択問題及び部分記述問題 問3~

過去問

過去問題は統計検定公式が問題と解答例を公開しています。こちらを参照してください。

解説

[1] 解答

$\boxed{ \ \mathsf{記述5}\ }$ : $5.7$

問い合わせ回数の平均 $\bar{X}$ は,


$$
\bar{X} = \dfrac{6+4+5+3+6+8+10}{7} = 6
$$


よって,$\chi ^2$ 統計量を $\chi ^2$ と書くことにすると
$$
\begin{align*}
\chi ^2 &= \{(6-6)^2+(4-6)^2+(5-6)^2+(3-6)^2 \\
& \qquad \qquad+(6-6)^2+(8-6)^2+(10-6)^2 \} /6 \\
&= \dfrac{34}{6} \approx 5.7
\end{align*}
$$

[2] 解答

$\boxed{ \ \mathsf{記述6}\ }$ : 曜日によって問い合わせの回数が異なるとはいえない
「曜日によって問い合わせの回数が異ならない」という帰無仮説の下で$\chi^2$ 統計量は近似的に自由度 $6$ の$\chi ^2$分布に従う.
$$
5.7 < \chi ^2 _{0.05}(6) = 12.59
$$

であるから,この帰無仮説は棄却されない(曜日によって問い合わせの回数が異なるとはいえない).

【Julia入門】Juliaの関数② Juliaの関数の引数

統計や機械学習に関するプログラミングではPythonRが用いられることが多いですが、近年Juliaも注目を集めています。そこで当シリーズではJuliaの基本構文からライブラリの用い方などについて取りまとめます。当記事ではJuliaの関数の引数について取りまとめを行いました。

Julia入門
https://www.hello-statisticians.com/julia

Julia 1.8 Documentation
https://docs.julialang.org/en/v1/

引数

可変長引数

可変長引数はx...のように...を変数につけることで表します。下記が可変長引数の実行例です。

function f(x...)
    sum = 0
    for i = 1:length(x)
        sum += x[i]
    end
    sum
end

println(f(3))
println(f(3,5))
println(f(3,5,7))

・実行結果

3
8
15

可変長引数は関数の最後の引数のみに設定できることも合わせて抑えておくと良いです。

g1(x, y...) = (x,y)
println(g1(1,2,3))

・実行結果

(1, (2, 3))

たとえば上記のようにg1(x, y...)は実行可能ですが、下記のようなg2(x..., y)を実行するとシンタックスエラーが出力されます。

g2(x..., y) = (x,y)

・実行結果

syntax: invalid "..." on non-final argument around In[2]:1

オプショナル引数

Juliaにおける関数の引数は下記のようにデフォルトの値を設定しておくことで、引数の使用の省略が可能になります。

f(x,y=1) = x+y
println(f(2))
println(f(2,5))

・実行結果

3
7

オプショナル引数の設定にあたっては可変長引数と同様に引数の末尾に置く必要があることに注意が必要です。

f1(x,y=1,z=2) = x+y+z
println(f1(3))

・実行結果

6

上記は実行可能ですが、下記のようにオプショナル引数の後に通常の引数を設定するとシンタックスエラーとなります。

f2(x=3,y,z) = x+y+z

・実行結果

syntax: optional positional arguments must occur at end around In[3]:1

キーワード引数

参考

Julia 1.8 Documentation
https://docs.julialang.org/en/v1/

Ch.26 「テイラーの公式と極値問題」の演習問題の解答例 〜統計学のための数学入門30講〜

当記事は「統計学のための数学入門$30$講(朝倉書店)」の読解サポートにあたってChapter.$26$の「テイラーの公式と極値問題」の章末問題の解答の作成を行いました。
基本的には書籍の購入者向けの解説なので、まだ入手されていない方は購入の上ご確認ください。また、解説はあくまでサイト運営者が独自に作成したものであり、書籍の公式ページではないことにご注意ください。

・書籍解答まとめ
https://www.hello-statisticians.com/answer_textbook_math#math_stat

本章のまとめ

演習問題解答

問題$26.1$

問題$26.2$

$[1]$
$f(x,y)=x^3+xy^2+2x^2+y^2$の偏微分$f_x, f_y$は下記のように計算できる。
$$
\large
\begin{align}
f_x &= 3x^2 + y^2 + 4x \quad (1) \\
f_y &= 2xy + 2y \quad (2)
\end{align}
$$

$(2)$式に基づいて$f_y=2y(x+1)=0$を解くと$x=-1,y=0$が得られる。ここで$x=-1$を$f_x=0$に代入すると下記が得られる。
$$
\large
\begin{align}
f_x = 3 + y^2 – 4 &= 0 \\
y^2 &= 1 \\
y &= \pm 1
\end{align}
$$

また、$y=0$を$f_x=0$に代入すると下記が得られる。
$$
\large
\begin{align}
f_x = 3x^2 + y^2 + 4x &= 0 \\
x(3x+4) &= 0 \\
x &= 0, \, -\frac{4}{3}
\end{align}
$$

$[2]$

【Julia入門】Juliaの関数① Juliaの関数の定義

統計や機械学習に関するプログラミングではPythonRが用いられることが多いですが、近年Juliaも注目を集めています。そこで当シリーズではJuliaの基本構文からライブラリの用い方などについて取りまとめます。当記事ではJuliaの関数の定義について取りまとめを行いました。

Julia入門
https://www.hello-statisticians.com/julia

Julia 1.8 Documentation
https://docs.julialang.org/en/v1/

関数の定義

オーソドックスな関数の定義

Juliaにおけるオーソドックスな関数の定義にあたってはfunctionendを用いることで下記のような処理を実行します。

function add(x,y)
    return x + y
end

println(add(1,2))
println(add(2,3))

・実行結果

3
5

関数の簡易的な定義

前項ではフォーマルな関数の定義の方法について確認を行いましたが、下記のように簡易的に定義を行うことも可能です。

add(x,y) = x + y
println(add(1,2))
println(add(2,3))

・実行結果

3
5

上記のadd(x,y)=x+yは$f(x,y)=x+y$のような数式における関数の定義と対応させながら抑えておくと良いと思います。また、下記のように複数の戻り値を返すように関数の定義を行うことも可能です。

sum_diff(x,y) = (x+y, x-y)
print(sum_diff(2,3))

・実行結果

(5, -1)

関数の定義における型指定

引数の型指定

関数の定義にあたっては下記のように引数の型を指定することができます。

function add_typed(x::Int, y::Int)
    return x + y
end

println(add_typed(1,2))
println(add_typed(2,3))
println(add_typed(2,3.5))

・実行結果

3
5
MethodError: no method matching add_typed(::Int64, ::Float64)

上記では3行目の3.5Int型ではないことでMethodErrorが出力されたことが確認できます。

戻り値の型指定

前項では「引数の型指定」を取り扱いましたが、下記のように戻り値の型指定も行うことができます。

function add_typed(x::Int, y::Int)::Float64
    return x + y
end

println(add_typed(1,2))
println(add_typed(2,3))

・実行結果

3.0
5.0

上記ではadd_typed(x::Int, y::Int)::Float64のように関数を定義することで戻り値がFloat型で得られたことが確認できます。

参考

Julia 1.8 Documentation
https://docs.julialang.org/en/v1/

【Julia入門】Juliaの制御構文② Juliaのループ構文 〜while文・for文〜

統計や機械学習に関するプログラミングではPythonRが用いられることが多いですが、近年Juliaも注目を集めています。そこで当シリーズではJuliaの基本構文からライブラリの用い方などについて取りまとめます。当記事ではJuliaのループ構文の使い方について取りまとめを行いました。

Julia入門
https://www.hello-statisticians.com/julia

Julia 1.8 Documentation
https://docs.julialang.org/en/v1/

while文を用いたループ

while文は下記のように条件式が成立する限りループ処理を行う構文です。

i = 1
while i <= 5
    println(i)
    i += 1
end

・実行結果

1
2
3
4
5

for文を用いたループ

for文は定義した配列に基づくインデックスを用いたループ処理です。下記のような構文を元に処理を実行することができます。

for i = 1:5
    println(i)
end

・実行結果

1
2
3
4
5

参考

Julia 1.8 Documentation
https://docs.julialang.org/en/v1/

逐次2次計画法(SOP法)を用いた制約付き問題の近似解の計算

逐次$2$次計画(SOP; Successive Quadratic Programming)法は制約付き最適化問題の近似解を計算するにあたって用いられる手法です。当記事では逐次$2$次計画法の概要や数式、Pythonを用いた実際の計算例について取り扱いました。
「新版 数理計画入門(朝倉書店)」の$4.9$節の「逐次$2$次計画法」などの内容を参考に作成を行いました。

・用語/公式解説
https://www.hello-statisticians.com/explain-terms

前提の確認

問題設定

当記事では下記のような目的関数$f(\mathbf{x})$の制約付き最適化問題を定義し、以下取り扱う。
$$
\large
\begin{align}
\mathrm{Objective} : \quad & f(\mathbf{x}) \, \rightarrow \, \mathrm{Minimize} \\
\mathrm{Constraint} : \quad & c_i(\mathbf{x}) = 0 \quad (i=1, 2, \cdots ,l)
\end{align}
$$

上記に対し、KKT条件は下記のように表される。
$$
\large
\begin{align}
& \nabla f(\mathbf{x}) + \sum_{i=1}^{n} \lambda_i \nabla c_i(\mathbf{x}) = \mathbf{0} \quad (1) \\
& c_i(\mathbf{x}) = 0 \qquad (i=1, \cdots, l)
\end{align}
$$

また、ラグランジュ関数$L(\mathbf{x},\boldsymbol{\lambda})$を下記のように定義する。
$$
\large
\begin{align}
L(\mathbf{x},\boldsymbol{\lambda}) = f(\mathbf{x}) + \sum_{i=1}^{n} \lambda_i c_i(\mathbf{x})
\end{align}
$$

このときラグランジュ関数$L(\mathbf{x},\boldsymbol{\lambda})$の勾配ベクトル$\nabla L(\mathbf{x},\boldsymbol{\lambda})$は下記のように表すことができる。
$$
\large
\begin{align}
\nabla L(\mathbf{x},\boldsymbol{\lambda}) &= \left(\begin{array}{c} \nabla_{x} L(\mathbf{x},\boldsymbol{\lambda}) \\ \nabla_{\lambda} L(\mathbf{x},\boldsymbol{\lambda}) \end{array} \right) \\
&= \left(\begin{array}{c} \displaystyle \nabla f(\mathbf{x}) + \sum_{i=1}^{n} \lambda_i \nabla c_i(\mathbf{x}) \\ \mathbf{c}(\mathbf{x}) \end{array} \right) \quad (1) \\
\mathbf{c}(\mathbf{x}) &= \left(\begin{array}{c} c_1(\mathbf{x}) \\ \vdots \\ c_l(\mathbf{x}) \end{array} \right)
\end{align}
$$

ここでKKT条件は$(1)$式を元に下記のように表すことができる。
$$
\large
\begin{align}
\nabla L(\mathbf{x},\boldsymbol{\lambda}) = \left(\begin{array}{c} \displaystyle \nabla f(\mathbf{x}) + \sum_{i=1}^{n} \lambda_i \nabla c_i(\mathbf{x}) \\ \mathbf{c}(\mathbf{x}) \end{array} \right) = \left(\begin{array}{c} 0 \\ \vdots \\ 0 \\ 0 \\ \vdots \\ 0 \end{array} \right) = \mathbf{0}
\end{align}
$$

多次元ベクトル値関数に基づく連立方程式とニュートン法

前項ではKKT条件が$\nabla L(\mathbf{x},\boldsymbol{\lambda}) = \mathbf{0}$のように表せることの確認を行なった。このKKT条件を$\mathbf{x},\boldsymbol{\lambda}$について解くにあたっては、$1$次のテイラー展開に基づくニュートン法を活用することで近似解が得られる。

当項では以下、$p$次元ベクトル$\mathbf{z}$を元に定義する$p$次元ベクトル値関数$\mathbf{F}(\mathbf{z})$に関する方程式$\mathbf{F}(\mathbf{z})=\mathbf{0}$について、ニュートン法に基づいて近似解を得る手順について確認を行う。

まず$p$次元ベクトル$\mathbf{z}$、$p$次元ベクトル値関数$\mathbf{F}(\mathbf{z})$を下記のように定義する。
$$
\large
\begin{align}
\mathbf{z} &= \left(\begin{array}{c} z_1 \\ \vdots \\ z_p \end{array} \right) \\
\mathbf{F}(\mathbf{z}) &= \left(\begin{array}{c} F_1(\mathbf{z}) \\ \vdots \\ F_p(\mathbf{z}) \end{array} \right)
\end{align}
$$

上記で定めた$p$次元ベクトル値関数$\mathbf{F}(\mathbf{z})$に対して、勾配ベクトル$\nabla F_i(\mathbf{z})$を第$i$列とする$p \times p$正方行列を$\nabla \mathbf{F}(\mathbf{z})$とおくと、$\nabla \mathbf{F}(\mathbf{z})$は下記のように表せる。
$$
\large
\begin{align}
\nabla \mathbf{F}(\mathbf{z}) &= \left(\begin{array}{ccc} \nabla F_1(\mathbf{z}) & \cdots & \nabla F_p(\mathbf{z}) \end{array} \right) \\
&= \left(\begin{array}{ccc} \displaystyle \frac{\partial F_1(\mathbf{z})}{\partial z_1} & \cdots & \displaystyle \frac{\partial F_p(\mathbf{z})}{\partial z_1} \\ \vdots & \ddots & \vdots \\ \displaystyle \frac{\partial F_1(\mathbf{z})}{\partial z_p} & \cdots & \displaystyle \frac{\partial F_p(\mathbf{z})}{\partial z_p} \end{array} \right)
\end{align}
$$

上記に基づいてニュートン法の漸化式が下記のように得られる。
$$
\large
\begin{align}
\mathbf{F}(\mathbf{z}^{(k)}) + \nabla \mathbf{F}(\mathbf{z}^{(k)})^{\mathrm{T}} (\mathbf{z}^{(k+1)} – \mathbf{z}^{(k)}) &= \mathbf{0} \\
\mathbf{z}^{(k+1)} – \mathbf{z}^{(k)} &= -\left[ \nabla \mathbf{F}(\mathbf{z}^{(k)})^{\mathrm{T}} \right]^{-1} \mathbf{F}(\mathbf{z}^{(k)}) \\
\mathbf{z}^{(k+1)} &= \mathbf{z}^{(k)} – \left[ \nabla \mathbf{F}(\mathbf{z}^{(k)})^{\mathrm{T}} \right]^{-1} \mathbf{F}(\mathbf{z}^{(k)})
\end{align}
$$

逐次2次計画法の数式

「多次元ベクトル値関数に基づく連立方程式とニュートン法」では$\mathbf{F}(\mathbf{z})=\mathbf{0}$を取り扱ったが、逐次$2$次計画法ではKKT条件の式$\nabla L(\mathbf{x},\boldsymbol{\lambda}) = \mathbf{0}$に対してニュートン法を適用する。

KKT条件の式$\nabla L(\mathbf{x},\boldsymbol{\lambda}) = \mathbf{0}$に関するニュートン法の漸化式は下記のように表すことができる。
$$
\large
\begin{align}
\nabla L(\mathbf{x},\boldsymbol{\lambda}) + \nabla^{2} L(\mathbf{x},\boldsymbol{\lambda}) \left(\begin{array}{c} \mathbf{x}^{(k+1)} – \mathbf{x}^{(k)} \\ \boldsymbol{\lambda}^{(k+1)} – \boldsymbol{\lambda}^{(k)} \end{array} \right) &= \mathbf{0} \\
\left(\begin{array}{c} \mathbf{x}^{(k+1)} \\ \boldsymbol{\lambda}^{(k+1)} \end{array} \right) &= \left(\begin{array}{c} \mathbf{x}^{(k)} \\ \boldsymbol{\lambda}^{(k)} \end{array} \right) – \left[ \nabla^{2} L(\mathbf{x},\boldsymbol{\lambda}) \right]^{-1} \nabla L(\mathbf{x},\boldsymbol{\lambda})
\end{align}
$$

ここで上記の$\nabla L(\mathbf{x},\boldsymbol{\lambda}), \nabla^{2} L(\mathbf{x},\boldsymbol{\lambda})$は下記のように表される。
$$
\large
\begin{align}
\nabla L(\mathbf{x},\boldsymbol{\lambda}) &= \left(\begin{array}{c} \displaystyle \nabla f(\mathbf{x}) + \sum_{i=1}^{n} \lambda_i \nabla c_i(\mathbf{x}) \\ \mathbf{c}(\mathbf{x}) \end{array} \right) \\
\nabla^{2} L(\mathbf{x},\boldsymbol{\lambda}) &= \left(\begin{array}{cc} \nabla_{x}^{2} L(\mathbf{x},\boldsymbol{\lambda}) & \nabla \mathbf{c}(\mathbf{x}) \\ \nabla \mathbf{c}(\mathbf{x})^{\mathrm{T}} & \mathbf{0} \end{array} \right) \\
\nabla \mathbf{c}(\mathbf{x}) &= \left(\begin{array}{ccc} \nabla c_1(\mathbf{x}) & \cdots & \nabla c_l(\mathbf{x}) \end{array} \right)
\end{align}
$$

逐次2次計画法の計算例