概念
设f(x)在N+1个点(x0,y0)…(xn,yn)处的值已知,其中值xk在区间【a,b】上,xk互不相同,满足a≤x0<x1<…<xn≤b,yk=f(xk)。求任一插值点x对应的y。
插值法的思路在于通过构造一个N次多项式P(x),使其通过N+1个点,然后求x处的函数值y。
拉格朗日逼近
例题
【问题描述】考虑[0.0,1.2]内的函数y=f(x)=cos(x)。利用多个(2,3,4等)节点构造拉格朗日插值多项式。
【输入形式】在屏幕上依次输入在区间[0.0,1.2]内的一个值x*,构造插值多项式后求其P(x*)值,和多个节点的x坐标。
【输出形式】输出插值多项式系数矩阵,拉格朗日系数多项式矩阵和P(x*)值(保留6位有效数字)。
【样例1输入】
0.3
0 0.6 1.2
【样例1输出】
-0.400435
-0.0508461
1
1.38889 -2.5 1
-2.77778 3.33333 -0
1.38889 -0.833333 0
0.948707
【样例1说明】输入:x为0.3,3个节点的x坐标分别为x0=0,x1=0.6和x2=1.2。
输出:插值多项式系数矩阵,则插值多项式P2(x)表示为-0.400435x**2-0.0508461x+1;
拉格朗日系数多项式矩阵,则P2(x)表示为:y0(1.38889x2-2.5x+1)+y1*(-2.77778x2+3.33333x-0)+y2*(1.38889x**2-0.83333x+0);
当x*为0.3时,P2(0.3)值为0.948707。
【评分标准】根据输入得到的输出准确
ACcode:
c++ code(后面有python代码)
#include <bits/stdc++.h>
#define pr printf
#define sc scanf
#define for0(i, n) for (i = 0; i < n; i++)
#define for1n(i, n) for (i = 1; i <= n; i++)
#define forab(i, a, b) for (i = a; i <= b; i++)
#define forba(i, a, b) for (i = b; i >= a; i--)
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define int long long
#define pii pair<int, int>
#define pdd pair<double, double>
#define vd vector<double>
#define vdd vector<vector<double>>
#define vi vector<int>
#define vii vector<vector<int>>
#define vt3 vector<tuple<int, int, int>>
#define mem(ara, n) memset(ara, n, sizeof(ara))
#define memb(ara) memset(ara, false, sizeof(ara))
#define all(x) (x).begin(), (x).end()
#define sq(x) ((x) * (x))
#define sz(x) x.size()
const int N = 2e5 + 100;
const int mod = 1e9 + 7;
namespace often
{
inline void input