您没有显示使用x、u 或xx 的示例数据。所以我会补上一些。
以下生成P3,它可以按元素应用于向量xx。它在xx 的每个点处插值N-1 次多项式。
restart;
Digits:=15:
N:=20:
(a,b):=0,2*Pi:
x:=Vector([seq(evalf(a)..evalf(b), evalf((b-a)/(N-1)))],
datatype=float[8]):
u:=map(sin, x):
xx:=Vector([seq(evalf(a)..evalf(b), 0.5)],
datatype=float[8]):
P3:=Interpolation:-SplineInterpolation(x,u,degree=N-1,
endpoints=notaknot):
P3~(xx);
调用P3~(xx) 逐个元素地执行。但是那个Interpolate命令返回的插值函数也知道如何对整个Vectorxx进行自动(逐元素)动作,所以下面应该更高效,
P3(xx);
该示例是一维数据。还有其他方法可以获得类似的结果,显式生成多项式插值。但在评估 xx 数据时,它们的效率较低。
restart;
Digits:=15:
N:=20: (a,b):=0,2*Pi:
x:=Vector([seq(evalf(a)..evalf(b), evalf((b-a)/(N-1)))],
datatype=float[8]):
u:=map(sin, x):
xx:=Vector([seq(evalf(a)..evalf(b), 0.5)],
datatype=float[8]):
P1:=unapply(CurveFitting:-PolynomialInterpolation(x,u,'t'),'t'):
P2:=unapply(CurveFitting:-Spline(x,u,'t',degree=N-1,endpoints=notaknot),'t'):
P3:=Interpolation:-SplineInterpolation(x,u,degree=N-1,endpoints=notaknot):
sin~(xx);
P1~(xx);
P2~(xx);
P3~(xx);
plots:-display(
plot(sin, a..b, color=gray),
plots:-pointplot(<xx|P1~(xx)>, color=blue, symbol=circle, symbolsize=25),
plots:-pointplot(<xx|P2~(xx)>, color=red, symbol=circle, symbolsize=16),
plots:-pointplot(<xx|P3~(xx)>, color=black, symbol=solidcircle, symbolsize=5)
);
如果您有更大维度(例如二维)的数据x、u 和xx,请提供更详细的明确示例。
[编辑] 这里的数据可能更符合您在 cmets 中提供的示例(稍后)。四种方法的结果(产生 16 次多项式)相互吻合得很好。他们似乎也与 Matlab 计算的uu 非常吻合。
对您来说重要的是插值多项式在评估所需范围(即xx)时提供的准确性。 不对您而言重要的是一种方法的特定系数是否与另一种方法的系数密切匹配。
使用插值的方法:-SplineInterpolation 是这四种方法中效率最高的。
restart;
Digits := 15:
x := <1.0000e+00,9.8079e-01,9.2388e-01,8.3147e-01,7.0711e-01,5.5557e-01,
3.8268e-01,1.9509e-01,6.1232e-17,-1.9509e-01,-3.8268e-01,-5.5557e-01,
-7.0711e-01,-8.3147e-01,-9.2388e-01,-9.8079e-01,-1.0000e+00>:
u := <0,-0.2197,-0.7659,-1.3860,-1.8554,-2.0776,-2.0706,-1.9031,
-1.6443,-1.3454,-1.0405,-0.7524,-0.4970,-0.2863,-0.1294,-0.0327,0>:
xx := <seq(-1..1,0.01)>:
exact := map(t->evalhf((exp(4*t)-sinh(4)*t-cosh(4))/16), xx):
P3:=Interpolation:-SplineInterpolation(x,u,degree=16,endpoints=notaknot):
uu3 := P3(xx):
plots:-display(
plot([ <xx|(uu3)> ], style=point, color=black),
plot(t->(exp(4*t)-sinh(4)*t-cosh(4))/16, -1..1, color=red)
);
plot([ <xx|(uu3-exact)> ]):
P4 := unapply(Statistics:-PolynomialFit(16, x, u, 't'), 't'):
uu4 := map[evalhf](P4,xx):
plot([ <xx|(uu4-exact)> ]);
plots:-display(
plot([ <xx|(uu4)> ], style=point, color=black),
plot(t->(exp(4*t)-sinh(4)*t-cosh(4))/16, -1..1, color=red)
);
P1:=unapply(CurveFitting:-PolynomialInterpolation(x,u,'t'),'t'):
uu1 := map[evalhf](P1,xx):
plot([ <xx|(uu1-exact)> ]);
plots:-display(
plot([ <xx|(uu1)> ], style=point, color=black),
plot(t->(exp(4*t)-sinh(4)*t-cosh(4))/16, -1..1, color=red)
);
P2:=unapply(CurveFitting:-Spline(x,u,'t',degree=16,endpoints=notaknot),'t'):
uu2 := map[evalhf](P2,xx):
plot([ <xx|(uu2-exact)> ]);
plots:-display(
plot([ <xx|(uu2)> ], style=point, color=black),
plot(t->(exp(4*t)-sinh(4)*t-cosh(4))/16, -1..1, color=red)
);