拉格朗日插值matlab实现
已给sin0.32=0.314567,sin0.34=0.333487,sin0.36=0.352274,用线性插值及抛物插值计算sin0.3367的值并估计截断误差。
1. 线性插值
clc;clear;
y=sin_L(0.32,0.314567,0.34,0.333487,0.3367);
function y=sin_L(x0,y0,x1,y1,x)
% sin_L输出sin(x)使用线性插值计算得到的函数值
% 例如: y=sin_L(0.32,0.314567,0.34,0.333487,0.3367)
% y =
% 0.3304
% R =
% 9.1892e-06 % 以下为判断输入值是否合法的代码
if nargin~= %nargin表示number of function input arguments,判断函数输入参数的个数
error('请输入一次插值的2个插值节点和待插值点')
end
if ~( isnumeric(x0)&&isnumeric(y0)&&isnumeric(x1)&&isnumeric(y1)&&isnumeric(x) ) %isnumeric()检测字符串是否只由数字组成,如果字符串中只包括数字,就返回Ture,否则返回False。
error('输入参数必须是数')
end % 核心计算的代码
%y=y0+(y1-y0)*(x-x0)/(x1-x0);%已知一次多项式,即直线上两点,可以用点斜式写出直线
y=y0*(x-x1)/(x0-x1)+y1*(x-x0)/(x1-x0); %两点式
% 以下为求解截断误差的代码
syms M2; % 因为sin(x)的二阶导数是本身,所以只需要挑出最大的y值,即可得到M2 %syms函数用于创建符号对象
if y0>y1
M2=y0;
else
M2=y1;
end
R=M2*abs((x-x0)*(x-x1))/;
disp(['插值结果是:y=',num2str(y)]);
disp(['最大误差是:R=',num2str(R)]);
end
2. 抛物插值
clc;clear;
%y1=sin_L(0.32,0.314567,0.34,0.333487,0.3367);%一次性插值
y2=sin_T(0.32,0.314567,0.34,0.333487,0.36,0.352274,0.3367)%二次抛物插值
function y=sin_L(x0,y0,x1,y1,x)
% sin_L输出sin(x)使用线性插值计算得到的函数值
% 例如: y=sin_L(0.32,0.314567,0.34,0.333487,0.3367)
% y =
% 0.3304
% R =
% 9.1892e-06 % 以下为判断输入值是否合法的代码
if nargin~= %nargin表示number of function input arguments,判断函数输入参数的个数
error('请输入一次插值的2个插值节点和待插值点')
end
if ~( isnumeric(x0)&&isnumeric(y0)&&isnumeric(x1)&&isnumeric(y1)&&isnumeric(x) ) %isnumeric()检测字符串是否只由数字组成,如果字符串中只包括数字,就返回Ture,否则返回False。
error('输入参数必须是数')
end % 核心计算的代码
%y=y0+(y1-y0)*(x-x0)/(x1-x0);%已知一次多项式,即直线上两点,可以用点斜式写出直线
y=y0*(x-x1)/(x0-x1)+y1*(x-x0)/(x1-x0); %两点式
% 以下为求解截断误差的代码
syms M2; % 因为sin(x)的二阶导数是本身,所以只需要挑出最大的y值,即可得到M2 %syms函数用于创建符号对象
if y0>y1
M2=y0;
else
M2=y1;
end
R=M2*abs((x-x0)*(x-x1))/;
disp(['插值结果是:y=',num2str(y)]);
disp(['最大误差是:R=',num2str(R)]);
end function y=sin_T(x0,y0,x1,y1,x2,y2,x)
% sin_T输出sin(x)使用抛物插值计算得到的函数值
% 例如: y=sin_T(0.32,0.314567,0.34,0.333487,0.36,0.352274,0.3367)
% y =
% 0.3304
% R =
% 2.0315e-07 % 以下为判断输入值是否合法的代码
if nargin~=
error('请输入线性插值的插值节点和插值点')
end
if ~( isnumeric(x0)&&isnumeric(y0)&&isnumeric(x1)&&isnumeric(y1)&&isnumeric(x2)&&isnumeric(y2)&&isnumeric(x) )
error('输入参数必须是数')
end % 核心计算的代码
y=y0*(x-x1)*(x-x2)/((x0-x1)*(x0-x2))+y1*(x-x0)*(x-x2)/((x1-x0)*(x1-x2))+y2*(x-x0)*(x-x1)/((x2-x0)*(x2-x1)); %{
% 以下为求解截断误差的代码
y_0=cos(x0); % 因为sin(x)的三阶导数是cos(x),那么只要求出x0,x1,x2的cos值,然后去最大即可得到M3
y_1=cos(x1);
y_2=cos(x2);
syms M3;
if y_0>y_1
M3=y_0;
else
M3=y_1;
end
if y_2>M3
M3=y_2;
end
R=M3*abs((x-x0)*(x-x1)*(x-x2))/
end
%} % 以下为求解截断误差的代码
%sysm M3;
M3=cos(x0);%因为在第一象限,cosx是减函数,所以节点处的最大值在第一个节点那里取得
R=M3*abs((x-x0)*(x-x1)*(x-x2))/
end
参考来源:https://blog.csdn.net/m0_37395228/article/details/80874393
五,优点和缺点
拉格朗日插值法的公式结构整齐紧凑,在理论分析中十分方便,然而在计算中,当插值点增加或减少一个时,所对应的基本多项式就需要全部重新计算,于是整个公式都会变化,非常繁琐。这时可以用重心拉格朗日插值法或牛顿插值法来代替。此外,当插值点比较多的时候,拉格朗日插值多项式的次数可能会很高,因此具有数值不稳定的特点,也就是说尽管在已知的几个点取到给定的数值,但在附近却会和“实际上”的值之间有很大的偏差。这类现象也被称为龙格现象,解决的办法是分段用较低次数的插值多项式。(https://www.cnblogs.com/fengzhiyuan/p/8645246.html)
拉格朗日插值matlab实现的更多相关文章
- 多项式函数插值:全域多项式插值(一)单项式基插值、拉格朗日插值、牛顿插值 [MATLAB]
全域多项式插值指的是在整个插值区域内形成一个多项式函数作为插值函数.关于多项式插值的基本知识,见“计算基本理论”. 在单项式基插值和牛顿插值形成的表达式中,求该表达式在某一点处的值使用的Horner嵌 ...
- 【matlab】 拉格朗日插值
第一个函数 "lagrange1.m" 输入:X Y 与点x0 输出:插值函数对应函数值 y0 function y = lagrange1(X,Y,x0) n = length ...
- 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 fo ...
- 常系数齐次线性递推 & 拉格朗日插值
常系数齐次线性递推 具体记在笔记本上了,以后可能补照片,这里稍微写一下,主要贴代码. 概述 形式: \[ h_n = a_1 h_{n-1}+a_2h_{n-2}+...+a_kh_{n-k} \] ...
- 快速排序 and 拉格朗日插值查找
private static void QuictSort(int[] zu, int left, int right) { if (left < right) { ; ; ]; while ( ...
- BZOJ3601 一个人的数论 莫比乌斯反演、高斯消元/拉格朗日插值
传送门 题面图片真是大到离谱-- 题目要求的是 \(\begin{align*}\sum\limits_{i=1}^N i^d[gcd(i,n) == 1] &= \sum\limits_{i ...
- 【XSY1537】五颜六色的幻想乡 数学 生成树计数 拉格朗日插值
题目大意 有一个\(n\)个点\(m\)条边的图,每条边有一种颜色\(c_i\in\{1,2,3\}\),求所有的包括\(i\)条颜色为\(1\)的边,\(j\)条颜色为\(2\)的边,\(k\) ...
- 【BZOJ2655】calc DP 数学 拉格朗日插值
题目大意 一个序列\(a_1,\ldots,a_n\)是合法的,当且仅当: 长度为给定的\(n\). \(a_1,\ldots,a_n\)都是\([1,m]\)中的整数. \(a_1, ...
- 【Luogu4781】【模板】拉格朗日插值
[Luogu4781][模板]拉格朗日插值 题面 洛谷 题解 套个公式就好 #include<cstdio> #define ll long long #define MOD 998244 ...
随机推荐
- 【vim小小记】vim的复制粘贴(包括系统剪贴板)
1.vim常用复制粘贴命令 Vim的复制粘贴命令无疑是y (yank),p(paster),加上yy,P PS: vim有个很有意思的约定(我觉得是一种约定),就是某个命令的大小写都是实现某种功能,只 ...
- 【剑指offer】面试题 18. 删除链表的节点
面试题 18. 删除链表的节点
- XShell上传、下载本地文件到linux服务器
Python之道发表于程序员八阿哥订阅 1.2K 腾讯云服务器 年付3折起 首次购买云服务器 最低3折起 超高性价比 限时抢购 Xshell很好用,然后有时候想在windows和linux上传或下载某 ...
- ASP.NET MVC请求参数字符串之区分空与NULL
开发中经常会写增删改查的功能,这里记录下在更新操作时遇到的一个问题. 假设一个模型对应数据库中某一张表,在更新时便需要区分是一次性更新全部字段还是仅更新部分字段.希望能做到传递某个参数时便更新,未传递 ...
- ByteArray、16进制、字符串之间的转换
ByteArray.16进制.字符串之间的转换: package fengzi.convert { import flash.utils.ByteArray; public class ByteArr ...
- SpringBoot 返回Json实体类属性大小写问题
今天碰到的问题,当时找了半天为啥前台传参后台却接收不到,原来是返回的时候返回小写,但是前台依旧大写传参. 查了很多后发现其实是json返回的时候把首字母变小写了,也就是Spring Boot中Jack ...
- 2.NioEventLoop的创建
NioEventLoop的创建 NioEventLoop是netty及其重要的组成部件,它的首要职责就是为注册在它上的channels服务,发现这些channels上发生的新连接.读写等I/O事件,然 ...
- java 堆 排序学习
/** * <html> * <body> * <P> Copyright 1994 JsonInternational</p> * <p> ...
- Spring主要用到两种设计模式
Spring主要用到两种设计模式 1.工厂模式 Spring容器就是实例化和管理全部Bean的工厂. 工厂模式可以将Java对象的调用者从被调用者的实现逻辑中分离出来. 调用者只关心被调用者必须满足的 ...
- Excel默认去除开头的0
用户反映打开的.xls文档打开时,excel会默认把某些以0开头零件号去零,导致数据丢失. 解决办法: 先用记事本打开,然后把EXCEL的单元格格式设为文本格式,再把数据复制过去就可以了. 或者先打开 ...