数值计算方法第一次作业。
设在区间
- 全区间上的
$n$ 阶 Lagrange 插值多项式; - 分段线性插值式;
- 三次样条插值式(采用第 1 种边界条件);
对
除此以外,本人还采用了
根据
定义 $$ \begin{aligned} frac(n)&=n\cdot(n-1)\cdots 1\ frac2(n)&=(n-0.5)\cdot(n-1.5)\cdots 0.5\ \end{aligned} $$
我们可以在
Newton 插值采用递推的思路简化了计算,因此不需要做额外的优化就可以实现
直接两两取平均即可。总体算法复杂度为
首先计算出
a[0] = 0; b[0] = -4;
a[N] = 1; b[N] = -4 * target[N];
long double coefb = 1.5 / unit;
for (int i = 1; i < N; ++i) {
a[i] = 0.5;
b[i] = (source[i + 1] - source[i - 1]) * coefb;
}再依次求出
A[0] = 0; B[0] = -2;
for (int i = 1; i <= N; ++i) {
long double deno = 2 + (1 - a[i]) * A[i - 1];
A[i] = -a[i] / deno;
B[i] = (b[i] - (1 - a[i]) * B[i - 1]) / deno;
}之后反向求出
得到最终的值。总体算法复杂度为
环境:Windows 10,Sublime Text 3,TDM-GCC 6.8.1 64-bit
可以参考下面的三个文件中的数据:
-
out_20.csv:$n=20$ 时四种方法在每个测试点处的绝对误差; -
out_30.csv:$n=30$ 时四种方法在每个测试点处的绝对误差; -
errors.csv:$n=10, 20, \cdots, 90$ 时四种方法的最大误差比较。
分析:线性插值误差最大,样条插值其次,Newton/Lagrange 插值最小且它们几乎相等(因为它们本来就应该相等)。可见数据量较小时 Newton/Lagrange 插值体现出了非常大的优势。
分析:线性插值略微优化,样条插值显著优化,Newton/Lagrange 插值显著优化。
分析:数据量继续增大时,Newton/Lagrange 插值的误差开始增大,直至线性插值和样条插值;线性插值优化不明显,样条插值的效果得到了不错的提升。