拉格朗日插值和求多项式系数

article/2025/9/21 21:25:51

拉格朗日介绍

先说说拉格朗日是啥吧
首先 拉格朗日插值是给你 n+1 个点 (x,y) 然后根据这n个点可以O(n^2)的求出多项式的系数。也就是解出这个多项式的答案。

假设给你一个多项式
y=a0+a1*x+a2*x^2
然后给你3个解 (x1,y1)(x2,y2)(x3,y3)你第一个想法是怎么解?解方程啊是不是
代进去是不是这样

解这个方程复杂度多少,高斯消元O(n^3)很显然复杂度高了。
拉格朗日就比较厉害了他能O(n^2)解决
首先 假设一个多项式
f1(x)=b+b1*x+b2*x^2
当然 x1 解是 1 x2 x3 解是 0
同理再假设 f2(x) f3(x)
然后L(x)=y1*f1(x)+y2*f2(x)+t3*f3(x) 这个就是最开始那个方程,不信?你把x1 x2 x3 带进去绝对是 y1 y2 y3
那么问题来了后面f1(x)这个多项式怎么求出来????
这就是拉格朗日基本公式

没错就是他
哦!搞错了是下面这个,上面那个是乘上yi的最终表达式
再来一遍,这就是拉格朗日基本公式

把这个多项式展开会发现非常神奇的事,当x=xj的时候刚好等于1 否则等于0
就是下面这样了

怕你还是看不懂,举个例子给你看


还有一个问题你们肯定很想问。。。知道公式之后怎么解。。。
对于这个问题
分母 是不是每次算一下就行了,答案是固定的
分子是不是一个大的多项式里面少了一个,就预处理出总的多项式然后,模拟除一下(x+c)的多项式

理论知识全部搞定,下面就给你贴模板了

板子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//这个是杜教的板子 我打了点注释/// 注意mod,使用前须调用一次 polysum::init(int M);
/// 注意mod,使用前须调用一次 polysum::init(int M);
namespace polysum {
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
typedef long long ll;
const ll mod = 1e9 + 7; /// 取模值
ll powmod(ll a, ll b) {ll res = 1;a %= mod;assert(b >= 0);for (; b; b >>= 1) {if (b & 1)res = res*a%mod;a = a*a%mod;}return res;
}const int D = 1010000; /// 最高次限制
ll a[D], f[D], g[D], p[D], p1[D], p2[D], b[D], h[D][2], C[D];
ll calcn(int d, ll *a, ll n) {          //根据前 d 项 求 第n项if (n <= d) return a[n];p1[0] = p2[0] = 1;rep(i, 0, d + 1) {ll t = (n - i + mod) % mod;p1[i + 1] = p1[i] * t%mod;}rep(i, 0, d + 1) {ll t = (n - d + i + mod) % mod;p2[i + 1] = p2[i] * t%mod;}ll ans = 0;rep(i, 0, d + 1) {ll t = g[i] * g[d - i] % mod*p1[i] % mod*p2[d - i] % mod*a[i] % mod;if ((d - i) & 1) ans = (ans - t + mod) % mod;else ans = (ans + t) % mod;}return ans;
}
void init(int M) { /// M:最高次f[0] = f[1] = g[0] = g[1] = 1;rep(i, 2, M + 5) f[i] = f[i - 1] * i%mod;g[M + 4] = powmod(f[M + 4], mod - 2);per(i, 1, M + 4) g[i] = g[i + 1] * (i + 1) % mod;   //逆元
}ll polysum(ll n, ll *arr, ll m) { /// a[0].. a[m] \sum_{i=0}^{n-1} a[i]for (int i = 0; i <= m; i++)a[i] = arr[i];a[m + 1] = calcn(m, a, m + 1);rep(i, 1, m + 2) a[i] = (a[i - 1] + a[i]) % mod;return calcn(m + 1, a, n - 1);
}
ll qpolysum(ll R, ll n, ll *a, ll m) { /// a[0].. a[m] \sum_{i=0}^{n-1} a[i]*R^iif (R == 1) return polysum(n, a, m);a[m + 1] = calcn(m, a, m + 1);ll r = powmod(R, mod - 2), p3 = 0, p4 = 0, c, ans;h[0][0] = 0;h[0][1] = 1;rep(i, 1, m + 2) {h[i][0] = (h[i - 1][0] + a[i - 1])*r%mod;h[i][1] = h[i - 1][1] * r%mod;}rep(i, 0, m + 2) {ll t = g[i] * g[m + 1 - i] % mod;if (i & 1) p3 = ((p3 - h[i][0] * t) % mod + mod) % mod, p4 = ((p4 - h[i][1] * t) % mod + mod) % mod;else p3 = (p3 + h[i][0] * t) % mod, p4 = (p4 + h[i][1] * t) % mod;}c = powmod(p4, mod - 2)*(mod - p3) % mod;rep(i, 0, m + 2) h[i][0] = (h[i][0] + h[i][1] * c) % mod;rep(i, 0, m + 2) C[i] = h[i][0];ans = (calcn(m, C, n)*powmod(R, n) - c) % mod;if (ans<0) ans += mod;return ans;
}
}

