Lagrange補間関数

区間$[a,b]$の上に与えられる関数$f$に対して、節点$x_1

1次補間関数

$x_1=0,x_2=1$を考える。この時、以下の条件を満たす基底関数$\phi_1, \phi_2$を求めます。

$$ \phi_i(x_j) = \delta_{ij} = \left\{ \begin{array}{c} 0\quad \mbox{ if } i\not= j \\ 1\quad\mbox{ if } i=j \end{array} \right. $$

$\phi_i$の表現式:

$$ \phi_1(x) = \frac{x-x_2}{x_1 - x_2},\quad \phi_2(x) = \frac{x_1-x}{x_1 - x_2} $$

以下の図には、$\phi_i$のグラフを描画します。

In [7]:
x=0:0.01:1;
x1=0; 
x2=1;
node_list = [x1,x2];

function value = phi_1(node_list,x)
  x1 = node_list(1);
  x2 = node_list(2);
  value = (x - x2) ./ (x1-x2);
end

function value = phi_2(node_list,x)
  x1 = node_list(1);
  x2 = node_list(2);
  value = (x1 - x) ./ (x1-x2);
end

hold on
plot( x, phi_1(node_list, x), 'r-')
plot( x, phi_2(node_list, x), 'b-')
grid on
Gnuplot Produced by GNUPLOT 5.0 patchlevel 3 0 0.2 0.4 0.6 0.8 1 0 0.2 0.4 0.6 0.8 1 gnuplot_plot_1a gnuplot_plot_2a

$(x1,y1), (x2,y2)$を通っている1次多項式は$\phi_1$, $\phi_2$の線形結合で表すことができます。

例:$(0,2), (0,-1)$を通っている1次多項式

In [8]:
p = 2*phi_1(node_list, x) + (-1)*phi_2(node_list,x);
plot(x, p, '-')
grid on
Gnuplot Produced by GNUPLOT 5.0 patchlevel 3 -1 -0.5 0 0.5 1 1.5 2 0 0.2 0.4 0.6 0.8 1 gnuplot_plot_1a

演習1

  • 1) 3点式のLagrange基底関数を求めて、グラフを描いてください。

基底関数の表現式

$$ \phi_1(x) = \frac{(x-x_2)(x-x_3)}{(x_1-x_2)(x_1-x_3)},\quad \phi_2(x) = \frac{(x-x_1)(x-x_3)}{(x_2-x_1)(x_2-x_3)},\quad \phi_3(x) = \frac{(x-x_1)(x-x_2)}{(x_3-x_1)(x_3-x_2)} $$
  • 2) 以下の3点を通っている2次多項式を求めって求めて、グラフを描いてください。
$$(0, 1), (0.5, -1), (1,5)$$
  • 3) 以下の3点を通っている2次多項式を求めって求めて、グラフを描いてください。
$$(0, 1), (0.5, 2), (1,2.9)$$
In [ ]:
x=0:0.01:1;
x1=0; 
x2=0.5;
x3=1;
node_list = [x1,x2,x3];

function value = phi_1(node_list,x)
 ??
end

function value = phi_2(node_list,x)
 ??
end

function value = phi_3(node_list,x)
 ??
end
In [ ]:
hold on
plot( x, phi_1(node_list, x), 'r-')
plot( x, phi_2(node_list, x), 'b-')

一般的な$n$点式Lagrange補間関数

基底関数$\phi_i(x)$

$$ \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) } $$

演習3

上記の基底関数$\phi_i$に対応するOctaveの関数$Lagrange(xlist, i,x)$を作ってください。

要求:Lagrange以下のパラメータに対して、$\phi_i(x)$の値を返してくれます。

入力引数

  • xlist : 節点のリスト
  • i : 基底関数の番号
  • x : 変数$x$

返却値  $\phi_i(x)$

In [19]:
function value = Lagrange(xlist,i,x)
    n = length(xlist);
    denominator = 1;
    numerator = 1;
    for k=1:i-1
      %??
    end
    for k=i+1:n
      %??
    end
    value=numerator ./ denominator;
end

演習4

$[0,1]$の6等分割に対して、6次Lagrange補間関数の各基底関数のグラフを描いてください。

$$ x_1=0, x_2=1/6, \cdots, x_7=1 $$
In [3]:
n=6;
xlist=0:(1/(n-1)):1
plot(xlist,xlist*0,'ro-')
grid on

%ここで演習4のコードを書いてください。
xlist =

    0.00000    0.20000    0.40000    0.60000    0.80000    1.00000

Gnuplot Produced by GNUPLOT 5.0 patchlevel 3 -1 -0.5 0 0.5 1 0 0.2 0.4 0.6 0.8 1 gnuplot_plot_1a

演習5

$[-1,1]$上の関数$f$の$n$次Lagrange補間関数を求めて、グラフを描いてください。ただし、$n=3,4,\cdots 10$。節点は等分割を使ってください。

$$ f=\frac{1}{1+25x^2} $$
In [5]:
x=-1:0.01:1;
f =  1 ./ (1+25*x.*x);
plot(x,f,'-')
grid on
Gnuplot Produced by GNUPLOT 5.0 patchlevel 3 0 0.2 0.4 0.6 0.8 1 -1 -0.5 0 0.5 1 gnuplot_plot_1a
In [ ]: