% ニューラルネットワークによる関数の近似

rng(1, 'twister');  % 乱数の種

x0 = [ -2.0, -1.0,  0.0,  1.0,  2.0 ];
t0 = [  0.5,  0.2,  0.6,  0.9,  0.3 ];

x = [x0, x0, x0];
t = [t0, t0, t0];

net = feedforwardnet(10);   % 隠れ層のニューロンの個数
net = configure(net,x,t);   % ANN を作成
yinit = net(x);             % 学習前の出力
plot(x(1:5),t(1:5),'o', x(1:5),yinit(1:5),'-.x');
ylim([-0.5,1.5]);
saveas(gcf, 'output_init.png', 'png');
fprintf("一時停止: 何かのキーを押してください\n");
pause;

trained_net = train(net,x,t);   % 学習
y = trained_net(x);             % 学習後の出力
plot(x(1:5),t(1:5),'o', x(1:5),y(1:5),'-*');
ylim([-0.5,1.5]);
saveas(gcf, 'output_learned.png', 'png');
fprintf("一時停止: 何かのキーを押してください\n");
pause;

disp(net.trainParam);           % 学習のパラメータ
%plot(x(1:5),t(1:5),'o', x(1:5),yinit(1:5),'-.x', x(1:5),y(1:5),'-*');

xf = [-2.0:0.01:2.0];
yf = trained_net(xf);
plot(x(1:5),t(1:5),'o', xf, yf,'-');
ylim([-0.5,1.5]);
saveas(gcf, 'output_curve.png', 'png');
