学习笔记-Matlab算法篇-插值算法

2023-11-09

插值算法

01拉格朗日多项式插值

 

进而得到拉格朗日多项式:

Matlab求解:matlab中没有自带的求解函数,需要自行实现。

function f = Language(x,y,x0)
    syms t;
    if(length(x) == length(y))
        n = length(x);    
    else
        disp('x和y的维数不相等!');
        return;
    end                                      %检错
    f = 0.0;
    for i = 1:n
        l = y(i); 
        for j = 1:i-1
            l = l*(t-x(j))/(x(i)-x(j));      
        end
        for j = i+1:n
            l = l*(t-x(j))/(x(i)-x(j));      %计算拉格朗日基函数
        end
        f = f + l;                           %计算拉格朗日插值函数      
        simplify(f);                         %化简
        if(i==n)
            if(nargin == 3)
                f = subs(f,'t',x0);          %计算插值点的函数值
            else
                f = collect(f);          %将插值多项式展开
                f = vpa(f,6);                %将插值多项式的系数化成6位精度的小数
            end
        end
    end
end

例子(e01):使用拉格朗日多项式插值计算数据

x=-5:0.2:5;
y=-3*x.^2+2*x+x.^3-2;
figure,plot(x,y,'-.b+','linewidth',2);hold on;

x0=2.3;
y0=3*x0+2*x0.^2-x0.^3+2;
tic
yl=Language(x,y,2.3);
toc
fprintf('理论值:%.4f,实际值%.4f\n',y0,yl);
plot(x0,y0,'r*','markersize',12);hold off;

结果:

>> e01
时间已过 35.958879 秒。
理论值:7.3130,实际值-1.1030

02牛顿法插值

进而可得到:

function f = Newton(x,y,x0)
syms t;

if(length(x) == length(y))
    n = length(x);
    c(1:n) = 0.0;
else
    disp('x和y的维数不相等!');
    return;
end

f = y(1);
y1 = 0;
l  = 1;
 
for(i=1:n-1)   
    for(j=i+1:n)
        y1(j) = (y(j)-y(i))/(x(j)-x(i));
    end
    c(i) = y1(i+1);     
    l = l*(t-x(i));  
    f = f + c(i)*l;
    simplify(f);
    y = y1;
    
    if(i==n-1)
        if(nargin == 3)
            f = subs(f,'t',x0);
        else
            f = collect(f);                %将插值多项式展开
            f = vpa(f, 6);
        end
    end
end



x=-5:0.2:5;
y=3*x+2*x.^2-x.^3+2;
figure,plot(x,y,'-.b+','linewidth',2);hold on;

x0=2.3;
y0=3*x0+2*x0.^2-x0.^3+2;
tic
yl=Newton(x,y,2.3);
toc
fprintf('理论值:%.4f,实际值%.4f\n',y0,yl);
plot(x0,y0,'r*','markersize',12);hold off;

结果:

>> e02
时间已过 16.260375 秒。
理论值:7.3130,实际值7.3130

03分段线性插值

Matlab实现:使用函数y=interp1(x,y,x0,’method’)

method 指定插值的方法,默认为线性插值。其值可为:

'nearest' 最近项插值

'linear' 线性插值

'spline' 逐段 3 次样条插值

'cubic' 保凹凸性 3 次插值。

所有的差值方法都要求x0是单调的。

例子(e03):使用分段线性插值计算数据

x=-5:0.2:5;
y=3*x+2*x.^2-3*x.^3+2*x.^4+2;
figure,plot(x,y,'-.b+','linewidth',2);hold on;

x0=2.3;
y0=3*x0+2*x0.^2-x0.^3+2;
tic
yl=interp1(x,y,2.3);
toc
fprintf('理论值:%.4f,实际值%.4f\n',y0,yl);
plot(x0,y0,'r*','markersize',12);hold off;

结果:

>> e03
时间已过 0.025925 秒。
理论值:7.3130,实际值39.3952

 

04埃米尔插值

定义:如果对插值函数,不仅要求它在节点处与函数同值,而且要求它与函数有相同的一阶、二阶甚至更高阶的导数值,这就是 Hermite 插值问题。即:

艾米尔特插值多项式为:

 

