javascript Spline代码

代码是通过网上一个winform代码中提取修改而来的。后转为javascript 版本。

/*
points = new Array();
points.push({x:1,y:2});
*/
function Spline(points) {
    var NewArrayFloat = function(n) {
        var arr = new Array(n);
        for (var i = 0; i < n; i++) {
            arr[i] = 0.0;
        }
        return arr;
    }
    /*
    C# (float[] sub, float[] diag, float[] sup, ref float[] b, int n)
    Js return float[] b;
    */
    var solveTridiag = function(sub, diag, sup, b, n) {
        /*
        solve linear system with tridiagonal n by n matrix a
        using Gaussian elimination *without* pivoting
        where   a(i,i-1) = sub[i]  for 2<=i<=n
        a(i,i)   = diag[i] for 1<=i<=n
        a(i,i+1) = sup[i]  for 1<=i<=n-1
        (the values sub[1], sup[n] are ignored)
        right hand side vector b[1:n] is overwritten with solution 
        NOTE: 1...n is used in all arrays, 0 is unused */
        var i;
        /*factorization and forward substitution */
        for (i = 2; i <= n; i++) {
            sub[i] = sub[i] / diag[i - 1];
            diag[i] = diag[i] - sub[i] * sup[i - 1];
            b[i] = b[i] - sub[i] * b[i - 1];
        }
        b[n] = b[n] / diag[n];
        for (i = n - 1; i >= 1; i--) {
            b[i] = (b[i] - sup[i] * b[i + 1]) / diag[i];
        }
        return b;
    }

    var resultPoint = new Array();
    var precision = 10;

    var np = points.length;
    var yCoords = NewArrayFloat(np);
    var xCoords = NewArrayFloat(np);
    var x;
    var y;
    var oldy = 0;
    var oldx = 0;

    var npp = np * precision;

    // draw a border around the canvas
    if (np > 0) {
        // draw the control points
        for (var i = 0; i < np; i++) {
            var p = { x: points[i].x, y: points[i].y };
            xCoords[i] = p.x;
            yCoords[i] = p.y;
        }

        if (np > 1) {
            var a = new NewArrayFloat(np);
            var x1;
            var x2;
            var h = new NewArrayFloat(np);
            for (var i = 1; i <= np - 1; i++) {
                h[i] = xCoords[i] - xCoords[i - 1];
            }
            if (np > 2) {
                var sub = NewArrayFloat(np - 1);
                var diag = NewArrayFloat(np - 1);
                var sup = NewArrayFloat(np - 1);

                for (var i = 1; i <= np - 2; i++) {
                    diag[i] = (h[i] + h[i + 1]) / 3;
                    sup[i] = h[i + 1] / 6;
                    sub[i] = h[i] / 6;
                    a[i] = (yCoords[i + 1] - yCoords[i]) / h[i + 1] - (yCoords[i] - yCoords[i - 1]) / h[i];
                }

                //C# CODE param [a] = [ref a];
                a = solveTridiag(sub, diag, sup, a, np - 2);
            }
            // note that a[0]=a[np-1]=0

            oldx = xCoords[0];
            oldy = yCoords[0];

            resultPoint.push({ x: oldx, y: oldy });

            for (var i = 1; i <= np - 1; i++) {
                // loop over intervals between nodes
                for (var j = 1; j <= precision; j++) {
                    x1 = (h[i] * j) / precision;
                    x2 = h[i] - x1;
                    y = ((-a[i - 1] / 6 * (x2 + h[i]) * x1 + yCoords[i - 1]) * x2 +
                        (-a[i] / 6 * (x1 + h[i]) * x2 + yCoords[i]) * x1) / h[i];
                    x = xCoords[i - 1] + x1;

                    resultPoint.push({ x: x, y: y });

                    oldx = x;
                    oldy = y;
                }
            }
        }
    }
    return resultPoint;
}

 

