【matlab】 拉格朗日插值

第一个函数  "lagrange1.m"

输入:X Y 与点x0

输出:插值函数对应函数值 y0

function y = lagrange1(X,Y,x0)
n = length(X);
m = length(x0);
for i = 1:m
    z = x0(i);
    s = 0.0;
    for k = 1:n;
        p = 1.0;
        for j = 1:n
            if j~=k
                p = p*(z - X(j))/(X(k)-X(j));
            end
        end
        s = p * Y(k) + s;
    end
    y(i) = s;
end

第二个函数  "lagrange2.m"

输入:X Y

输出:插值函数

function L = lagrange2(x,y)
m = length(x);
for k = 1:m;
    V = 1;
    for i = 1:m;
        if k~=i
            V = conv(V,poly(x(i)))/(x(k)-x(i));
        end
    end
    l(k,:) = poly2sym(V);
end
L = y * l;

"main.m"

一个简单的测试:

x = [1,1.2,1.8,2.5,4];
y =[0.8415,0.9320,0.9738,0.5985,-0.7568];
x0 = [1.6,3];
y0 = lagrange1(x,y,x0)

xx = 0:0.1:5;
yy1 = sin(xx);
yy2 = lagrange1(x,y,xx);
plot(xx,yy1,‘-r‘,xx,yy2,‘-b‘);
grid
L = lagrange2(x,y);
vpa(L,5)

xx0 = 1:5;
yy0 = lagrange1(x,y,xx0);
yy1 = sin(xx0);
ep = yy1 - yy0

原文地址:https://www.cnblogs.com/tao-zhu-forever/p/8995742.html

时间: 2024-08-14 20:01:47

【matlab】 拉格朗日插值的相关文章

【数值分析】拉格朗日插值与牛顿插值

在工程应用和科学研究中,经常要研究变量之间的关系y=f(x).但对于函数f(x),常常得不到一个具体的解析表达式,它可能是通过观测或实验得到的一组数据(x,f(x)),x为一向量;或则是解析表达式非常复杂,不便于计算和使用.因此我们需要寻找一个计算比较简单的函数S(x)近似代替f(x),并使得S(x)=f(x),这种方法就称为插值法. 常用的插值法有: 一维插值法:拉格朗日插值.牛顿插值.分段低次插值.埃尔米特插值.样条插值. 二维插值法:双线性插值.双二次插值. 拉格朗日插值法 已知函数f(x

拉格朗日插值Python代码实现

1. 数学原理 对某个多项式函数有已知的k+1个点,假设任意两个不同的都互不相同,那么应用拉格朗日插值公式所得到的拉格朗日插值多项式为: 其中每个lj(x)为拉格朗日基本多项式(或称插值基函数),其表达式为: 2. 轻量级实现 利用 直接编写程序,可以直接插值,并且得到对应的函数值.但是不能得到系数,也不能对其进行各项运算. def h(x,y,a): ans=0.0 for i in range(len(y)): t=y[i] for j in range(len(y)): if i !=j:

Educational Codeforces Round 7 F - The Sum of the k-th Powers 拉格朗日插值

The Sum of the k-th Powers There are well-known formulas: , , . Also mathematicians found similar formulas for higher degrees. Find the value of the sum modulo 109 + 7 (so you should find the remainder after dividing the answer by the value 109 + 7).

BZOJ4599[JLoi2016&LNoi2016]成绩比较(dp+拉格朗日插值)

这个题我们首先可以dp,f[i][j]表示前i个科目恰好碾压了j个人的方案数,然后进行转移.我们先不考虑每个人的分数,先只关心和B的相对大小关系.我们设R[i]为第i科比B分数少的人数,则有f[i][j]=sum f[i-1][k]*C(k,j)*C(n-1-k,R[i]-j)  (k>=j) 怎么解释呢,首先前i-1科有k个人已经被碾压,k肯定大于等于j,然后考虑当前这一科有j个人被碾压,那么就需要从k个人中选出j个来即C(k,j),然后从剩下的有R[i]-j个人比B考的少,这些人必须是之前i

拉格朗日插值

一,介绍 学过FFT的人都应该知道什么叫做插值,插值的意思就是说将一个多项式从点值表达转变成系数表达. 在FFT的插值中为什么可以做到n log n,是因为单位复数根的关系. 那对于普通的插值应该怎么办呢?解方程是一种方法,但是这个在计算机中十分不现实. 所以有许多种插值的方法,其中比较普及的就是拉格朗日插值. 二,定义 对某个多项式函数,已知有给定的k + 1个取值点: 其中对应着自变量的位置,而对应着函数在这个位置的取值. 假设任意两个不同的xj都互不相同,那么应用拉格朗日插值公式所得到的拉

【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值

[题意]n位同学(其中一位是B神),m门必修课,每门必修课的分数是[1,Ui].B神碾压了k位同学(所有课分数<=B神),且第x门课有rx-1位同学的分数高于B神,求满足条件的分数情况数.当有一位同学的一门必修课分数不同时视为两种情况不同.n,m<=100,Ui<=10^9. [算法]计数DP+排列组合+拉格朗日插值 [题解]把分数作为状态不现实,只能逐门课考虑. 设$f[i][j]$表示前i门课,有j个同学被碾压的情况数,则有: $$f[i][j]=g(i)\cdot\sum_{k=j

【BZOJ】2655: calc 动态规划+拉格朗日插值

[题意]一个序列$a_1,...,a_n$合法当且仅当它们都是[1,A]中的数字且互不相同,一个序列的价值定义为数字的乘积,求所有序列的价值和.n<=500,A<=10^9,n+1<A<mod<=10^9,mod是素数. [算法]动态规划+拉格朗日插值 [题解]这道题每个数字的贡献和序列选了的数字积关系密切,所以不能从序列角度考虑(和具体数字关系不大). 设$f_{n,m}$表示前n个数字(值域)中取m个数字的答案,那么枚举取或不取数字n,取n时乘n且有j个位置可以插入,即:

python拉格朗日插值

#拉格朗日插值代码 import pandas as pd #导入数据分析库Pandas from scipy.interpolate import lagrange #导入拉格朗日插值函数 inputfile = '../data/catering_sale.xls' #销量数据路径 outputfile = '../tmp/sales.xls' #输出数据路径 data = pd.read_excel(inputfile) #读入数据 data[u'销量'][(data[u'销量'] < 4

[2016北京集训测试赛17]crash的游戏-[组合数+斯特林数+拉格朗日插值]

Description Solution 核心思想是把组合数当成一个奇怪的多项式,然后拉格朗日插值..:哦对了,还要用到第二类斯特林数(就是把若干个球放到若干个盒子)的一个公式: $x^{n}=\sum _{i=0}^{n}C(n,i)*i!*S(i,x)$ 围观大佬博客(qaq公式太难打了) Code #include<iostream> #include<cstdio> #include<cstring> #include<cmath> using na

快速排序 and 拉格朗日插值查找

private static void QuictSort(int[] zu, int left, int right) { if (left < right) { int i = 0; int j = right - 1; int mid = zu[(left + right) / 2]; while (true) { while (i<right && zu[i]<mid) { i++; } while (j > left && zu[j] &g