哈尔滨某985拉格朗日插值法实验C++代码

本文分享了哈尔滨一所985大学的实验项目,使用C++编程实现了拉格朗日插值法。通过这段代码,读者可以了解到如何在实际问题中应用数学的插值理论。
摘要由CSDN通过智能技术生成
#include <iostream>
#include <vector>
#include <cmath>
#include <string.h>
using namespace std;

template <class T>
class Lagrange
{
public:
    void lagrange(const int &n, const int &p, T *x, T *y, vector<T> &xi, vector<T> &fx) //输入一组已知点,计算未知点,p为未知点个数,n+1为已知点个数
    {
        for (int m = 0; m < p; m++)
        {
            for (int k = 0; k <= n; k++)
            {
                for (int j = 0; j <= n; j++)
                {
                    if (j != k)
                        l = l * (x[m] - xi.at(j)) / (xi.at(k) - xi.at(j));
                }
                y[m] = y[m] + l * fx.at(k);
                l = 1.0;
            }
        }
    }

private:
    double l = 1.0;
};

int main()
{
    int n = 5;

    vector<double> xi[4], fx[3];
    vector<double> ex[3];
    Lagrange<double> lag;

    for (int q = 0; q < 3; q++)
    {
        if (q == 0)
            n = 5;
        if (q == 1)
            n = 10;
        if (q == 2)
            n = 20;
        for (int i = 0; i <= n; i++)
        {
            xi[q].push_back((-5.0 + i * 10.0 / n));
            fx[q].push_back(1.0 / (1.0 + xi[q].at(i) * xi[q].at(i)));
        }
    }

    double y[4][5] = {}, x[5] = {0.75, 1.75, 2.75, 3.75, 4.75};

    cout << endl
         << endl
         << "问题1:" << endl;

    for (int p = 0; p < 3; p++)
    {
        if (p == 0)
            n = 5;
        if (p == 1)
            n = 10;
        if (p == 2)
            n = 20;
        lag.lagrange(n, 5, x, y[p], xi[p], fx[p]);
    }
    cout.precision(10);
    cout << "1/(1+x^2),插值区间[-5,5]" << endl;
    for (int t = 0; t < 3; t++)
    {
        cout << "____________________________________________" << endl;
        if (t == 0)
        {
            cout << "n = 5:" << endl;
        }
        if (t == 1)
        {
            cout << "n = 10:" << endl;
        }
        if (t == 2)
        {
            cout << "n = 20:" << endl;
        }
        for (int i = 0; i < 5; i++)
            std::cout << "x = " << x[i] << ", "
                      << "y = " << y[t][i] << std::endl;
    }
    cout << "===========================================";
    cout << endl
         << "真实值为" << endl;
    for (int i = 0; i < 5; i++)
    {
        cout << "x = " << x[i] << "y = " << (1.0 / (1.0 + x[i] * x[i])) << endl;
    }

    for (int i = 0; i < 3; i++)
    {
        xi[i].clear();
    }

    for (int i = 0; i < 5; i++)
    {
        x[i] = 0;
    }
    for (int i = 0; i < 3; i++)
    {
        for (int v = 0; v < 5; v++)
            y[i][v] = 0;
    }

    for (int q = 0; q < 3; q+
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值