Matlab没有现成的Hermite函数,需要手动编写:Hermite

例子(e04):使用艾米尔特插值计算数据

function f = Hermite(x,y,y_1,x0)
syms t;
f = 0.0;

if(length(x) == length(y))
    if(length(y) == length(y_1))
        n = length(x);
    else
        disp('y和y的导数的维数不相等!');
        return;
    end
else
    disp('x和y的维数不相等!');
    return;
end

for i=1:n
    h = 1.0;
    a = 0.0;
    for j=1:n
        if( j ~= i)
            h = h*(t-x(j))^2/((x(i)-x(j))^2);
            a = a + 1/(x(i)-x(j));
        end
    end
    
    f = f + h*((x(i)-t)*(2*a*y(i)-y_1(i))+y(i));
    
    if(i==n)
        if(nargin == 4)
            f = subs(f,'t',x0);
        else
            f = vpa(f,6);
        end
    end
end
x=-5:0.2:5;
y=3*x+5*x.^2-4*x.^3+2*x.^5+2;
figure,plot(x,y,'-.b+','linewidth',2);hold on;

x0=2.3;
y0=3*x0+2*x0.^2-x0.^3+2;
y01=3+4*x0-9*x0.^2-8*x0.^3;
tic
y1=Hermite(x,y,y01,x0);
toc
fprintf('理论值:%.4f,实际值%.4f\n',y0,yl);
plot(x0,y0,'r*','markersize',12);hold off;

结果: 

>> e04
y和y的导数的维数不相等!
时间已过 0.071891 秒。
理论值:7.3130,实际值39.3952

05样条插值 

定义:数学上将具有一定光滑性的分段多项式称为样条函数。

2次样条函数定义:

3次样条函数定义:

Matlab中的3次样条函数:

y=interp1(x0,y0,x,'spline')

y=spline(x0,y0,x)

pp=csape(x0,y0,conds)y=ppval(pp,x)

推荐使用csape函数。

pp=csape(x0,y0):使用默认的边界条件,即 Lagrange 边界条件。pp=csape(x0,y0,conds)中的 conds 指定插值的边界条件,其值可为:

'complete' 边界为一阶导数,即默认的边界条件

'not-a-knot' 非扭结条件

'periodic' 周期条件

'second' 边界为二阶导数,二阶导数的值[0, 0]

'variational' 设置边界的二阶导数值为[0,0]

例子(e05):待加工零件的外形根据工艺要求由一组数据(x,y)给出(在平面情况下),用程控铣床加工时每一刀只能沿 x 方向和 y 方向走非常小的一步,这就需要从已知数据得到加工所要求的步长很小的(x,y)坐标。表中给出的x,y数据位于机翼断面的下轮廓线上,假设需要得到 x 坐标每改变0.1时的y坐标。试完成加工所需数据,画出曲线,并求出x=0处的曲线斜率和13≤x≤15范围内y的最小值。要求用 Lagrange、分段线性和三次样条三种插值方法计算。

0

3

5

7

9

11

12

13

14

15

0

1.2

1.7

2.0

2.1

2.0

1.8

1.2

1.0

1.6

