主要内容

このペ,ジの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

3次スプラie浏览器ン内挿

この例では,曲线拟合工具箱™のcsapiコマンドおよびcsapeコマンドを使用して,3次スプラン内挿を作成する方法を示します。

Csapiコマンド

以下のコマンドを入力します。

值= csapi(x,y,xx)

は,節点なしの端点条件を使用して,与えられたデ,タ(x, y)に対する3次スプラン内挿のxxにおける値を返します。この内挿は,ブレ,クシ,ケンスxをもつ区分的3次関数であり,その3次部分が結合して2つの連続状態変数の微係数をもつ関数を形成します。”“節点なしの端点条件とは,最初と最後の内部ブレークで,3階微分でも連続である(丸め誤差を除く)ことを意味します。

2 .。

X = [0 1];Y = [2 0];Xx = linspace(0,6,121);情节(xx csapi (x, y, xx),“k -”, x, y,“罗”)标题(“两点插值”

3のデタ点を指定すると,放物線が得られます。

X = [2 3 5];Y = [1 0 4];情节(xx csapi (x, y, xx),“k -”, x, y,“罗”)标题(“三点插值”

X = [1 1.5 2 4.1 5];Y = [1 -1 1 -1 1];情节(xx csapi (x, y, xx),“k -”, x, y,“罗”)标题(五次样条插值算法

Csapiの出力を確認する方法

これらの内挿は適切であるように見えますが,csapiの処理が説明どおりであるかをどのように確認すれば良いでしょうか。

デ,タ点をプロットしたところ,内挿がこれらの点を正しく通っていたことから,csapiの内挿は既に確認できています。ただし3次スプラインが得られたことを確認するには,想定される種類の3次スプラインのデータから始め,csapiでその3次スプランが“再現”されるかどうか,つまり,データの取得元である3次スプラインに戻るかどうかを確認するのが最善です。

例:切断べき関数

3次スプライン関数を確認する簡単な例としては,打ち切られた3のべき乗,つまり,次の関数があります。

f x x - x + 3.

ここで,西はブレクの1であり,添字の“+”はコマンドsubplusで与えられる"切断関数"を示します。

帮助subplus
正的部分。x,如果x>=0 y = subplus(x):= (x)_{+} =, 0,如果x<=0返回x的正部分。用于计算截断幂。

特定の選択肢西2にいて,打切られた3のべき乗を次にプロットします。2の左側は0であり,2の右側は(x-2)^3のように上昇しています。

情节(xx subplus (xx-2)。^ 3,“y”“线宽”3)轴([0,-10,70])

ここで,この特定の3次スプラインをデータサイト0:6で内挿し,スプラインの上に内挿を黒でプロットします。

X = 0:6;Y = + (x-2) ^3;值= csapi(x,y,xx);持有情节(xx,价值观,“k”, x, y,“罗”)举行标题(插值到(x-2)_+)^3

内挿誤差

2 .の関数を比較する場合,通常はそれらの差異をプロットする方がはるかに多くの情報が得られます。

Plot (xx, values - subplus(xx-2).^3)三次样条插值到(x-2)_+)^3的误差

この差異の大きさを考慮に入れるため,最大デ,タ値も計算します。これにより,この誤差がやむを得ない丸め誤差よりも悪くないことが示されます。

Max_y = max(abs(y))
Max_y = 64

打切られたべき乗を再現できない場合

追加のテストとして,csapiにより生成されたサ▪▪ト0:6の内挿が一致しない場合の打▪▪切られたべき乗を内挿します。たとえば,csapiは”節点なし”条件を使用するため,内挿スプラインの最初の内部ブレークは,実は節点ではありません。そのため、この内挿はこのサ▪▪トで連続状態変数の微係数を3▪▪も▪▪ことになります。つまり,その3階微分がそのサイトの周りでは不連続であるため,そのサイトを中心とする,打ち切られた3のべき乗を再現できないということになります。

值= csapi(x,subplus(x-1).^3,xx);Plot (xx, values - subplus(xx-1).^3)非结插值到((x-1)_+)^3的误差

1は最初の内部節点であるため,この内挿ではアクティブではなくなります。

差の大きさは.18ほどですが,1から遠ざかるに従って減衰しています。これは,“3次スプラン内挿が基本的に局所的”であることを説明しています。

値ではなくpp型の使用

後での評価に適した形式,微分の計算に適した形式またはその他の操作に適した形式で,内挿3次スプラインを保持することができます。これは,次のような形式でcsapiを呼び出すことで行います。

Pp = csapi(x,y)

これは,内挿のpp型を返します。この形式は,新しい点xxで,次のコマンドによって評価できます。

值= fnval(pp,xx)

この内挿は,次のコマンドによって微分できます。

DPP = fnder(pp)

あるいは,次のコマンドで積分できます。

Ipp = fnint(pp)

これらはそれぞれ,微分または積分のpp型を返します。

例:内挿の微分と積分

内挿の微分を示すため,次の打切られたべき乗の微分

f 2 x 3. x - 2 + 2

をプロットします(ここでも黄色)。次に,その上に、元の 3 乗の切断べき関数に対する内挿の微分をプロットします (ここでも黒)。

情节(xx, 3 * subplus (xx-2)。^ 2,“y”“线宽”,3) pp = csapi(x,subplus(x-2).^3);DPP = fnder(pp);持有情节(xx fnval(民进党,xx),“k”)举行标题(插值函数对(x-2)_+)^3的导数

繰り返しになりますが,差異をプロットする方が比較で多くの情報が得られます。また前回同様,これは丸めと同じくらいの大きさです。

Plot (xx, fnval(dpp,xx) - 3*subplus(xx-2).^2)插值函数((x-2)_+)^3的导数误差

打切られたべき乗の2階微分は次のとおりです。

f 2 x 6 x - 2 +

この関数と,元の関数に対する内挿の2階微分との間の差のプロットから,今度はジャンプがありますが,丸め誤差内に収まっていることが示されています。

DDPP = fnder(dpp);Plot (xx, fnval(ddpp,xx) - 6*subplus(xx-2))插值函数((x-2)_+)^3二阶导数的误差

打切られたべき乗の積分は次のとおりです。

F 2 x x - 2 + 4 / 4

この関数と,元の関数に対する内挿の積分との間の差のプロットから,やはり誤差が丸め誤差内に収まっていることが示されています。

Ipp = fnint(pp);Plot (xx, fnval(ipp,xx) - subplus(xx-2).^4/4) title(插值函数对(x-2)_+)^3积分的误差

Csapeコマンド

csapiと同様,csapeコマンドは任意のデタに対する3次スプラン内挿を提供します。ただし,追加でさまざまな端点条件を指定できます。その最も単純なバ,ジョンである

Pp = csape(x,y)

はラグランジュ端点条件を使用します。これは,csapiで用いられる節点なし条件の代替手段によく使用されます。csapeは内挿の値を直接返さず,pp型のみを返します。

例として,次の関数に対する内挿を再度検討します。

f 1 x x - 1 + 3.

これは,csapiでうまく再現されません。csapeから求められる内挿の誤差(赤)と共に,csapiによって返される節点なし内挿の誤差(黒)をプロットします。

Exact = subplus(xx-1).^3;Plot (xx, fnval(csapi(x,subplus(x-1).^3),xx) -准确,“k”)举行Plot (xx, fnval(csape(x,subplus(x-1).^3),xx) -准确,“r”)标题(“非结的错误与拉格朗日结束条件”)({传奇“Not-a-Knot”“拉格朗日”});持有

この場合,2の内挿にあまり差はありません。

その他の端点条件:'自然な'スプラaapl .ン内挿

また,csapeコマンドは,内挿3次スプラaaplンのその他の種類の端点条件をいくaaplか指定する方法も提供します。たとえば,次のコマンド

Pp = csape(x,y,'变分')

は,いわゆる'自然な'端点条件を使用します。2 0。

この手順では,'自然な' 3次スプラescン内挿を次の関数に適用し,

f 2 x x - 2 + 3.

誤差をプロットする方法を示します。次のコードは,変分的字符串引数に対応する別の引数構文を使用して的自然な”スプライン内挿を計算します。文字列の“第二”により,csapeが極値デタサトで2階微分を既定値の0に設定することを指定します。

Pp = csape(x, x-2的次幂)^3,“第二”);Plot (xx, fnval(pp,xx) - subplus(xx-2).^3)“自然样条插值误差((x-2)_+)^3”

右端付近にある大きな誤差に注意してください。これは,'自然な' 端点条件がその位置でゼロの 2 階微分をもつことを暗黙的に示していることに起因します。

その他の端点条件:2階微分の指定

適切な2階微分を明示的に使用すると,誤差を小さくすることもできます。まず,打切られたべき乗の端点における適切な2階微分を計算します。

Endcond = 6*subplus(x([1 end])-2);

次に,端点の2階微分が,計算した2階微分値と一致することを指定して,内挿を作成します。これは,デ,タ値と共に,左の端点条件にendcond (1)を指定し,右にendcond (2)を指定して行います。

Pp = csape(x,[endcond(1) subplus(x-2).]^ 3 endcond (2)),“第二”);Plot (xx, fnval(pp,xx) - subplus(xx-2).^3,“r”)标题(样条插值到(x-1)_+)^3的误差...“当在端点处匹配二阶导数时”])

