lagrange插值

1.插值函数

%%n次插值多项式
%%X是插值节点,n是插值多项式次数,若已知函数表达式则attribute为0,未知函数表达式但已知函数值时为1
function IPn = Interpolation_polynomials_of_degree_n(X,Y,precision,attribute)
global MAX;global m;global n;global i;
X = sort(X);
[m,n] = size(X);MAX = max([m,n]);error = [];
if attribute == 0
    F = ones(1,MAX);
    for i = 1:MAX
        F(i) = subs(Y,X(i));
    end
    sum = 0;
    for i = 1:MAX
        sum = sum+F(i)*Interpolation_basis_fun(X,i-1);
    end
    IPn = vpa(collect(sum),4);
    for i = 1:MAX
        error(i) = abs(F(i)-subs(sum,X(i)));
    end

    %%作图
    h=figure;
    set(h,‘color‘,‘w‘);
    t = min(X):(max(X)-min(X))/precision:max(X);
    Yreal = subs(Y,t);
    T = subs(sum,t);
    plot(t,Yreal,‘b‘,t,T,‘g‘,X,F,‘r*‘);
    grid on
    title(‘拉格朗日插值‘);
    xlabel(‘Variable x‘);
    ylabel(‘Variable y‘);
    legend(‘Yreal:真实图像‘,‘T:拟合多项式图像‘,‘F:实际数据‘);

    %%显示坐标
    for i = 1:MAX
        text(X(i),F(i),[‘(‘,num2str(X(i)),‘,‘,num2str(F(i)),‘)‘],‘color‘,[0.02 0.79 0.99]);
    end
     disp(‘误差值为‘);error

elseif attribute == 1
    sum = 0;
    for i = 1:MAX
        sum = sum+Y(i)*Interpolation_basis_fun(X,i-1);
    end
    IPn = vpa(collect(sum),4);

    h=figure;
    set(h,‘color‘,‘w‘);
    t = min(X):(max(X)-min(X))/precision:max(X);
    T = subs(sum,t);
    plot(X,Y,‘g*‘,t,T,‘b‘);
    grid on
    title(‘拉格朗日插值‘);
    xlabel(‘Variable x‘);
    ylabel(‘Variable y‘);
    legend(‘Y:已知数据‘,‘T:拟合多项式图像‘);
    for i = 1:MAX
        text(X(i),Y(i),[‘(‘,num2str(X(i)),‘,‘,num2str(Y(i)),‘)‘],‘color‘,[0.02 0.79 0.99]);
    end
end
end

  2.插值基函数

%%插值基函数
function IBF = Interpolation_basis_fun(X,k)
[m,n] = size(X);MAX = max([m,n]);
X = sort(X);
mult_x = 1;mult_v = 1;
for i = 1:MAX
    syms x;
    if i ~= k+1
        mult_v = mult_v*(X(k+1)-X(i));
        mult_x = mult_x*(x-X(i));
    end
end
IBF = mult_x/mult_v;
end

  3.插值余项与误差界

%%插值余项与误差限(仅能计算已知的函数表达式下的余项)
function MI = More_than_the_interpolation(X,f,xi,precision)
X = sort(X);
a = min(X);b = max(X);
disp(‘xi应在以下区间中:‘);
[a,b]
[m,n] = size(X);MAX = max([m,n]);
Df = diff(f,MAX);Df_value = subs(Df,xi);
MI = vpa(collect(Df_value*omiga(X)/factorial(MAX)),4);

%%误差限
Df_max = max(subs(Df,X));
R_x = vpa(collect(Df_max*abs(omiga(X))/factorial(MAX)),4);
disp(‘误差上限为:‘);
R_x

%%作图区
t = a:(b-a)/precision:b;
T1 = subs(R_x,t);
T2 = subs(MI,t);
h=figure;
set(h,‘color‘,‘w‘);
plot(t,T1,‘r--‘,t,T2,‘g‘);
    grid on
    title(‘误差图像‘);
    xlabel(‘Variable x‘);
    ylabel(‘Variable y‘);
    legend(‘T1:误差上限‘,‘T2:指定误差限‘);

    function fac = Factorial(n)
        if n == 0
            fac = 1;
        else
            fac = Factorial(n-1)*n;
        end
    end
end

  4.连乘多项式

function ox = omiga(X)
[m,n] = size(X);MAX = max([m,n]);
syms x;
mult = 1;
for i = 1:MAX
    mult = mult*(x-X(i));
end
ox=mult;
end

  5.例子

clear all
clc
precision=500;
X=1:1:9;
R1=reshape(rand(9),1,9^2);
R2=reshape(rand(18),1,18^2);
R=zeros(1,9);
for i=1:9
    R(i)=R1(9*i)*R2(18*i)*100;
end

%%已知函数
disp(‘已知函数的表达式‘);
syms x;
f=x*exp(-x^2)+log(abs(exp(x)+precision*sin(x)));
Interpolation_polynomials_of_degree_n(X,f,precision,0)

%%已知函数数值
disp(‘已知函数值‘);
Interpolation_polynomials_of_degree_n(X,R,precision,1)

  结果

已知函数的表达式
误差值为
error =
     0     0     0     0     0     0     0     0     0
