牛顿插值法

#include <iostream>
#include <vector>

using namespace std;

// Newton插值多项式函数
double newton_interpolation(const vector<double>& x_data, const vector<double>& y_data, double x)
{
    int n = x_data.size();

    // 计算差商表
    vector<vector<double>> div_diff(n, vector<double>(n));
    for (int i = 0; i < n; i++)
    {
        div_diff[i][0] = y_data[i];
    }

    for (int j = 1; j < n; j++)
    {
        for (int i = 0; i < n - j; i++)
        {
            div_diff[i][j] = (div_diff[i+1][j-1] - div_diff[i][j-1]) / (x_data[i+j] - x_data[i]);
        }
    }

    // 计算插值结果
    double result = div_diff[0][0];
    double term = 1.0;

    for (int i = 1; i < n; i++)
    {
        term *= (x - x_data[i-1]);
        result += div_diff[0][i] * term;
    }

    return result;
}

int main()
{
    // 输入数据点
    vector<double> x_data = {1.0, 2.0, 3.0, 4.0, 5.0};
    vector<double> y_data = {1.0, 4.0, 9.0, 16.0, 25.0};

    // 要求的插值点
    vector<double> interp_points = {2.5, 3.5, 4.5};

    // 计算插值结果
    for (auto x : interp_points)
    {
        double result = newton_interpolation(x_data, y_data, x);
        cout << "插值点x = " << x << ",插值结果为:" << result << endl;
    }

    return 0;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值