2 * Introduction to interpol::
3 * Functions and Variables for interpol::
6 @node Introduction to interpol, Functions and Variables for interpol, interpol, interpol
7 @section Introduction to interpol
10 多項式内挿のためのLagrange、線形、三次スプライン法を定義します。
12 コメント、バグ、提案は@var{'mario AT edu DOT xunta DOT es'}にコンタクトを取ってください。
15 @category{Numerical methods}
16 @category{Share packages}
17 @category{Package interpol}
20 @node Functions and Variables for interpol, , Introduction to interpol, interpol
21 @section Functions and Variables for interpol
24 @deffn {関数} lagrange (@var{points})
25 @deffnx {関数} lagrange (@var{points}, @var{option})
26 Lagrange法で多項式内挿を計算します。
27 引数 @var{points}は以下のいずれかでなければいけません:
31 2列行列, @code{p:matrix([2,4],[5,6],[9,3])},
33 対のリスト, @code{p: [[2,4],[5,6],[9,3]]},
35 数のリスト, @code{p: [4,6,3]},
36 この場合、横座標は自動的に1, 2, 3などに割り当てられます。
40 計算を行う前に、対は最初の座標に関して並び替えられます。
45 別のものを定義するには、 @code{varname='z}のようなものを書いてください。
47 高次多項式を使って計算する時には、浮動小数点評価は不安定なことに注意してください。
52 (%i1) load("interpol")$
53 (%i2) p:[[7,2],[8,2],[1,5],[3,2],[6,7]]$
55 (x - 7) (x - 6) (x - 3) (x - 1)
56 (%o3) -------------------------------
58 (x - 8) (x - 6) (x - 3) (x - 1)
59 - -------------------------------
61 7 (x - 8) (x - 7) (x - 3) (x - 1)
62 + ---------------------------------
64 (x - 8) (x - 7) (x - 6) (x - 1)
65 - -------------------------------
67 (x - 8) (x - 7) (x - 6) (x - 3)
68 + -------------------------------
71 (x - 7) (x - 6) (x - 3) (x - 1)
72 (%o4) f(x) := -------------------------------
74 (x - 8) (x - 6) (x - 3) (x - 1)
75 - -------------------------------
77 7 (x - 8) (x - 7) (x - 3) (x - 1)
78 + ---------------------------------
80 (x - 8) (x - 7) (x - 6) (x - 1)
81 - -------------------------------
83 (x - 8) (x - 7) (x - 6) (x - 3)
84 + -------------------------------
86 (%i5) /* Evaluate the polynomial at some points */
87 expand(map(f,[2.3,5/7,%pi]));
89 919062 73 %pi 701 %pi 8957 %pi
90 (%o5) [- 1.567535, ------, ------- - -------- + ---------
96 (%o6) [- 1.567535, 10.9366573451538, 2.89319655125692]
97 (%i7) load("draw")$ /* load draw package */
98 (%i8) /* Plot the polynomial together with points */
101 key = "Lagrange polynomial",
102 explicit(f(x),x,0,10),
105 key = "Sample points",
107 (%i9) /* Change variable name */
108 lagrange(p, varname=w);
109 (w - 7) (w - 6) (w - 3) (w - 1)
110 (%o9) -------------------------------
112 (w - 8) (w - 6) (w - 3) (w - 1)
113 - -------------------------------
115 7 (w - 8) (w - 7) (w - 3) (w - 1)
116 + ---------------------------------
118 (w - 8) (w - 7) (w - 6) (w - 1)
119 - -------------------------------
121 (w - 8) (w - 7) (w - 6) (w - 3)
122 + -------------------------------
127 @category{Package interpol}
133 @deffn {関数} charfun2 (@var{x}, @var{a}, @var{b})
134 もし数 @var{x}が区間 @math{[a, b)}に属するなら、@code{true}を返し、
135 そうでないなら、 @code{false}を返します。
138 @category{Package interpol}
144 @deffn {関数} linearinterpol (@var{points})
145 @deffnx {関数} linearinterpol (@var{points}, @var{option})
147 引数 @var{points}は以下のいずれかでなければいけません:
151 2列行列, @code{p:matrix([2,4],[5,6],[9,3])},
153 対のリスト, @code{p: [[2,4],[5,6],[9,3]]},
155 数のリスト, @code{p: [4,6,3]},
156 この場合、横座標は自動的に1, 2, 3などに割り当てられます。
160 計算を行う前に、対は最初の座標に関して並び替えられます。
165 別のものを定義するには、 @code{varname='z}のようなものを書いてください。
169 (%i1) load("interpol")$
170 (%i2) p: matrix([7,2],[8,3],[1,5],[3,2],[6,7])$
171 (%i3) linearinterpol(p);
173 (%o3) (-- - ---) charfun2(x, minf, 3)
175 + (x - 5) charfun2(x, 7, inf) + (37 - 5 x) charfun2(x, 6, 7)
177 + (--- - 3) charfun2(x, 3, 6)
182 (%o4) f(x) := (-- - ---) charfun2(x, minf, 3)
184 + (x - 5) charfun2(x, 7, inf) + (37 - 5 x) charfun2(x, 6, 7)
186 + (--- - 3) charfun2(x, 3, 6)
188 (%i5) /* Evaluate the polynomial at some points */
189 map(f,[7.3,25/7,%pi]);
191 (%o5) [2.3, --, ----- - 3]
194 (%o6) [2.3, 2.952380952380953, 2.235987755982989]
195 (%i7) load("draw")$ /* load draw package */
196 (%i8) /* Plot the polynomial together with points */
199 key = "Linear interpolator",
200 explicit(f(x),x,-5,20),
203 key = "Sample points",
205 (%i9) /* Change variable name */
206 linearinterpol(p, varname='s);
208 (%o9) (-- - ---) charfun2(s, minf, 3)
210 + (s - 5) charfun2(s, 7, inf) + (37 - 5 s) charfun2(s, 6, 7)
212 + (--- - 3) charfun2(s, 3, 6)
217 @category{Package interpol}
224 @deffn {関数} cspline (@var{points})
225 @deffnx {関数} cspline (@var{points}, @var{option1}, @var{option2}, ...)
226 三次スプライン法で多項式内挿を計算します。
227 引数 @var{points}は以下のいずれかでなければいけません:
231 2列行列, @code{p:matrix([2,4],[5,6],[9,3])},
233 対のリスト, @code{p: [[2,4],[5,6],[9,3]]},
235 数のリスト, @code{p: [4,6,3]},
236 この場合、横座標は自動的に1, 2, 3などに割り当てられます。
240 計算を行う前に、対は最初の座標に関して並び替えられます。
242 特定の必要性に合わせるため3つのオプションがあります:
245 @code{'d1}, デフォルトは @code{'unknown}, は
247 もし @code{'unknown}なら、
248 @math{x_1}での二階導関数は0に等しいとされます(自然な三次スプライン);
249 もし数字だったら、二階導関数はこの数字に基づいて計算されます。
252 @code{'dn}, デフォルトは @code{'unknown}, は
254 もし @code{'unknown}なら、
255 @math{x_n}での二階導関数は0に等しいとされます(自然な三次スプライン);
256 もし数字だったら、二階導関数はこの数字に基づいて計算されます。
259 @code{'varname}, デフォルトは @code{'x}, は
265 (%i1) load("interpol")$
266 (%i2) p:[[7,2],[8,2],[1,5],[3,2],[6,7]]$
267 (%i3) /* Unknown first derivatives at the extremes
268 is equivalent to natural cubic splines */
271 1159 x 1159 x 6091 x 8283
272 (%o3) (------- - ------- - ------ + ----) charfun2(x, minf, 3)
275 2587 x 5174 x 494117 x 108928
276 + (- ------- + ------- - -------- + ------) charfun2(x, 7, inf)
279 4715 x 15209 x 579277 x 199575
280 + (------- - -------- + -------- - ------) charfun2(x, 6, 7)
283 3287 x 2223 x 48275 x 9609
284 + (- ------- + ------- - ------- + ----) charfun2(x, 3, 6)
288 (%i5) /* Some evaluations */
289 map(f,[2.3,5/7,%pi]), numer;
290 (%o5) [1.991460766423356, 5.823200187269903, 2.227405312429507]
291 (%i6) load("draw")$ /* load draw package */
292 (%i7) /* Plotting interpolating function */
295 key = "Cubic splines",
296 explicit(f(x),x,0,10),
299 key = "Sample points",
301 (%i8) /* New call, but giving values at the derivatives */
302 cspline(p,d1=0,dn=0);
304 1949 x 11437 x 17027 x 1247
305 (%o8) (------- - -------- + ------- + ----) charfun2(x, minf, 3)
308 1547 x 35581 x 68068 x 173546
309 + (- ------- + -------- - ------- + ------) charfun2(x, 7, inf)
312 607 x 35147 x 55706 x 38420
313 + (------ - -------- + ------- - -----) charfun2(x, 6, 7)
316 3895 x 1807 x 5146 x 2148
317 + (- ------- + ------- - ------ + ----) charfun2(x, 3, 6)
319 (%i8) /* Defining new interpolating function */
321 (%i9) /* Plotting both functions together */
324 key = "Cubic splines (default)",
325 explicit(f(x),x,0,10),
327 key = "Cubic splines (d1=0,dn=0)",
328 explicit(g(x),x,0,10),
331 key = "Sample points",
336 @category{Package interpol}
341 @deffn {関数} ratinterpol (@var{points}, @var{numdeg})
342 @deffnx {関数} ratinterpol (@var{points}, @var{numdeg}, @var{option1}, @var{option2}, ...)
343 @var{points}で与えられたデータと@var{numdeg}に等しい分子の次数の関して、
346 引数 @var{points}は以下のいずれかでなければいけません:
350 2列行列, @code{p:matrix([2,4],[5,6],[9,3])},
352 対のリスト, @code{p: [[2,4],[5,6],[9,3]]},
354 数のリスト, @code{p: [4,6,3]},
355 この場合、横座標は自動的に1, 2, 3などに割り当てられます。
359 計算を行う前に、対は最初の座標に関して並び替えられます。
361 特定の必要性に合わせるため2つのオプションがあります:
364 @code{'denterm}, デフォルトは @code{1}, は
368 @code{'varname}, デフォルトは @code{'x}, は
375 (%i1) load("interpol")$
377 (%i3) p:[[7.2,2.5],[8.5,2.1],[1.6,5.1],[3.4,2.4],[6.7,7.9]]$
378 (%i4) for k:0 thru length(p)-1 do
380 explicit(ratinterpol(p,k),x,0,9),
383 title = concat("Degree of numerator = ",k),
388 @category{Package interpol}