牛顿插值多项式算法

这段代码展示了如何使用牛顿差分插值法来计算多项式插值。实例中定义了一个`NewtonDifference`类,包含了计算插值和误差的函数。通过对给定的x和y值数组,利用牛顿插值公式,计算了不同阶数的插值结果和误差估计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NewtonDifference.h

#pragma once

class NewtonDifference
{
public:
	NewtonDifference(void);
	virtual ~NewtonDifference(void);

	// 三阶插值函数
	float f3(float x);

	// 牛顿插值多项式算法
	void NewInt(double* x, double* y
		, int n, double& xi, double* yint, double* ea);
};


NewtonDifference.cpp

#include "NewtonDifference.h"
#include <string.h>
#include <stdio.h>

NewtonDifference::NewtonDifference(void)
{
    //f3(2);

    // 开始牛顿插值
    double *x = new double[4];
    x[0] = 1.0f;
    x[1] = 4.0f;
    x[2] = 6.0f;
    x[3] = 5.0f;

    double *y = new double[4];
    y[0] = 0.0f;
    y[1] = 1.386294f;
    y[2] = 1.791759f;
    y[3] = 1.609438f;

    int n = 3;
    double * yint = new double[n];
    double * ea = new double[n];

    // 插出一个值
    double xi = 2.0f;
    //double y = 0.0f;
    //double ea = 0.0f;
    NewInt(x, y, n, xi, yint, ea);
}

NewtonDifference::~NewtonDifference(void)
{
    
}

#pragma warning(disable: 4244)
float NewtonDifference::f3(float x)
{
    float f3 = 0.0f;
    f3 = 0.0 + 0.4620981f * (x-1)
        + (-0.05187311f)* (x-1) * (x-4)
        + 0.007865529f * (x - 1) * (x - 4)
        * (x - 6);

    return f3;
}

// x, y ,采样的固定点
// n, 多项式插值的阶数
// xi, 要估计的自变量值
// yint, 不同阶数下插值出的y值
// ea, 不同阶数下的估计误差值
// 牛顿插值多项式算法
void NewtonDifference::NewInt(double* x, double* y
            , int n, double& xi, double* yint, double* ea)
{

    double *fdd = new double[n*n];
    ::memset(fdd, 0, sizeof(float)*n*n);

    // 0阶差商
    for(int i = 0; i <= n; i++)
    {
        fdd[i*n] = y[i];

        printf("x[%d]=%f, y[%d]=%f\n", i, x[i], i, y[i]);
    }

    // 1阶及以后的差商
    for (int j = 1; j <= n; j++)
    {
        printf("\n%d order difference devide:\n", j);
        for (int i = 0; i <= n -j; i++)
        {
            // 当前阶数下,各采样点的差商
            fdd[i*n+j] = (fdd[(i+1)*n + j-1] - fdd[i*n + j-1])
                / (x[i+j] - x[i]);

            printf("fdd[%d][%d]=%f\n\n", i,j, fdd[i*n+j]);
        }
    }

    double xterm = 1.0f;
    double yterm = 0.0f;
    yint[0] = fdd[0*n + 0];

    // 处理得到的各阶差商
    for(int order = 1; order <= n; order++)
    {
        // 多项式中,x项的处理
        xterm = xterm * (xi - x[order-1]);

        // fdd[][]是一个二维数组
        yterm = yint[order - 1]
                + fdd[0*n + order] * xterm;

        // 当前阶数下的估值误差
        // Rn = fn+1(x) - fn(x);
        ea[order] = yterm - yint[order - 1];

        // 可观察不同阶数下的估值精度
        yint[order] = yterm;

        printf("yint[%d]=%f, ea[%d]=%f\n", order, yint[order]
        ,order, ea[order]);
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值