その他の端点条件:勾配の指定

また,csapeでは端点の"勾配"を指定することもできます。これを"固定"(または"完全") 3次スプラleiン内挿といいます。ステ,トメント

Pp = csape(x,[sl,y,sr],'clamped')

によって,さらに左端のデ,タサ,トに勾配sl,右端のデタサトに勾配をもデタ(xy)への3次スプラン内挿を作成します。

その他の端点条件:端点条件の混在

これまでの条件を混在させることも可能です。たとえば,前述の切断べき関数

f 1 x x - 1 + 3.

では,x=0で勾配が0,x=6で2階微分が30となります(最後のデタサト)。

そのため,左端の勾配と右端の曲率を一致させることで,結果の内挿に誤差がなくなることが予想されます。

Pp = csape(x,[0次+ (x-1))。^3 30], [1 2]);Plot (xx, fnval(pp,xx) - subplus(xx-1).^3) title([样条插值到(x-1)_+)^3的误差...“终端条件混合。”])

その他の端点条件:周期的条件

“周期的な”端点条件を指定することも可能です。たとえば,正弦関数の周期は 2*pi であり、サイト(π/ 2)* (2:2)における値は[0 -1 0 1 0]となります。正弦関数と,これらのサイトにおける周期的3次スプライン内挿との差異は2パーセントに過ぎません。これはまずまずの値です。

