Octaveで最急降下法
Octaveでちょっとした関数を書くときに、無名関数を使用できることを知ったので、さっそく最急降下法を書いてみました。
今回最小化する関数は
で表される関数です。ただし
とします。このとき、最急降下法は以下のように記述することができます。
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');
結果として、評価関数は
となります。
Matlabと違って、以前はmainとなる関数以外は別名ファイルに保存していました。
無名関数を使って、関数化できるといろいろと使いやすいと実感しました。
また色々な数値計算を実装していきます。