{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Lagrange補間関数\n", "\n", "区間$[a,b]$の上に与えられる関数$f$に対して、節点$x_1\n", "\n", "Gnuplot\n", "Produced by GNUPLOT 5.0 patchlevel 3 \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", "\t\t\n", "\t\t0\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.2\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.4\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.6\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.8\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t1\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.2\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.4\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.6\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.8\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t1\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\tgnuplot_plot_1a\n", "\n", "\t\n", "\t\n", "\tgnuplot_plot_2a\n", "\n", "\t\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x=0:0.01:1;\n", "x1=0; \n", "x2=1;\n", "node_list = [x1,x2];\n", "\n", "function value = phi_1(node_list,x)\n", " x1 = node_list(1);\n", " x2 = node_list(2);\n", " value = (x - x2) ./ (x1-x2);\n", "end\n", "\n", "function value = phi_2(node_list,x)\n", " x1 = node_list(1);\n", " x2 = node_list(2);\n", " value = (x1 - x) ./ (x1-x2);\n", "end\n", "\n", "hold on\n", "plot( x, phi_1(node_list, x), 'r-')\n", "plot( x, phi_2(node_list, x), 'b-')\n", "grid on" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$(x1,y1), (x2,y2)$を通っている1次多項式は$\\phi_1$, $\\phi_2$の線形結合で表すことができます。\n", "\n", "例:$(0,2), (0,-1)$を通っている1次多項式" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "Gnuplot\n", "Produced by GNUPLOT 5.0 patchlevel 3 \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", "\t\t\n", "\t\t-1\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t-0.5\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.5\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t1\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t1.5\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t2\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.2\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.4\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.6\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.8\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t1\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\tgnuplot_plot_1a\n", "\n", "\t\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "p = 2*phi_1(node_list, x) + (-1)*phi_2(node_list,x);\n", "plot(x, p, '-')\n", "grid on" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 演習1\n", "\n", "- 1) 3点式のLagrange基底関数を求めて、グラフを描いてください。\n", "\n", "基底関数の表現式\n", "\n", "$$\n", "\\phi_1(x) = \\frac{(x-x_2)(x-x_3)}{(x_1-x_2)(x_1-x_3)},\\quad\n", "\\phi_2(x) = \\frac{(x-x_1)(x-x_3)}{(x_2-x_1)(x_2-x_3)},\\quad\n", "\\phi_3(x) = \\frac{(x-x_1)(x-x_2)}{(x_3-x_1)(x_3-x_2)}\n", "$$\n", "\n", "- 2) 以下の3点を通っている2次多項式を求めって求めて、グラフを描いてください。\n", "\n", "$$(0, 1), (0.5, -1), (1,5)$$\n", "\n", "- 3) 以下の3点を通っている2次多項式を求めって求めて、グラフを描いてください。\n", "\n", "$$(0, 1), (0.5, 2), (1,2.9)$$" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x=0:0.01:1;\n", "x1=0; \n", "x2=0.5;\n", "x3=1;\n", "node_list = [x1,x2,x3];\n", "\n", "function value = phi_1(node_list,x)\n", " ??\n", "end\n", "\n", "function value = phi_2(node_list,x)\n", " ??\n", "end\n", "\n", "function value = phi_3(node_list,x)\n", " ??\n", "end" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "hold on\n", "plot( x, phi_1(node_list, x), 'r-')\n", "plot( x, phi_2(node_list, x), 'b-')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 一般的な$n$点式Lagrange補間関数\n", "\n", "基底関数$\\phi_i(x)$\n", "\n", "$$\n", "\\phi_i(x)= \\frac{(x-x_1)(x-x_2)\\cdots (x-x_{i-1})(x-x_{i+1})\\cdots (x-x_{n})}{(x_i-x_1)(x_i-x_2)\\cdots (x_i-x_{i-1})(x_i-x_{i+1})\\cdots (x_i-x_{n})} = \\frac{\\prod_{j=1,j\\not=i}(x-x_j) }{\\prod_{j=1,j\\not=i}(x_i-x_j) }\n", "$$\n", "\n", " \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 演習3\n", "\n", "上記の基底関数$\\phi_i$に対応するOctaveの関数$Lagrange(xlist, i,x)$を作ってください。\n", "\n", "要求:Lagrange以下のパラメータに対して、$\\phi_i(x)$の値を返してくれます。\n", "\n", "**入力引数**\n", "\n", " - xlist : 節点のリスト\n", " - i : 基底関数の番号\n", " - x : 変数$x$\n", " \n", "** 返却値**  $\\phi_i(x)$\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "function value = Lagrange(xlist,i,x)\n", " n = length(xlist);\n", " denominator = 1;\n", " numerator = 1;\n", " for k=1:i-1\n", " %??\n", " end\n", " for k=i+1:n\n", " %??\n", " end\n", " value=numerator ./ denominator;\n", "end" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 演習4\n", "\n", "$[0,1]$の6等分割に対して、6次Lagrange補間関数の各基底関数のグラフを描いてください。\n", "\n", "$$\n", "x_1=0, x_2=1/6, \\cdots, x_7=1\n", "$$" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "xlist =\n", "\n", " 0.00000 0.20000 0.40000 0.60000 0.80000 1.00000\n", "\n" ] }, { "data": { "image/svg+xml": [ "\n", "\n", "Gnuplot\n", "Produced by GNUPLOT 5.0 patchlevel 3 \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", "\t\t\n", "\t\t-1\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t-0.5\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.5\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t1\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.2\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.4\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.6\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.8\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t1\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\tgnuplot_plot_1a\n", "\n", "\t\t \n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "n=6;\n", "xlist=0:(1/(n-1)):1\n", "plot(xlist,xlist*0,'ro-')\n", "grid on\n", "\n", "%ここで演習4のコードを書いてください。\n" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "## 演習5\n", "\n", "$[-1,1]$上の関数$f$の$n$次Lagrange補間関数を求めて、グラフを描いてください。ただし、$n=3,4,\\cdots 10$。節点は等分割を使ってください。\n", "\n", "$$\n", "f=\\frac{1}{1+25x^2}\n", "$$\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "Gnuplot\n", "Produced by GNUPLOT 5.0 patchlevel 3 \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", "\t\t\n", "\t\t0\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.2\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.4\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.6\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.8\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t1\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t-1\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t-0.5\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t0.5\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\t\t\n", "\t\t1\n", "\t\n", "\n", "\n", "\n", "\n", "\t\n", "\n", "\n", "\tgnuplot_plot_1a\n", "\n", "\t\n", "\t\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x=-1:0.01:1;\n", "f = 1 ./ (1+25*x.*x);\n", "plot(x,f,'-')\n", "grid on" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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://github.com/calysto/metakernel/blob/master/metakernel/magics/README.md" } ], "mimetype": "text/x-octave", "name": "octave", "version": "4.0.0" } }, "nbformat": 4, "nbformat_minor": 2 }