X = (pi/2)*(-2:2);Y = [0 -1 0 1 0];Pp = csape(x,y,“周期”);Xx = linspace(-pi,pi,201);Plot (xx, sin(xx) - fnval(pp,xx),“x”)标题(周期三次样条插值到sin(x)的误差

Csapiまたはcsapeで明示的にカバされない端点条件

csapeの既定周辺条件を用いた内挿を作成してから,これにゼロ値および一部の周辺条件への内挿の適切なスカラー倍を加算することで,csapiまたはcsapeで明示的にカバ,されない端点条件を処理できます。2つの '非標準' 周辺条件を満たす必要がある場合は、まず 2 行 2 列の線形システムを解かなければならない可能性があります。

たとえば,次のデ,タに対する3次スプラ,ン内挿年代を計算するとします。

X = 0:.25:3;Q = @(x) x.*(-1+x.* (-1+x.*x/5));Y = q(x);

次の条件を適用します。

lambda(s):= a * (Ds)(e) + b * (D²s)(e) = c

これは点eにおいて年代の1階微分および2階微分に対して行います。

このデタは,次の固有パラメタをも周辺条件を満たす4次多項式から生成されます。

E = x(1);A = 2;B = -3;C = 4;

この固有条件を満たす内挿を作成するには,最初に作成する内挿が既定端点条件

Pp1 = csape(x,y);

およびその最初の多項式区分の1階微分をもようにします。

Dp1 = fnder(fnbrk(pp1,1));

さらに,eにおいて勾配が1となることを指定し,ゼロデタ値に対する3次スプラン内挿を作成します。

Pp0 = csape(x,[1, 0 (size(y)),0], [1,0]);

また,その最初の多項式区分の1階微分も作成します。

Dp0 = fnder(fnbrk(pp0,1));

次に,pp1およびpp0の両方にいてλを計算します。

Lam1 = a*fnval(dp1,e) + b*fnval(fnder(dp1),e);Lam0 = a*fnval(dp0,e) + b*fnval(fnder(dp0),e);

pp1およびpp0の適切な線形結合を作成し,次の3次スプラreeンを求めます。

S:= pp1 + ((c - lambda(pp1))/lambda(pp0)) * pp0

これは目的の条件のほか,右の端点における既定の端点条件も満たしています。この線形結合は,fncmbを使用して形成します。

S = fncmb(pp0,(c-lam1)/lam0,pp1);

内挿誤差のプロットは,e付近では,年代による4次多項式の近似の方が,既定の条件を使用した内挿pp1よりも優れていることを示しています。

Xx = (-.3):.05:.7;Yy = q(xx);Plot (xx, fnval(pp1,xx) - yy,“x”)举行Plot (xx, fnval(s,xx) - yy,“o”)举行传奇({“默认条件”“非标准条件”},“位置”“本身”

次の条件

(s) = (D³s)(3) = 14.6

を内挿の3階微分(4次式はこの条件を満たす)に対して適用する場合,左の端点における1階微分がゼロであり,そのためpp0から確実に独立している状態で,ゼロ値に対する3次スプラreeン内挿を追加作成します。

Pp2 = csape(x,[0, 0 (size(y)),1],[0,1]);

次に,次の線形結合の係数d0およびd2を求め,

S:= pp1 + d0*pp0 + d2*pp2

線形システムを解きます。

s = c

Mu (s) = 14.6

pp0およびpp2はどらも,すべての内挿サトで0になるため,年代は選択したどのd0およびd2にいても任意のデタと一致することに注意してください。

試しに,matlab®エンコ,ド機能でj=0:2の場合のλ(pp_j)およびμ(pp_j)を計算するル,プを記述します。

Dd = 0 (2,3);j=0:2 j= num2str(j);eval ([“民进党”J' =曾经(pp 'J”),“]);eval ([“ddpp”J=曾经(民进党的J”),“]);eval ([“dd(1,1 +”J“* fnval(民进党)=”J”,e) + b * fnval (ddpp 'J“e);”]);eval ([“dd(2, 1 +”J') = fnval(曾经(ddpp 'J”),3),“]);结束

pp0pp1およびpp2λμの値が得られたら,適切な線形結合を定義する係数の値を求めます。

D = dd(:,[1,3])\([c;14.6]-dd(:,2));S = fncmb(fncmb(pp0,d(1),pp2,d(2)),pp1);XXX = 0:.05:3;Yyy = q(xxx);Plot (xxx, yyy - fnval(s,xxx),“x”)标题(' y = x*(-1+x* (-1+x*x/5))的样条插值错误'

再確認のため,この関数に対する完全3次スプライン内挿で得られたものを使用してこの誤差を計算します。

持有Plot (xxx, yyy - fnval(csape(x,[-1,y,-7+(4/5)*27],“夹紧”), xxx),“o”)举行传奇({“非标准条件”“Endslope条件”})

この誤差は,終点付近でのみ(やや)相違があり,pp0およびpp2の両方がそれぞれの終点付近でのみ大きいという事実を示しています。

最終チェックとして,年代が3における必要な3階微分条件を満たしていることを確認します。

fnval(曾经(年代,3),3)
Ans = 14.6000