以下是三次样条插值函数的C++代码:

#include <iostream>
#include <vector>

using namespace std;

// 三次样条插值函数
double splineInterpolation(vector<double>& x, vector<double>& y, double xi) {
    // 计算步长
    int n = x.size();
    vector<double> h(n - 1);
    for (int i = 0; i < n - 1; i++) {
        h[i] = x[i + 1] - x[i];
    }

    // 计算三对角矩阵的系数
    vector<double> a(n - 2), b(n - 1), c(n - 2), d(n - 1);
    for (int i = 0; i < n - 2; i++) {
        a[i] = h[i];
        b[i] = 2 * (h[i] + h[i + 1]);
        c[i] = h[i + 1];
        d[i] = 3 * ((y[i + 2] - y[i + 1]) / h[i + 1] - (y[i + 1] - y[i]) / h[i]);
    }
    b[n - 2] = 2 * h[n - 2];
    d[n - 2] = 3 * ((y[n - 1] - y[n - 2]) / h[n - 2] - (y[n - 2] - y[n - 3]) / h[n - 3]);

    // 追赶法求解三对角矩阵
    vector<double> g(n - 1), p(n - 1);
    g[0] = b[0];
    p[0] = d[0] / g[0];
    for (int i = 1; i < n - 1; i++) {
        g[i] = b[i] - a[i - 1] * c[i - 1] / g[i - 1];
        p[i] = (d[i] - a[i - 1] * p[i - 1]) / g[i];
    }

    // 求解插值函数的系数
    vector<double> c2(n - 1), c3(n - 1);
    c2[n - 2] = p[n - 2];
    for (int i = n - 3; i >= 0; i--) {
        c2[i] = p[i] - c[i] * c2[i + 1] / g[i];
    }
    for (int i = 0; i < n - 1; i++) {
        c3[i] = (c2[i + 1] - c2[i]) / (3 * h[i]);
    }
    vector<double> c1(n - 1);
    for (int i = 0; i < n - 1; i++) {
        c1[i] = (y[i + 1] - y[i]) / h[i] - h[i] * (c2[i + 1] + 2 * c2[i]) / 3;
    }

    // 计算插值函数的值
    int k = 0;
    for (int i = 0; i < n - 1; i++) {
        if (xi >= x[i] && xi <= x[i + 1]) {
            k = i;
            break;
        }
    }
    double dx = xi - x[k];
    return y[k] + c1[k] * dx + c2[k] * dx * dx + c3[k] * dx * dx * dx;
}

int main() {
    vector<double> x = { 0, 1, 2, 3, 4 };
    vector<double> y = { 0, 1, 8, 27, 64 };
    double xi = 2.5;
    double yi = splineInterpolation(x, y, xi);
    cout << "spline interpolation of (" << xi << ", " << yi << ")" << endl;
    return 0;
}

此代码使用向量存储输入数据,并使用三对角矩阵的追赶法求解三次样条插值函数的系数。最终,它计算出插值函数在指定点的值,并输出结果

写一段三次样条插值函数的c++代码

原文地址: https://www.cveoy.top/t/topic/emT8 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录