5.8 KiB
5.8 KiB
数学函数 / 数值计算 / 插值
chckxy(x, y)
声明:function
合并x,y后对x列正序排列
| 参数 | 类型 | 说明 |
|---|---|---|
x |
array | 一维数组 |
y |
array | 一维数组 |
返回:array
示例
uses interp_unit;
x := array(5, 1, 19, 8);
y := array(2, 3, 1, 7);
chckxy(x, y);
return x | y;
// 输出:array((1,3),(5,2),(8,7),(19,1))
histc2(a, b)
声明:function
记录a中的元素在b中第几个区间的位置
| 参数 | 类型 | 说明 |
|---|---|---|
a |
array | 一维数组 |
b |
array | 一维数组 |
返回:array
示例
uses interp_unit;
a := 1->10;
b := 3->7;
return histc2(a, b);
// 输出:array(0,0,1,1,2,3,4,0,0,0)
nearest(x, y, xi)
声明:function
最邻近插值
| 参数 | 类型 | 说明 |
|---|---|---|
x |
array | 一维数组 横坐标序列 |
y |
array | 一维数组 纵坐标序列 |
xi |
array | 一维数组 插值点序列 |
返回:array
示例
uses interp_unit;
x := array(5, 1, 19, 8);
y := array(2, 3, 1, 7);
xi := array(4, 12);
return nearest(x, y, xi);
// 输出:array(3,1)
pchip(x, y, xx)
声明:function
分段三次hermite插值
| 参数 | 类型 | 说明 |
|---|---|---|
x |
array | 一维数组 横坐标序列 |
y |
array | 一维数组 纵坐标序列 |
xx |
array | 一维数组 插值点序列 |
返回:array
示例
uses interp_unit;
x := array(5, 1, 19, 8);
y := array(2, 3, 1, 7);
xx := array(4, 12);
return pchip(x, y, xx);
// 输出:array(3.34030621353744,6.93450987255447)
ppval(pp, xx)
声明:function
对插值点列的值数据区间中计算出插值
| 参数 | 类型 | 说明 |
|---|---|---|
pp |
array | 二维数组,包含列 "x"、"coefs" |
xx |
array | 一维数组 插值点序列 |
返回:array
示例
uses interp_unit;
x := array(1, 5, 8, 19);
y := array(3, 2, 7, 1);
s := array(0, 0, 0, 0);
dx := array(4, 3, 11);
divdif := array(-0.25, 1.66666666666667, -0.545454545454545);
pp := pwch(x, y, s, dx, divdif);
xx := array(4, 12);
return ppval(pp, xx);
// 输出:array(2.15625,5.19684447783622)
pwch(x, y, s, dx, divdif)
声明:function
计算下x,y所对应的不同间隔区间
| 参数 | 类型 | 说明 |
|---|---|---|
x |
array | 一维数组 |
y |
array | 一维数组 |
s |
array | 一维数组 |
dx |
array | 一维数组 |
divdif |
array | 一维数组 |
返回:array
示例
uses interp_unit;
x := array(1, 5, 8, 19);
y := array(3, 2, 7, 1);
s := array(0, 0, 0, 0);
dx := array(4, 3, 11);
divdif := array(-0.25, 1.66666666666667, -0.545454545454545);
return pwch(x, y, s, dx, divdif);
// 输出:array("x":(1,5,8,19),"coefs":
// ((0.03125,-0.1875,0,3),
// (-0.370370370370371,1.66666666666667,0,2),
// (0.00901577761081892,-0.148760330578512,0,7)))
interp(x, y, xi, method)
声明:function
分段插值函数,根据给定的数据 x,y 对数据xv进行分段插值,可选择方法
| 参数 | 类型 | 说明 |
|---|---|---|
x |
array of real | 实型一维数组,长度为N。存放给定N个点的值Xi,要求X0<X1...<Xn-1 |
y |
array of real | 实型一维数组,长度为N。存放N个给定点上的函数值Yi |
xi |
array of real | 实数或者一维实数数组,存放指定插值点的值 |
method |
string | 方法选择,具体取值如下: |
返回:array
示例
范例01:使用三次样条插值生成一组插值点
x := array(0, 0.01)->1;
y := x^2-x;
xi := array(0.005, 0.01)->1;
yi := interp(x, y, xi, 'spline');
return yi;
范例02:最近邻插值
x_ := array(5, 1, 19, 8);
y_ := array(2, 3, 1, 7);
xi := array(4, 12);
return interp(x_, y_, xi, "nearest");
// 输出:array(2,7)
范例03:分段线性插值
x_ := array(5, 1, 19, 8);
y_ := array(2, 3, 1, 7);
xi := array(4, 12);
return interp(x_, y_, xi, "linear");
// 输出:array(2.25,4.8182)
范例04:三次样条插值
x_ := array(5, 1, 19, 8);
y_ := array(2, 3, 1, 7);
xi := array(4, 12);
return interp(x_, y_, xi, "spline");
// 输出:array(1.1407,13.9444)
范例05:分段三次 Hermite 插值
x_ := array(5, 1, 19, 8);
y_ := array(2, 3, 1, 7);
xi := array(4, 12);
return interp(x_, y_, xi, "pchip");
// 输出:array(2.0156,6.7115)
linear(x, y, xi)
声明:function
线性插值
| 参数 | 类型 | 说明 |
|---|---|---|
x |
array | 一维数组 横坐标序列 |
y |
array | 一维数组 纵坐标序列 |
xi |
array | 一维数组 插值点序列 |
返回:array
示例
uses interp_unit; // 置顶
x := array(5, 1, 19, 8);
y := array(2, 3, 1, 7);
xi := array(4, 12);
return interp_unit.linear(x, y, xi);
// 输出:array(2.66666666666667,1.77777777777778)
spline(x1, y1, xx1)
声明:function
三次样条插值
| 参数 | 类型 | 说明 |
|---|---|---|
x1 |
array | 一维数字数组 横坐标序列 |
y1 |
array | 一维数字数组 纵坐标序列 |
xx1 |
array | 实数或一维数字数组 插值 |
返回:array
示例
x := array(5, 1, 19, 8);
y := array(2, 3, 1, 7);
xx := array(4, 12);
return spline(x, y, xx);
// 输出:array(1.1407,13.9444)