然后下面这个是求多项式的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
LL temp[maxn];void mul(LL *f, int len, LL t) { //len为多项式的次数+1,函数让多项式f变成f*(x+t)for(int i = len; i > 0; --i) {temp[i] = f[i];f[i] = f[i-1];}temp[0] = f[0], f[0] = 0;for(int i = 0; i <= len; ++i) {f[i] = (f[i] + t*temp[i])%mod;}}void dev(LL *f, LL *r, LL t,int len) { //f是被除多项式的系数,r保存f除以x+t的结果 len是最高次项for(int i = 0; i <= len; ++i) {temp[i] = f[i];}for(int i = len; i > 0; --i) {r[i-1] = temp[i];temp[i-1] = (temp[i-1] - t*temp[i])%mod;}return;}LL a[maxn], b[maxn], c[maxn];
LL x[maxn], y[maxn]; //x,y输入从 1开始到n
int n;
void lglr() {memset(a,0,sizeof a);b[1] = 1, b[0] = -x[1];for(int i = 2; i <= n; ++i) {mul(b, i, -x[i]);}//预处理(x-x1)*(x-x2)...*(x-xn)for(int i = 1; i <= n; ++i) {LL fz = 1;for(int j = 1; j <= n; ++j) {if(j == i) continue;fz = fz*(x[i] - x[j])%mod;}fz = qm(fz, mod-2);fz = fz*y[i]%mod;//得到多项式系数dev(b, c, -x[i],n);//得到多项式,保存在b数组for(int j = 0; j < n; ++j) a[j] = (a[j] + fz*c[j])%mod;}
}LL cal(LL k) {  //计算第x=k值LL ans = 0;LL res = 1;for(int i = 0; i < n; ++i) {ans = (ans + res*a[i])%mod;res = res*k%mod;}ans = (ans + mod)%mod;return ans;
}

 

# 数论


http://chatgpt.dhexx.cn/article/l7ePVBy4.shtml

相关文章

数学建模准备 插值(拉格朗日多项式插值,牛顿多项式插值,分段线性插值,分段三次样条插值,分段三次Hermite插值)

文章目录 摘要&#xff08;必看&#xff09;0 基础概念什么是插值插值用途什么是拟合插值和拟合的相同点插值和拟合的不同点 1 常用的基本插值方法1.1 多项式插值法1.1.1 拉格朗日多项式插值法多项式插值并不是次数越大越好&#xff08;龙格现象&#xff09;分段低次线性插值以…

数模--拉格朗日多项式插值、matlab实现

拉格朗日多项式公式&#xff1a; matlab中插入一个值的代码 function yhlagrange(x,y,xh) %定义拉格朗日插入函数 nlength(x); %统计x和xh的长度 mlength(xh); yhzeros(1,m); %构建一行m列的zero矩阵 c1ones(n-1,1); …

计算方法实验(一):拉格朗日插值多项式

拉格朗日插值数学原理 给定平面上 n 1 n 1 n1个不同的数据点 ( x k , f ( x k ) ) (x_{k},f(x_{k})) (xk​,f(xk​))&#xff0c; k 0 , 1 , ⋯ , n k 0,1,\cdots,n k0,1,⋯,n&#xff0c; x i ≠ x j x_{i} \neq x_{j} xi​​xj​&#xff0c; i ≠ j i \neq j i​j&…

拉格朗日插值多项式在MATLAB中的实现

拉格朗日插值多项式在MATLAB中的实现 Hi! 这是我的一个CSDN博客 例 以下给出了针对题&#xff08;2&#xff09;的使用方法 输入&#xff1a; 1.节点值 2.需要插值的原函数 对于题&#xff08;2&#xff09;需要设置参数为&#xff1a; xx [0,0.25,0.5,1];% The nodes(n…

lagrange插值法:求拉格朗日插值多项式matlab实现(内附代码及例题)

lagrange插值法:求拉格朗日插值多项式matlab实现(内附代码及例题) 关于拉格朗日插值法相关理论知识&#xff0c;在这里小编不在赘述&#xff0c;请不明白的小伙伴自行百度。小编只负责给出matlab源码。 **例题:**看下面例题(如图): matlab代码: %%%% 求拉格朗日多项式及基函…

拉格朗日插值算法分析

这几天一直研究拉格朗日多项式&#xff0c;今天将自己对拉格朗日多项式的理解写在这里&#xff0c;方便大家交流。 在数值分析中&#xff0c;拉格朗日常用于多项式插值。假定提供一组数据点[xi,yi]&#xff0c;拉格朗日插值多项式就是由这些 数据的线性运算得到的。 其中基本…

拉格朗日(Lagrange)插值多项式

题目&#xff1a; 基本原理&#xff1a; 拉格朗日&#xff08;Lagrange&#xff09;插值多项式python实现&#xff1a; # encoding: utf-8 from symtable import Symbol X[0.4,0.5,0.6,0.7,0.8] Y[-0.9163,-0.6931,-0.5108,-0.3567,-0.2231] print(X,Y) Lfloat(0.0) x0.54 len…

使用拉格朗日多项式(Lagrangian polynomials)的插值法(python,数值积分)

第三十五篇 拉格朗日多项式插值 插值多项式 首先考虑一个函数的推导&#xff0c;该函数精准地通过一系列np离散数据点。虽然有无限多的函数具备这个条件&#xff0c;但我们将专注于最简单的一个&#xff0c;一个n阶多项式&#xff0c;其中n np−1。我们称这个函数为“插值多…

三点估算法 PERT计划评审技术

三点估算也称PERT法&#xff0c;在计算每项活动的工期时都要考虑三种可能性&#xff0c;计算最悲观的工 期、最可能的工期、最乐观的工期&#xff0c;然后再计算出该活动的期望工期&#xff0c;PERT法计算的是 期望工期. 用PERT法计算工期&#xff0c;我们必须记住下面三个公…

计划评审技术PERT和关键路径法CP

PERT是利用网络分析制定计划以及对计划予以评价的技术。它能协调整个计划的各道工序&#xff0c;合理安排人力、物力、时间和资金&#xff0c;加速计划的完成。PERT网络是一种类似流程圈的箭线圈。它描绘出项目包含的各种活动的先后次序&#xff0c;标明每项活动的时间或相关的…

PERT(计划评审技术,Program Evaluation an Review Technique)

如果你对项目管理、系统架构有兴趣&#xff0c;请加微信订阅号“softjg”&#xff0c;加入这个PM、架构师的大家庭 PERT(计划评审技术&#xff0c;Program Evaluation an Review Technique) 的理论基础是假设项目持续时间以及整个项目完成时间是随机的&#xff0c;且服从某种概…

PERT网络分析法(计划评估和审查技术)

PERT网络分析法(计划评估和审查技术&#xff0c;Program Evaluation and Review Technique 什么是PERT网络分析? PERT(Program Evaluation and Review Technique)即计划评审技术&#xff0c;最早是由美国海军在计划和控制北极星导弹的研制时发展起来的。PERT技术使原先估计的、…

对项目工时的估算----( PERT “计划评审技术” ) 三点估算法

“三点估算法”也称“PERT”法&#xff0c;在计算每项活动的工期时都要考虑三种可能性&#xff1a;计算最悲观的工期、最可能的工期、最乐观的工期&#xff0c;然后再计算出该活动的期望工期&#xff0c;PERT法计算的是期望工期。 用PERT法计算工期&#xff0c;我们必须记住下面…

技术评审

在工作中&#xff0c;我们经常可以听到以下的声音&#xff1a; “我们不进行评审&#xff0c;是因为我们项目比较特殊&#xff0c;没有时间……”。 “我们的项目已经进行了测试&#xff0c;不需要再进行评审了”。 “评审都是在走过场&#xff0c;没有效果……”。 业界公认评…

CMMI-技术评审管理方案

技术评审&#xff08;Technical Review, TR&#xff09;的目的是尽早地发现工作成果中的缺陷&#xff0c;并帮助开发人员及时消除缺陷&#xff0c;从而有效地提高产品的质量。 技术评审过程域是SPP模型的重要组成部分。本规范阐述了技术评审过程域的三个主要规程&#xff1a; …

PERT(计划评审技术Program Evaluation an Review Technique)

制定进度表中的PERT方法会用到三点估算&#xff0c;计算公式如下&#xff1a; i. 期望值 (悲观乐观4*最可能) / 6 ii. 标准差 (悲观-乐观) / 6 在培训班听课时&#xff0c;几个讲师都说采用三点估算服从正态分布&#xff0c;需要计算期望值与标准差&#xff0c;然而…

项目经理必须知道什么是PERT网络分析(计划评审技术)

目录 什么是PERT网络分析? PERT的基本要求[2] PERT的计算特点 [1] PERT网络分析法的工作步骤 [1] PERT网络分析法的改进[3] β分布及其性质 改进后的计划评审技术 PERT网络技术的作用 [4] 时间网络分析法的优点和局限性[5] PERT网络分析法的案例分析 PERT的案例一&…

怎样做好技术评审

在产品开发的过程中&#xff0c;耳熟能详的一句话是“通过控制过程质量&#xff0c;来保证结果质量”&#xff0c;而对于关键交付件的“技术评审”&#xff0c;正是有效保证过程质量的重要举措之一。从咨询的过往情况来看&#xff0c;绝大多数企业在意识层面对技术评审的必要性…

技术方案评审

from: http://www.infoq.com/cn/news/2012/02/MapReducePatterns 新年开始&#xff0c;大部分公司都在启动大量新功能的规划及设计、技术人员同时在设计对应实现方案、架构师或者技术主管则需要一天内穿梭在多个技术讨论中&#xff0c;评审并达成成熟稳定的设计方案。从架构师的…

图形评审技术(GERT)与计划评审技术(PERT)

什么是PERT网络分析? PERT(Program Evaluation and Review Technique) 即计划评审技术&#xff0c;最早是由美国海军在计划和控制北极星导弹的研制时发展起来的。PERT技术使原先估计的、研制北极星潜艇的时间缩短了两年。 简单地说&#xff0c;PERT是利用网络分析制定计划以…