x0=[0 3 5 7 9 11 12 13 14 15];
y0=[0 1.2 1.7 2.0 2.1 2.0 1.8 1.2 1.0 1.6];
x=0:0.1:15;
y1=Language(x0,y0,x); %调用前面编写的Lagrange插值函数
y2=interp1(x0,y0,x);
y3=interp1(x0,y0,x,'spline');
pp1=csape(x0,y0); y4=ppval(pp1,x);
pp2=csape(x0,y0,'second'); y5=ppval(pp2,x);
fprintf('比较一下不同插值方法和边界条件的结果:\n')
fprintf('x y1 y2 y3 y4 y5\n')
xianshi=[x',y1',y2',y3',y4',y5'];
fprintf('%f\t%f\t%f\t%f\t%f\t%f\n',xianshi')
subplot(2,2,1), plot(x0,y0,'+',x,y1), title('Lagrange')
subplot(2,2,2), plot(x0,y0,'+',x,y2), title('Piecewise linear')
subplot(2,2,3), plot(x0,y0,'+',x,y3), title('Spline1')
subplot(2,2,4), plot(x0,y0,'+',x,y4), title('Spline2')
dyx0=ppval(fnder(pp1),x0(1)) %求x=0处的导数
ytemp=y3(131:151);
index=find(ytemp==min(ytemp));
xymin=[x(130+index),ytemp(index)]

%% 结果分析
%可以看出,拉格朗日插值的结果根本不能应用,分段线性插值的光滑性较差(特别
%是在 14 = x 附近弯曲处),建议选用三次样条插值的结果。

结果:

几种插值方法的比较:https://blog.csdn.net/f2157120/article/details/80371214

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习笔记-Matlab算法篇-插值算法 的相关文章

  • GUI设计篇

    一 Matlab GUIDE 在MATLAB的命令行窗口中键入guide可以打开GUIDE 这个命令将打开GUIDE Quick Start对话框 它可以看作是一个简单的GUI应用程序的开发向导 利用它可以使用鼠标方便地在窗体上添加各种各样
  • 离散系统Matlab信号处理

    一 离散时间信号 代码 n 2 7 x 0 2 3 5 6 1 5 7 9 2 subplot 2 1 1 stem n x xlabel n ylabel x n title stem函数绘制离散信号 subplot 2 1 2 plot
  • 学习笔记-Matlab三维绘图

    三维绘图 plot3 x y z t 0 0 05 15 x exp 0 05 t cos 2 t y exp 0 05 t sin 2 t z t figure plot3 x y z xlabel x meters ylabel y m
  • MATLAB画图练习

    这次画一些在数学建模中比较实用的图 掌握了其中的画图技巧 在比赛时改变一些参数就可以套用了 1 画极坐标图 clc clear clf theta 0 0 01 2 pi r 5 cos 10 theta polar theta r 2 画
  • Matlab坐标变换篇

    一 安装Robotics System Toolbox 二 弄懂左乘和右乘 介绍的第一个函数为欧拉 齐次矩阵 左手坐标系下 中指对着自己为x轴 z轴为拇指 T0 eul2tr 0 0 0 基坐标系 Tx transl 5 0 0 xyz T
  • Matlab—频谱分析作图

    clf fs 50 采样频率 每秒钟采样多少个点 N 60 采样点数量 T N fs 采样时间 n 0 N 1 t n fs 时间序列 f n fs N 频率序列 y1 10 sin 2 pi 15 t y2 10 sin 2 pi 20
  • 【MATLAB】MATLAB打开后,提示内部崩溃,直接闪退关闭——解决方法

    问题描述 在第一次安装MATLAB软件时 正常使用 过了一段时间后 突然发现在命令行可以正常使用 但运行编译文件里的程序便会报 MathWorks 崩溃的错误 提示MATLAB遇到了内部问题 需要关闭 结果MATLAB自己闪退结束 解决方法
  • Matlab用exprnd函数生成符合指数分布的随机数矩阵

    考虑Matlab用exprnd函数生成符合指数分布的随机数矩阵 原函数说明 根据说明 exprnd会产生满足要求的指数分布随机数 但是如果产生随机数矩阵 希望应用到仿真中 是否每一行 针对同一用户 同样满足该均值呢 生成随机数矩阵是否行列满
  • 学习笔记-Matlab算法篇-现代优化算法

    现代优化算法 01遗传算法 定义 遗传算法 Genetic Algorithms 简称 GA 是一种基于自然选择原理和自然遗传机制的搜索 寻优 算法 它是模拟自然界中的生命进化机制 在人工系统中实现特定目标的优化 遗传算法的实质是通过群体搜
  • Matlab Simulink 常用快捷操作和功能(1)

    1 快速查找library里面的模块 双击左键 然后输入要查询的模块名称 gt 2 block 和 signal 的命名修改 单击block 显示 修改名字 3 Simulink支持从块参数对话框中创建变量 可以在Simulink中创建MA
  • (每日一练)MATLAB数据拟合

    今天就的学习内容是数据拟合 数据拟合也称为曲线拟合 是一种把现有数据透过数学方法来代入一条数式的表示方式 科学和工程问题可以通过诸如采样 实验等方法获得若干离散的数据 根据这些数据 我们往往希望得到一个连续的函数 也就是曲线 或者更加密集的
  • MATLAB复习

    目录 矩阵 定义矩阵 查找矩阵元素 特殊矩阵 矩阵运算 乘方与点乘 字符串数组 创建字符串 查找字符 字符串转换 创建字符串数组 元胞数组 元胞数组的创建 元胞数组的显示 celldisp 和 cellplot 元胞数组的扩充和收缩 元胞数
  • [FPGA里程碑事件:FPGA技术发展历程]

    FPGA里程碑事件 FPGA技术发展历程 自从FPGA Field Programmable Gate Array 技术问世以来 它已经获得了广泛的应用 并且在各个领域都扮演着重要的角色 FPGA作为一种可编程器件 具有高度的灵活性和可重配
  • matlab求解全局最优(初步介绍)

    这里可以看到全局优化的一些经典算法举例 matlab两个工具箱的比较 最左上角是求解器的选项 可以在此选择不同的算法求解 不同的求解器需要输入的参数也各不相同
  • 学习笔记-Matlab算法篇-差分方程建模

    差分方程建模 01差分方程建模 02蛛网模型 问题提出 在自由竞争的社会中 很多领域会出现循环波动的现象 在经济领域中 可以从自由集市上某种商品的价格变化看到如下现象 在某一时期 商品的上市量大于需求 引起价格下跌 生产者觉得该商品无利可图
  • 基于Matlab的贝叶斯网络优化卷积神经网络结合门控循环单元(CNN-GRU)的预测

    基于Matlab的贝叶斯网络优化卷积神经网络结合门控循环单元 CNN GRU 的预测 在深度学习领域 卷积神经网络 Convolutional Neural Networks CNN 和门控循环单元 Gated Recurrent Unit
  • 基于MATLAB粒子群算法求解单目标优化问题

    基于MATLAB粒子群算法求解单目标优化问题 在实际应用中 优化问题是非常常见的一类问题 而对于单目标优化问题 粒子群算法是目前被广泛采用的一种优化算法 通过对分布在搜索空间中的粒子进行适应度评估和位置调整 粒子群算法可以在较短时间内找到全
  • MATLAB数据预处理之缺失值插补

    文章目录 前言 1 加载原始数据 2 查找缺失值并填充缺失值 总结 2021年4月5日09 51 56更新 2021年5月18日10 46 15更新 2022年10月15日07 25 01更新 参考资料 前言 现实中采集的原始数据不一定满足
  • Matlab中实现图像处理的工作流程

    一 识别流程 Receipt Identification Workflow Working with Images in MATLAB Import display and manipulate color and grayscale i
  • 基于神经网络实现数据自回归多变量预测及MATLAB实现代码

    基于神经网络实现数据自回归多变量预测及MATLAB实现代码 随着科技的不断发展 各种数据都被广泛应用到生产 生活中 而数据预测更是数据分析中重要的一环 在多变量预测领域 神经网络已经逐渐成为研究的热点之一 本文将介绍如何使用NARX NN实

随机推荐

  • 8.7.1 makefile实例——项目中的总makefile

    Linux C程序设计王者归来 第8章构建makefile文件 makefile相当于一种脚本编程语言 用户在编写makefile的过程中可以使用变量 控制结构语句和函数等一般编程语言的特性 同时也可以执行shell指令 makefile诞
  • 2021年前端关注的8个技术趋势

    2020年也过去 我们一起解读一下整个2020年的前端技术的8个技术 并深度分析2021年大前端领域又有哪些顶级技术趋势 你不容错过 2020年注定是不平凡的一年 相信因为疫情很多程序员的工作和生活都受到了一定影响 其实现在前端的技术已经到
  • Minio控制台详细教程

    前言 此文讲解Minio控制台详细教程 可能会涉及到有些知识大家可能不懂情况 需要知道Minio兼容的是AMS S3对象存储服务 需要知道AMS S3对象存储服务是什么 里面涉及的到配置如何去配等等 https docs aws amazo
  • PHP html table下载为excel

    php下载头 header Content type application vnd ms excel header Content Disposition attachment filename test xls header Conte
  • 进程管理与内存管理

    谷歌官网 内存管理概览
  • STM32之RTC

    简介 STM32 的实时时钟 RTC 是一个独立的定时器 STM32 的 RTC 模块拥有一组连续计数的计数器 在相应软件配置下 可提供时钟日历的功能 修改计数器的值可以重新设置系统当前的时间和日期 框图 相关寄存器 控制寄存器 第 0 位
  • 网页的内联框架

    内联 网页里嵌套网页
  • 图解算法 -使用Python 学习笔记(3)

    图解算法 使用Python 学习笔记 3 排序算法 3 1认识排序 用以排序的依据是键 它所含的值被称为 键值 通常键值的数据类型有数值类型 中文字符串以及非中文字符串三种 其中中文字符串用该中文内码 如中文繁体BIG5码 中文简体GB码
  • ConcurrentHashMap面试知识的思维导图整理

    整理自文章https blog csdn net yunzhaji3762 article details 113623168 juc 有关介绍https blog csdn net abaidaye article details 123
  • 小伙伴们,赶紧,免费的视频托管。

    最近 朋友的公司培训频道要上在线视频功能 说自己找了一些行业解决方案 最后对比使用视频托管的方式比较省事 说白了就是省钱呗 挑来挑去 觉得感觉保利威视这家托管服务商的视频播放效果较好 并且功能相对多 比较符合当前项目需求 他在网站上注册的账
  • SpringBoot和Vue跨域问题

    Access to XMLHttpRequest at http localhost 8301 admin vod user info token admin token from origin http localhost 9528 ha
  • gateway 报错 reactor.core.Exceptions$ErrorCallbackNotImplemented

    生产环境好好的 突然前端请求全部跨域 请求 500 gateway 报错 reactor core Exceptions ErrorCallbackNotImplemented java lang IndexOutOfBoundsExcep
  • 困扰我两天的问题:StratifiedShuffleSplit与train_test_split创建的数据集为何训练结果不同?

    困扰我两天的问题 StratifiedShuffleSplit与train test split创建的数据集为何训练结果不同 让人头疼的问题 最近 我在进行卷积模型的分类任务时发现了一个StratifiedShuffleSplit函数的bu
  • js map遍历 修改对象里面的值_js map()处理数组和对象数据

    之前的文章梳理了JS数组与对象属性的遍历方法 本文介绍专门用以遍历并处理数据的map 方法 一 原生map map 是数组的一个方法 它创建一个新数组 其结果是该数组中的每个元素都调用一个提供的函数后返回的结果 map 里面的处理函数接受三
  • 第十章 MyBatis与Spring的整合

    单选题 1 进行MyBatis与Spring的整合配置文件编写时 不包括有 7分 A db properties B applicationContext xml C mybatis config xml D springmvc confi
  • 跨域请求避免OPTIONS请求(预检请求)

    有时候前后端分离域名不一致 会造成跨域请求 而跨域请求有时候会自动发起两次请求 第一次为预检请求 即OPTIONS请求 一般来说使用 application json 的 post 请求是必然会带入OPTIONS请求 OPTIONS请求也被
  • flex布局中align-items 和align-content的区别

    参考资料 http stackoverflow com questions 31250174 css flexbox difference between align items and align content 看了很多翻译的技术文档
  • 王佩丰excel学习笔记(三):第七——十讲

    目录 第七讲 第八讲 第九讲 第十讲 第七讲 excel连接文本 各种基础运算 相对引用与绝对引用 利用 按F4可以快速加美元号 但我电脑不行 函数 sum average rank 要排谁 排名的区域 这节总体简单 第八讲 if 判断条件
  • 自动劫持root密码

    前言 1 暴力破解sshd服务密码 2 自动劫持root密码并转发密码到邮箱 实战 自动劫持root密码并转发密码到邮箱 1 自动劫持root密码 2 把存密码的文件转发到邮箱 上传软件 rz 0x06 openssh 5 9p1 patc
  • 学习笔记-Matlab算法篇-插值算法

    插值算法 01拉格朗日多项式插值 进而得到拉格朗日多项式 Matlab求解 matlab中没有自带的求解函数 需要自行实现 function f Language x y x0 syms t if length x length y n l