0

-1 と 2 の間の n+1 個の等間隔の補間点 (n=6 と n=10 を取る) を使用して 3 次スプライン補間を計算するコードを作成し、f(x) に対してグラフをプロットし、最大誤差を見つけます。最大エラーが正しいかどうかはわかりませんが、n=6 のコードでエラーは発生しません。n=10 用に変更された同じコードを使用すると、機能しないようです。助けていただければ幸いです。

これが私のコードです:n = 6。

restart;

f := proc (x) options operator, arrow; (1-x^2)*sin(2*Pi*x);

Xlist := [-1, -.5, 0, .5, 1, 1.5, 2];

k := nops(Xlist);

for i to k-1 do 
  S[i] := a[i]+b[i]*(x-Xlist[i])+c[i]*(x-Xlist[i])^2+d[i]*(x-Xlist[i])^3;
  dS[i] := diff(S[i], x);
  ddS[i] := diff(dS[i], x;
end do;

for i from 1 to k-1 do 
EQ[i] := subs(x = Xlist[i], S[i]) = f(Xlist[i]);
 end do;

for i from 1 to k-1 do 
EQ[k-1+i] := subs(x = Xlist[i+1], S[i]) = f(Xlist[i+1]);
end do;

for i from 1 to k-2 do
EQ[2*k-2+i] := subs(x = Xlist[i+1], dS[i]) = subs(x = Xlist[i+1], dS[i+1]);
end do;

for i from 1 to k-2 do
EQ[3*k-4+i] := subs(x = Xlist[i+1], ddS[i]) = subs(x = Xlist[i+1], ddS[i+1]);
end do;

Clamp[1] := subs(x = Xlist[1], dS[1]) = (D(f))(Xlist[1]);

Clamp[2] := subs(x = Xlist[k], dS[k-1]) = (D(f))(Xlist[k]);

ClampedEqs := {Clamp[1], Clamp[2], seq(EQ[i], i = 1 .. 4*k-6)};

ClampedCoeffs := op(1, solve(ClampedEqs, [seq(a[i], i = 1 .. k-1), seq(b[i], i = 1 .. k-1), seq(c[i], i = 1 .. k-1), seq(d[i], i = 1 .. k-1)]));

assign(ClampedCoeffs)
ClampedSpline := proc (x) options operator, arrow; piecewise(x < Xlist[2], S[1], S[2]);

plot([f(x), ClampedSpline(x)], x = -1 .. 2);

print(Max*Error*is = numapprox[infnorm](f(x)-ClampedSpline(x), x = -1 .. 2));                                                                          

最大エラー5.146099863を与える

ただし、n=10 に変更すると、'ClampedEqs@ op の後に、以前にはなかった「エラー、不適切な op または添え字セレクター」エラーが発生します。

4

0 に答える 0