{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "### 2022年度プログラミング演習A・B\n", "\n", "# 第15回レポート課題の解説" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 演習1\n", "\n", "次の $11$ 個の点に対して、正規方程式を解いて最小二乗法による線形回帰を行い、それらの点および求めた回帰直線(範囲は $0\\leq x\\leq 1$)を描画してください。\n", "\n", "$$\n", "(0,1.09),\\quad (0.1,1.17),\\quad (0.2,1.42),\\quad (0.3,1.54),\n", "$$\n", "\n", "$$\n", "(0.4,1.71),\\quad (0.5,1.99),\\quad (0.6,2.26),\\quad (0.7,2.44),\n", "$$\n", "\n", "$$\n", "(0.8,2.55),\\quad (0.9,2.84),\\quad (1,3.04)\n", "$$" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "Gnuplot\n", "Produced by GNUPLOT 5.2 patchlevel 8 \n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t \n", "\t \n", "\t\n", "\t\n", "\t \n", "\t \n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\t\t\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t0.5\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t1\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t1.5\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t2\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t2.5\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t3\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t3.5\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t0\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t0.2\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t0.4\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t0.6\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t0.8\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t1\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\tgnuplot_plot_1a\n", "\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "\t\n", "\tgnuplot_plot_2a\n", "\n", "\t\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%plot --format svg\n", "\n", "data = [0,1.09; 0.1,1.17; 0.2,1.42; 0.3,1.54; 0.4,1.71; 0.5,1.99; 0.6,2.26; 0.7,2.44; 0.8,2.55; 0.9,2.84; 1,3.04]; %点を並べた行列\n", "n = size(data,1); %点の個数\n", "\n", "plot(data(:,1),data(:,2),\".\") %点の描画\n", "grid on\n", "hold on\n", "\n", "A = [ones(n,1),data(:,1)];\n", "b = data(:,2);\n", "c = (A'*A)\\(A'*b); %正規方程式を解く\n", "%実は「c = A\\b」でもよい(https://jp.mathworks.com/help/matlab/math/systems-of-linear-equations.htmlを参照)\n", "\n", "x = 0:0.01:1;\n", "y = c(1)+c(2)*x;\n", "plot(x,y) %回帰直線の描画" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 演習2\n", "\n", "演習1と同じ $11$ 個の点に対して、統計量を用いた計算で最小二乗法による線形回帰を行い、それらの点および求めた回帰直線(範囲は $0\\leq x\\leq 1$)を描画してください。\n", "\n", "ただし、統計量の計算には平均は`mean(ベクトル)`、分散は`var(ベクトル)`、共分散は`cov(ベクトル1,ベクトル2)`を使用してよいです。" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "Gnuplot\n", "Produced by GNUPLOT 5.2 patchlevel 8 \n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t \n", "\t \n", "\t\n", "\t\n", "\t \n", "\t \n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\t\t\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t0.5\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t1\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t1.5\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t2\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t2.5\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t3\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t3.5\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t0\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t0.2\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t0.4\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t0.6\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t0.8\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t1\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\tgnuplot_plot_1a\n", "\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "\t\n", "\tgnuplot_plot_2a\n", "\n", "\t\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%plot --format svg\n", "\n", "data = [0,1.09; 0.1,1.17; 0.2,1.42; 0.3,1.54; 0.4,1.71; 0.5,1.99; 0.6,2.26; 0.7,2.44; 0.8,2.55; 0.9,2.84; 1,3.04]; %点を並べた行列\n", "\n", "plot(data(:,1),data(:,2),\".\") %点の描画\n", "grid on\n", "hold on\n", "\n", "c2 = cov(data(:,1),data(:,2))/var(data(:,1)); %統計量を用いた計算\n", "c1 = mean(data(:,2))-c2*mean(data(:,1));\n", "\n", "x = 0:0.01:1;\n", "y = c1+c2*x;\n", "plot(x,y) %回帰直線の描画" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 演習3(オプション)\n", "\n", "節点\n", "\n", "$$\n", "x_i=-1+\\frac{2(i-1)}{n-1}\\quad (i=1,\\ldots,n)\n", "$$\n", "\n", "を用いて関数\n", "\n", "$$\n", "f(x)=\\frac{1}{1+25x^2}\n", "$$\n", "\n", "を $m-1$ 次以下の多項式\n", "\n", "$$\n", "g(x)=\\sum_{j=1}^m c_j x^{j-1}\n", "$$\n", "\n", "で近似することを考えます。\n", "\n", "$n=30,60$、$m=10,20$ を組み合わせた計 $4$ 個の場合について近似多項式を求め、元の関数 $f(x)$ とともに $-1\\leq x\\leq 1$ の範囲でグラフを描画してください。" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "Gnuplot\n", "Produced by GNUPLOT 5.2 patchlevel 8 \n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t \n", "\t \n", "\t\n", "\t\n", "\t \n", "\t \n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\t\t\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t-0.2\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t0\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t0.2\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t0.4\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t0.6\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t0.8\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t1\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t-1\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t-0.5\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t0\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t0.5\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\t\t\n", "\t\t1\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\tf(x)\n", "\n", "\n", "\n", "\t\n", "\t\tf(x)\n", "\t\n", "\n", "\n", "\t\t\n", "\n", "\n", "\t\n", "\tn=30, m=10\n", "\n", "\t\n", "\t\tn=30, m=10\n", "\t\n", "\n", "\n", "\t\t\n", "\n", "\n", "\t\n", "\tn=30, m=20\n", "\n", "\t\n", "\t\tn=30, m=20\n", "\t\n", "\n", "\n", "\t\t\n", "\n", "\n", "\t\n", "\tn=60, m=10\n", "\n", "\t\n", "\t\tn=60, m=10\n", "\t\n", "\n", "\n", "\t\t\n", "\n", "\n", "\t\n", "\tn=60, m=20\n", "\n", "\t\n", "\t\tn=60, m=20\n", "\t\n", "\n", "\n", "\t\t\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%plot --format svg\n", "\n", "function value = f(x) %関数f(x)\n", " value = 1./(1+25*x.^2);\n", "end\n", "\n", "x = -1:0.01:1; %x座標の配列\n", "y = f(x);\n", "plot(x,y,\"DisplayName\",\"f(x)\") %f(x)のグラフを描画\n", "grid on\n", "hold on\n", "\n", "%2つのfor文でnとmの値を変化させる\n", "for n = [30,60]\n", " node = (-1:2/(n-1):1)'; %節点の配列(縦ベクトル)\n", " for m = [10,20]\n", " A = zeros(n,m);\n", " for j = 1:m\n", " A(:,j) = node.^(j-1); %行列Aの各列を計算\n", " end\n", " b = f(node); %縦ベクトルbを定める\n", " c = (A'*A)\\(A'*b); %正規方程式を解いて係数ベクトルcを求める\n", " y = 0;\n", " for j = 1:m\n", " y = y+c(j)*x.^(j-1); %近似多項式を計算\n", " end\n", " plot(x,y,\"DisplayName\",[\"n=\",num2str(n),\", m=\",num2str(m)]) %近似多項式のグラフを描画\n", " end\n", "end\n", "\n", "legend" ] } ], "metadata": { "kernelspec": { "display_name": "Octave", "language": "octave", "name": "octave" }, "language_info": { "file_extension": ".m", "help_links": [ { "text": "GNU Octave", "url": "https://www.gnu.org/software/octave/support.html" }, { "text": "Octave Kernel", "url": "https://github.com/Calysto/octave_kernel" }, { "text": "MetaKernel Magics", "url": "https://metakernel.readthedocs.io/en/latest/source/README.html" } ], "mimetype": "text/x-octave", "name": "octave", "version": "5.2.0" } }, "nbformat": 4, "nbformat_minor": 4 }