ans =
1.621e-5*x^8 + 0.002542*x^7 - 0.1033*x^6 + 1.566*x^5 - 12.15*x^4 + 52.22*x^3 - 122.5*x^2 + 141.6*x - 54.27
已知函数值
ans =
- 0.06151*x^8 + 2.428*x^7 - 40.08*x^6 + 359.3*x^5 - 1899.0*x^4 + 6000.0*x^3 - 10950.0*x^2 + 10420.0*x - 3849.0

  图像如下

原文地址:https://www.cnblogs.com/guliangt/p/12112802.html

时间: 2024-10-12 14:43:16

lagrange插值的相关文章

Python实现Newton和lagrange插值

一.介绍Newton和lagrange插值:给出一组数据进行Newton和lagrange插值,同时将结果用plot呈现出来1.首先是Lagrange插值:根据插值的方法,先对每次的结果求积,在对结果求和,完成插值. 2.newton插值:先要建立差商表,差商表的建立的时候,每次减去的x[0]都是对角的元素,因此需要注意. 二.实现 import matplotlib.pyplot as plt import math # ====================================

NYOJ 178 找规律(Lagrange插值公式)

链接:click here 题意: 描述 大家一定见过这种题目:给你一些数请找出这些数之间的规律,写出下一个满足该规律的数. 比如:2 5 10 17 26,则可以看出这些数符合n*n+1这个通项公式,则下一个数为37. 这种通项公式不只一个,所以答案是不唯一的.但如果已知了N个数,且已知其通项公式是一个次数小于N的多项式,则答案就唯一确定了. 现在给你一个数列,请找出规律并求出其下一个数为多少? 输入 第一行是一个整数T表示测试数据的组数(T<=20) 每组测试数据的第一行是一个整数N(1<

OpenCASCADE Interpolation - Lagrange

OpenCASCADE Interpolation - Lagrange [email protected] Abstract. Power basis polynomial is the most simple polynomial function. It also be called power series. OpenCASCADE provides basic computation functions for polynomial functions, such as evaluat

回归、插值、逼近、拟合的区别

http://blog.sina.com.cn/s/blog_731140ed0101bozs.html 1回归一般指线性回归,是求最小二乘解的过程.在求回归前,已经假设所有型值点同时满足某一曲线方程,计算只要求出该方程的系数 2多项式插值:用一个多项式来近似代替数据列表函数,并要求多项式通过列表函数中给定的数据点.(插值曲线要经过型值点.) 3多项式逼近:为复杂函数寻找近似替代多项式函数,其误差在某种度量意义下最小.(逼近只要求曲线接近型值点,符合型值点趋势.) 4多项式拟合:在插值问题中考虑

非线性方程(组):一维非线性方程(二)插值迭代方法 [MATLAB]

一般而言,方程没有能够普遍求解的silver bullet,但是有几类方程的求解方法已经非常清晰确凿了,比如线性方程.二次方程或一次分式.一次方程可以直接通过四则运算反解出答案,二次方程的求根公式也给出了只需要四则运算和开根号的符号表达式.而一次分式的分子即为一次函数.更多的方程并没有普适的符号表达式,但通过用便于求零点的函数模仿.代替之也可以估计零点的位置.插值方法可以实现这一思路. 插值迭代方法包括割线法.二次插值法等多项式插值方法,反插法以及线性分式插值法等等,其核心是用几个点及其函数值信

[施工中]良心数论.

/* Copyright: xjjppm Author: xjjppm Date: 08-08-17 11:36 Description: Number Theory */ #include <map> #include <cmath> #include <cstdio> #include <cstring> #include <algorithm> inline int input() { char c=getchar();int x=0,a=

数据预处理技术

数据预处理技术数据清理:空缺值处理.格式标准化.异常数据清除.错误纠正.重复数据的清除数据集成:将多个数据源中的数据结合起来并统一存储,建立数据仓库的过程实际上就是数据集成.数据变换:平滑.聚集.规范化.最小 最大规范化等数据归约:维归(删除不相关的属性(维)).数据压缩(PCA,LDA,SVD.小波变换).数值归约(回归和对数线形模型.线形回归.对数线形模型.直方图)数据离散化和概念分层 1.数据清理:格式标准化.异常数据清除.错误纠正.重复数据的清除通过填写空缺值,平滑噪声数据,识别删除孤立

bzoj[2655] calc

Description 一个序列a1,...,an是合法的,当且仅当: 长度为给定的n. a1,...,an都是[1,A]中的整数. a1,...,an互不相等. 一个序列的值定义为它里面所有数的乘积,即a1a2...an. 求所有不同合法序列的值的和. 两个序列不同当且仅当他们任意一位不一样. 输出答案对一个数mod取余的结果. Input 一行3个数,A,n,mod.意义为上面所说的. Output 一行结果. Sample Input 9 7 10007 Sample Output 361

计算方法简介

简介: 计算方法又称“数值分析”.是为各种数学问题的数值解答研究提供最有效的算法. 笔记: 1误差与原则 (1)误差种类:模型误差.观测误差.截断误差和舍入误差. (2)法则: (a)加减运算:近似数加减时,把其中小数位数较多的数四舍五入,使其比小数位数最少的数多一位小数,计算保留的小数位数与原近似数最小数位数最少者相同. (b)乘除运算:近似数乘除时,各因子保留位数应比小数位数最少的数多一位小数,计算保留的小数位数与原近似数最小数位数最少者位数至多少一位. (c)乘方与开方运算:近似数乘方与开