本文代码主要参考于百度知道:金色潜鸟 - 百度知道的回答。
他的程序代码有一个很小但较为严重的bug,所以在这对代码修正。
完整代码在文末,欢迎交流讨论。
说明:
文中以及代码中,
x、y分别代表插值前的横纵坐标;
u、s分别代表插值后的横纵坐标。
我在测试中,发现他的程序中有bug,即seval()函数中,给 j 赋的初值是插值后横坐标序列(u)的长度,会导致 u 长度超过一定值后,s数组的值会产生错误。(我测试u长度为21时会出错)
正确的方法:应该是给 j 赋值插值前横坐标序列(x)长度
故应seval()函数中,添加插值前横坐标序列(x)长度,即:
double seval(int n, double u,
double x[], double y[],
double b[], double c[], double d[],
int *last);
改为
double seval(int ni, double u,
int n, double x[], double y[],
double b[], double c[], double d[],
i