转载于:https://www.cnblogs.com/jgjgjg23/p/3460997.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MATLAB的spline函数是一个用于进行样条插值的函数。样条插值是一种用于在一组非均匀间隔的数据点之间进行平滑插值的方法。下面是一个示例的MATLAB spline函数的C代码实现: ```c #include <stdio.h> // 定义样条插值函数 void spline(int n, double x[], double y[], double yp1, double ypn, double y2[]) { int i, k; double p, qn, sig, un; double *u; // 动态分配内存 u = (double*)malloc(n * sizeof(double)); // 边界条件处理 y2[0] = -0.5; u[0] = (3.0 / (x[1] - x[0])) * ((y[1] - y[0]) / (x[1] - x[0]) - yp1); // 进行三次样条插值 for (i = 1; i < n - 1; i++) { sig = (x[i] - x[i-1]) / (x[i+1] - x[i-1]); p = sig * y2[i-1] + 2.0; y2[i] = (sig - 1.0) / p; u[i] = (y[i+1] - y[i]) / (x[i+1] - x[i]) - (y[i] - y[i-1]) / (x[i] - x[i-1]); u[i] = (6.0 * u[i] / (x[i+1] - x[i-1]) - sig * u[i-1]) / p; } qn = 0.5; un = (3.0 / (x[n-1] - x[n-2])) * (ypn - (y[n-1] - y[n-2]) / (x[n-1] - x[n-2])); y2[n-1] = (un - qn * u[n-2]) / (qn * y2[n-2] + 1.0); // 回代计算 for (k = n - 2; k >= 0; k--) { y2[k] = y2[k] * y2[k+1] + u[k]; } // 释放内存 free(u); } int main() { int n = 5; // 数据点个数 double x[5] = {1, 2, 3, 4, 5}; // x坐标数组 double y[5] = {2, 4, 1, 3, 5}; // y坐标数组 double y2[5]; // 存储二阶导数的数组 double yp1 = 0; // 第一个点的一阶导数 double ypn = 0; // 最后一个点的一阶导数 spline(n, x, y, yp1, ypn, y2); // 输出每个插值点的值 for (int i = 0; i < n; i++) { printf("插值点%d的值为: %f\n", i+1, y[i]); } return 0; } ``` 以上是一个简单的MATLAB spline函数的C代码实现。注意在C语言中需要手动分配和释放内存,所以在函数中使用了`malloc`和`free`函数来实现动态内存分配和释放。代码中的`main`函数是一个简单的示例,使用了五个数据点进行插值,并输出每个插值点的值。你可以根据自己的需求,修改数据点的个数和坐标数组来实现自己的样条插值。 ### 回答2: MATLAB的spline函数是一个用于插值计算的函数。在MATLAB中,可以使用spline函数实现对给定数据点的插值计算。 spline函数的C代码如下所示: ``` #include <stdio.h> #include <stdlib.h> void spline(int n, double x[], double y[], double yp1, double ypn, double y2[]) { int i, k; double p, qn, sig, un; double *u = malloc(n * sizeof(double)); y2[0] = -0.5; u[0] = (3.0 / (x[1] - x[0])) * ((y[1] - y[0]) / (x[1] - x[0]) - yp1); for (i = 1; i < n - 1; i++) { sig = (x[i] - x[i - 1]) / (x[i + 1] - x[i - 1]); p = sig * y2[i - 1] + 2.0; y2[i] = (sig - 1.0) / p; u[i] = (y[i + 1] - y[i]) / (x[i + 1] - x[i]) - (y[i] - y[i - 1]) / (x[i] - x[i - 1]); u[i] = (6.0 * u[i] / (x[i + 1] - x[i - 1]) - sig * u[i - 1]) / p; } qn = 0.5; un = (3.0 / (x[n - 1] - x[n - 2])) * (ypn - (y[n - 1] - y[n - 2]) / (x[n - 1] - x[n - 2])); y2[n - 1] = (un - qn * u[n - 2]) / (qn * y2[n - 2] + 1.0); for (k = n - 2; k >= 0; k--) { y2[k] = y2[k] * y2[k + 1] + u[k]; } free(u); } int main() { int n = 5; // 数据点个数 double x[] = {1.0, 2.0, 3.0, 4.0, 5.0}; // x坐标数据 double y[] = {1.0, 4.0, 9.0, 16.0, 25.0}; // y坐标数据 double yp1 = 0.0; // 插值起始点的一阶导数 double ypn = 0.0; // 插值终点的一阶导数 double *y2 = malloc(n * sizeof(double)); // 存储二阶导数 spline(n, x, y, yp1, ypn, y2); printf("二阶导数:\n"); for (int i = 0; i < n; i++) { printf("y2[%d] = %f\n", i, y2[i]); } free(y2); return 0; } ``` 这段代码定义了一个函数`spline`,用来计算给定数据点集的插值二阶导数。在`main`函数中,我们给定了5个数据点的x坐标和y坐标,以及起始点和终点的一阶导数。然后调用`spline`函数计算插值的二阶导数,并打印输出结果。 注意:这段代码只是实现了spline函数的一小部分功能,仅仅计算了插值的二阶导数。实际使用中,可能需要对输入数据进行预处理、计算其他导数或进行插值计算。完整的spline函数的实现可能更加复杂。 ### 回答3: spline函数是MATLAB中用于进行插值的函数,它通过一组已知的数据点来构建出一个光滑的曲线。下面是一个示例的MATLAB spline函数的C代码实现: ```c #include <stdio.h> #include <stdlib.h> // 为了使用动态内存分配函数 #include <math.h> typedef struct { double x; double y; } Point; double* spline(int n, Point* points) { // 计算差分数组 double* h = (double*)malloc((n - 1) * sizeof(double)); double* a = (double*)malloc(n * sizeof(double)); double* b = (double*)malloc(n * sizeof(double)); double* c = (double*)malloc(n * sizeof(double)); double* d = (double*)malloc(n * sizeof(double)); double* alpha = (double*)malloc((n - 1) * sizeof(double)); double* beta = (double*)malloc((n - 1) * sizeof(double)); double* gamma = (double*)malloc((n - 1) * sizeof(double)); double* mu = (double*)malloc((n - 1) * sizeof(double)); double* z = (double*)malloc(n * sizeof(double)); for (int i = 0; i < n - 1; i++) { h[i] = points[i + 1].x - points[i].x; } // 计算三对角矩阵系数 alpha[0] = 0; beta[0] = 0; gamma[0] = 0; for (int i = 1; i < n - 1; i++) { alpha[i] = 1 / h[i]; beta[i] = 2 * (1 / h[i - 1] + 1 / h[i]); gamma[i] = 1 / h[i - 1]; mu[i] = 6 * ((points[i + 1].y - points[i].y) / h[i] - (points[i].y - points[i - 1].y) / h[i - 1]); } // 利用追赶法求解三对角线性方程组 z[0] = 0; z[n - 1] = 0; for (int i = 1; i < n - 1; i++) { z[i] = mu[i] - alpha[i] * z[i - 1]; } c[0] = 0; c[n - 1] = 0; for (int i = n - 2; i > 0; i--) { c[i] = (z[i] - gamma[i] * c[i + 1]) / beta[i]; } // 计算系数a、b和d for (int i = 0; i < n - 1; i++) { a[i] = points[i].y; b[i] = (points[i + 1].y - points[i].y) / h[i] - h[i] * (c[i + 1] + 2 * c[i]) / 6; d[i] = (c[i + 1] - c[i]) / (6 * h[i]); } a[n - 1] = points[n - 1].y; // 释放动态内存 free(h); free(alpha); free(beta); free(gamma); free(mu); free(z); // 返回计算得到的曲线系数 return a; } int main() { int n = 4; // 数据点个数 Point* points = (Point*)malloc(n * sizeof(Point)); // 数据点数组 // 初始化数据点 points[0].x = 0; points[0].y = 1; points[1].x = 1; points[1].y = 2; points[2].x = 2; points[2].y = 3; points[3].x = 3; points[3].y = 4; // 调用spline函数计算曲线系数 double* coefficients = spline(n, points); // 打印曲线系数 for (int i = 0; i < n; i++) { printf("a[%d] = %f\n", i, coefficients[i]); } // 释放动态内存 free(points); free(coefficients); return 0; } ``` 以上是一个简单的C语言实现的MATLAB spline函数的代码,它接受一组数据点作为输入,计算出曲线的系数并打印出来。这个代码示例中输入的数据点为(0, 1),(1, 2),(2, 3),(3, 4),你可以根据实际需求修改数据点的个数和坐标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值