読者です 読者をやめる 読者になる 読者になる

Octaveで最急降下法

Octaveでちょっとした関数を書くときに、無名関数を使用できることを知ったので、さっそく最急降下法を書いてみました。

今回最小化する関数は

{ \displaystyle
\min \quad  |x-r|^2
}

で表される関数です。ただし

{ \displaystyle
x,r \in \mathbb{R}^2, r = (2,3)^\mathbb{T}
}

とします。このとき、最急降下法は以下のように記述することができます。

clear all;
close all;
clc;

% parameter
X_INIT = [1;2];
STEP = 0.1;
ITER = 1000;
R = [2;3];

% function
x_update = @(x,grad) x - STEP*grad;
gradient = @(x) 2*(x-R);
obj_func = @(x) sum((x-R).^2);

% for save
F = zeros(ITER,1);
X = zeros(ITER,2);

x = X_INIT;

% update
for i=1:ITER;
    f = obj_func(x);
    x = x_update(x,gradient(x));
    X(i,:) = x;
    F(i,:) = f;
end

% draw
figure;
semilogx(F,'r');
grid on;
legend('f(x)');
ylabel('object_function');
xlabel('step');
title('subgradient method');

結果として、評価関数は

f:id:control2key:20170201003747p:plain

となります。

Matlabと違って、以前はmainとなる関数以外は別名ファイルに保存していました。

無名関数を使って、関数化できるといろいろと使いやすいと実感しました。

また色々な数値計算を実装していきます。