このペ,ジの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
この例では,曲线拟合工具箱™のcsapi
コマンドおよびcsape
コマンドを使用して,3次スプラン内挿を作成する方法を示します。
以下のコマンドを入力します。
值= 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
の内挿は既に確認できています。ただし3次スプラインが得られたことを確認するには,想定される種類の3次スプラインのデータから始め,csapi
でその3次スプランが“再現”されるかどうか,つまり,データの取得元である3次スプラインに戻るかどうかを確認するのが最善です。
3次スプライン関数を確認する簡単な例としては,打ち切られた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次スプラン内挿が基本的に局所的”であることを説明しています。
後での評価に適した形式,微分の計算に適した形式またはその他の操作に適した形式で,内挿3次スプラインを保持することができます。これは,次のような形式でcsapi
を呼び出すことで行います。
Pp = csapi(x,y)
これは,内挿のpp型を返します。この形式は,新しい点xx
で,次のコマンドによって評価できます。
值= fnval(pp,xx)
この内挿は,次のコマンドによって微分できます。
DPP = fnder(pp)
あるいは,次のコマンドで積分できます。
Ipp = fnint(pp)
これらはそれぞれ,微分または積分のpp型を返します。
内挿の微分を示すため,次の打切られたべき乗の微分
をプロットします(ここでも黄色)。次に,その上に、元の 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階微分は次のとおりです。
この関数と,元の関数に対する内挿の2階微分との間の差のプロットから,今度はジャンプがありますが,丸め誤差内に収まっていることが示されています。
DDPP = fnder(dpp);Plot (xx, fnval(ddpp,xx) - 6*subplus(xx-2))插值函数((x-2)_+)^3二阶导数的误差)
打切られたべき乗の積分は次のとおりです。
この関数と,元の関数に対する内挿の積分との間の差のプロットから,やはり誤差が丸め誤差内に収まっていることが示されています。
Ipp = fnint(pp);Plot (xx, fnval(ipp,xx) - subplus(xx-2).^4/4) title(插值函数对(x-2)_+)^3积分的误差)
csapi
と同様,csape
コマンドは任意のデタに対する3次スプラン内挿を提供します。ただし,追加でさまざまな端点条件を指定できます。その最も単純なバ,ジョンである
Pp = csape(x,y)
はラグランジュ端点条件を使用します。これは,csapi
で用いられる節点なし条件の代替手段によく使用されます。csape
は内挿の値を直接返さず,pp型のみを返します。
例として,次の関数に対する内挿を再度検討します。
これは,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の内挿にあまり差はありません。
また,csape
コマンドは,内挿3次スプラaaplンのその他の種類の端点条件をいくaaplか指定する方法も提供します。たとえば,次のコマンド
Pp = csape(x,y,'变分')
は,いわゆる'自然な'端点条件を使用します。2 0。
この手順では,'自然な' 3次スプラescン内挿を次の関数に適用し,
誤差をプロットする方法を示します。次のコードは,変分的字符串引数に対応する別の引数構文を使用して的自然な”スプライン内挿を計算します。文字列の“第二”により,csape
が極値デタサトで2階微分を既定値の0に設定することを指定します。
Pp = csape(x, x-2的次幂)^3,“第二”);Plot (xx, fnval(pp,xx) - subplus(xx-2).^3)“自然样条插值误差((x-2)_+)^3”)
右端付近にある大きな誤差に注意してください。これは,'自然な' 端点条件がその位置でゼロの 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
,右端のデタサトに勾配老
をもデタ(x
,y
)への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)的误差)
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),“]);结束
pp0
、pp1
および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