Matlab数值计算(多项式插值)

多项式插值问题

拉格朗日插值多项式


例1:在某个化学反应过程中,在有限个时刻t(min),测得生成物浓度y(10^{^{-3}}g/cm^{3})d的数据如下:

t_{i}12346810121416
y_{i}4.006.418.018.799.539.8610.3310.4210.5310.61

在时刻t=5分,t=16.4分时的浓度是多少。
lagrange.m

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

主程序:

x0=[1 2 3 4 6 8 10 12 14 16]; % 给定的x坐标数据点
y0=[4.00 6.41 8.01 8.79 9.53 9.86 10.33 10.42 10.53 10.61]; % 对应的y坐标数据点

x=[1:0.1:16]; % 生成从1到16的步长为0.1的x坐标数据

y=lagrange(x0,y0,x); % 使用拉格朗日插值计算在给定x坐标下的y值

x1=5; % 指定的插值点x1
x2=16.4; % 指定的插值点x2

y1=lagrange(x0,y0,x1); % 在插值点x1处的拉格朗日插值结果
y2=lagrange(x0,y0,x2); % 在插值点x2处的拉格朗日插值结果

plot(x0,y0,'.k','markersize',20) % 绘制原始数据点
hold on
plot(x,y,'-r','markersize',30) % 绘制拉格朗日插值曲线
hold on 
plot(x1,y1,'*b','markersize',8) % 标记插值点x1处的结果
hold on 
plot(x2,y2,'*b','markersize',8) % 标记插值点x2处的结果
legend('原数值点','Lagrange曲线') % 添加图例,说明原数值点和Lagrange曲线

运行效果如下:

例2:已知函数 y=f(x) 的如下离散数据:

x012
y2312
(1)用线性插值求函数在x= 1.5 处的近似值
(2)用二次插值求函数在x= 1.5 处的近似值
(3)将以上信息可视化
% 给定的数据点
x = [0 1 2]; % 给定的x坐标数据点
y = [2 3 12]; % 对应的y坐标数据点

% (1) 线性插值
x_interp = 1.5; % 想要进行插值的x坐标
y_lin_interp = interp1(x, y, x_interp, 'linear'); % 使用interp1函数进行线性插值计算
disp(['(1). 线性插值结果:', num2str(y_lin_interp)]); % 显示线性插值结果

% (2) 二次插值
n = length(x); % 数据点个数
L = zeros(1, n); % 初始化存储拉格朗日基函数的数组
for i = 1:n
    L(i) = prod((x_interp - x([1:i-1,i+1:end]))./(x(i) - x([1:i-1,i+1:end]))); % 计算拉格朗日基函数
end

y_quad_interp = sum(y .* L); % 计算二次插值的结果
disp(['(2). 二次插值结果:', num2str(y_quad_interp)]); % 显示二次插值结果

% 可视化结果
figure;
plot(x, y, 'ro', 'MarkerSize', 8); % 绘制原始数据点
hold on;
plot(x_interp, y_lin_interp, 'bs', 'MarkerSize', 8); % 绘制线性插值结果点
plot(x_interp, y_quad_interp, 'gd', 'MarkerSize', 8); % 绘制二次插值结果点
legend('原始数据点', '线性插值结果', '二次插值结果');
xlabel('x');
ylabel('y');
title('线性插值和二次插值');
grid on;

运行效果:

牛顿插值多项式

用牛顿插值多项式解答上述例2

% 给定的数据点
x = [0 1 2]; % 给定的x坐标数据点
y = [2 3 12]; % 对应的y坐标数据点

% (1) 线性插值
x_interp = 1.5; % 想要进行插值的x坐标
y_lin_interp = interp1(x, y, x_interp, 'linear'); % 使用interp1函数进行线性插值计算
disp(['(1). 线性插值结果:', num2str(y_lin_interp)]); % 显示线性插值结果

% (2) 牛顿插值
n = length(x); % 数据点个数
% 计算差商
f = y;
for i = 2:n
    for j = n:-1:i
        f(j) = (f(j) - f(j-1)) / (x(j) - x(j-i+1));
    end
end

% 使用差商计算插值结果
y_newton_interp = f(n);
for i = n-1:-1:1
    y_newton_interp = f(i) + (x_interp - x(i)) * y_newton_interp;
end
disp(['(2). 牛顿插值结果:', num2str(y_newton_interp)]); % 显示牛顿插值结果

% 可视化结果
figure;
plot(x, y, 'ro', 'MarkerSize', 8); % 绘制原始数据点
hold on;
plot(x_interp, y_lin_interp, 'bs', 'MarkerSize', 8); % 绘制线性插值结果点
plot(x_interp, y_newton_interp, 'gd', 'MarkerSize', 8); % 绘制牛顿插值结果点
legend('原始数据点', '线性插值结果', '牛顿插值结果');
xlabel('x');
ylabel('y');
title('线性插值和牛顿插值');
grid on;

运行结果:

分段线性插值多项式

例3:已知数据

01234
21435

用分段线性插值多项式求x=1.5的近似值

% 给定的数据点
x = [0 1 2 3 4]; % 给定的x坐标数据点
y = [2 1 4 3 5]; % 对应的y坐标数据点

% 想要进行插值的x坐标
x_interp = 1.5;

% 寻找 x_interp 所在的区间
index = find(x <= x_interp, 1, 'last');

% 计算分段线性插值
if index < length(x)
    x_left = x(index);
    x_right = x(index + 1);
    y_left = y(index);
    y_right = y(index + 1);
    
    y_interp = y_left + (y_right - y_left) / (x_right - x_left) * (x_interp - x_left);
else
    y_interp = y(end);
end

disp(['分段线性插值结果:', num2str(y_interp)]); % 显示分段线性插值结果

% 可视化结果
figure;
plot(x, y, 'ro', 'MarkerSize', 8); % 绘制原始数据点
hold on;
plot(x_interp, y_interp, 'bs', 'MarkerSize', 8); % 绘制插值点
legend('原始数据点', '插值点');
xlabel('x');
ylabel('y');
title('分段线性插值');
grid on;

运行结果:

三次样条插值

用三次样条插值解决上述例3

% 给定的数据点
x = [0 1 2 3 4]; % 给定的x坐标数据点
y = [2 1 4 3 5]; % 对应的y坐标数据点

% 使用三次样条插值
pp = spline(x, [0 y 0]); % 在端点处增加0值,进行自然边界条件插值

% 想要进行插值的x坐标
x_interp = 1.5;

% 计算插值结果
y_interp = ppval(pp, x_interp);

disp(['三次样条插值结果:', num2str(y_interp)]); % 显示三次样条插值结果

% 可视化结果
xx = linspace(0, 4, 100); % 生成更密集的x坐标
yy = ppval(pp, xx);
figure;
plot(x, y, 'ro', 'MarkerSize', 8); % 绘制原始数据点
hold on;
plot(xx, yy, 'b-'); % 绘制插值曲线
legend('原始数据点', '三次样条插值曲线');
xlabel('x');
ylabel('y');
title('三次样条插值');
grid on;

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/434796.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开发者如何选择代码签名证书?

代码签名证书是一种由权威认证机构颁发的数字证书&#xff0c;它允许软件开发者对其代码进行数字签名。这种签名基于公钥基础设施&#xff08;PKI&#xff09;技术&#xff0c;使用一对密钥&#xff1a;一个私钥和一个公钥。私钥用于生成签名&#xff0c;而公钥则嵌入到代码签名…

微信小程序开发:页面分享卡片、风格选择、通道启用等可配置

上文说到&#xff0c;我们部署了定时任务&#xff0c;但是有个地方忘记在上文写了&#xff0c;这里补上&#xff0c;就是定时任务的超时时间问题&#xff0c;超时时间有7200秒&#xff1a; 我们改成7100秒&#xff1a; 再把云函数调用的云对象的超时时间也改下&#xff1a; 超时…

20240306作业

1.编写一个伪终端&#xff1a;在真正的终端上运行这个伪终端程序之后&#xff0c;能够执行所有的shell指令&#xff0c;甚至再次运行自己 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h…

Vue3.2 + vue/cli-service 打包 chunk-vendors.js 文件过大导致页面加载缓慢解决方案

chunk-vendors.js 是/node_modules 目录下的所有模块打包成的包&#xff0c; 但是这包太大导致页面加载很慢&#xff08;我的都要3-4秒了&#xff09;&#xff0c; 这个时候就会出现白屏的情况 解决方案 1、compression-webpack-plugin 插件解决方案 1&#xff09;、安装 npm …

Docker数据卷篇

1. 数据卷&#xff08;容器数据管理&#xff09; 引言&#xff1a;在之前的nginx案例中&#xff0c;修改nginx的html页面时&#xff0c;需要进入nginx内部。并且因为没有编辑器&#xff0c;修改文件也很麻烦。 这就是因为容器与数据&#xff08;容器内文件&#xff09;耦合带…

用位运算维护状态码,同事直呼牛X!

位运算是一种非常高效的运算方式。在算法考察中比较常见&#xff0c;它使用位级别的操作来表示和控制状态&#xff0c;这在管理多个布尔标志或状态时尤其有用。那么业务代码中我们如何使用位运算呢&#xff1f; 位运算基础 我们先来回顾一下位运算的基础&#xff1a; 与&…

领到了腾讯云服务器红包,可以用于购买服务器,开心!

在2024年腾讯云新春采购节优惠活动上&#xff0c;可以领取新年惊喜红包&#xff0c;打开活动链接 https://curl.qcloud.com/oRMoSucP 会自动弹出红包领取窗口&#xff0c;如下图&#xff1a; 腾讯云2024新春采购节红包领取 如上图所示&#xff0c;点击“领”红包&#xff0c;每…

腾讯云十大优惠活动曝光,TOP10值得买云服务器配置报价

腾讯云服务器多少钱一年&#xff1f;61元一年起&#xff0c;2核2G3M配置&#xff0c;腾讯云2核4G5M轻量应用服务器165元一年、756元3年&#xff0c;4核16G12M服务器32元1个月、312元一年&#xff0c;8核32G22M服务器115元1个月、345元3个月&#xff0c;腾讯云服务器网txyfwq.co…

python爬虫(一)

一、python中的NumPy模块&#xff08;数据的存储和处理&#xff09; 这里是下载完成之后的表现 &#xff08;1&#xff09;创建数组 1、使用array&#xff08;&#xff09;函数创建数组 使用array函数可以创建任意维度的的数组 下面是一个创建二维数组的代码示例 下面是代码…

L1-096 谁管谁叫爹分数

L1-096 谁管谁叫爹 分数 20 全屏浏览 切换布局 作者 陈越 单位 浙江大学 《咱俩谁管谁叫爹》是网上一首搞笑饶舌歌曲&#xff0c;来源于东北酒桌上的助兴游戏。现在我们把这个游戏的难度拔高一点&#xff0c;多耗一些智商。 不妨设游戏中的两个人为 A 和 B。游戏开始后&…

使用统一功能完善图书管理系统

目录 一、前提 二、实现强制登陆传统方式 三、拦截器 1、概念 2、拦截器 &#xff08;1&#xff09;定义拦截器 &#xff08;2&#xff09;注册拦截器 &#xff08;3&#xff09;运行 3、使用拦截器实现强制登陆 4、DispatcherServlet源码解析 四、适配器模式 1、适…

Postman 接口自动化测试教程:入门介绍和从 0 到 1 搭建 Postman 接口自动化测试项目

关于Postman接口自动化测试的导引&#xff0c;全面介绍入门基础和从零开始搭建项目的步骤。学习如何有效地使用Postman进行API测试&#xff0c;了解项目搭建的基础结构、环境设置和测试用例的编写。无论您是新手还是经验丰富的测试人员&#xff0c;这篇教程都将为您提供清晰的指…

IIC 接口

IIC 接口 IIC总线概述IIC总线简介IIC总线通信过程IIC总线寻址方式 IIC总线信号实现起始信号、停止信号字节传送与应答同步信号 IIC典型时序 IIC总线概述 IIC总线简介 IIC总线是Philips公司在八十年代初推出的一种串行、半双工总线&#xff0c;主要用于近距离、低速的芯片之间…

SpringBoot集成图数据库neo4j实现简单的关联图谱

社交领域&#xff1a;Facebook, Twitter&#xff0c;Linkedin用它来管理社交关系&#xff0c;实现好友推荐 图数据库neo4j安装&#xff1a; 下载镜像&#xff1a;docker pull neo4j:3.5.0运行容器&#xff1a;docker run -d -p 7474:7474 -p 7687:7687 --name neo4j-3.5.0 ne…

信息熵、KL散度、交叉熵、互信息、点互信息

信息熵 信息量 信息量是对信息的度量&#xff0c;衡量事件的不确定性&#xff0c;越小概率的事件发生了产生的信息量越大。我们应该用什么形式的函数表达信息量呢&#xff1f;除了随着概率增大而减少&#xff0c;这个函数还有具有以下性质&#xff1a; 如果有两个事件x和y彼…

云消息队列 Confluent 版正式上线!

作者&#xff1a;阿里云消息队列 前言 在 2023 年杭州云栖大会上&#xff0c;Confluent 成为阿里云技术合作伙伴&#xff0c;在此基础上&#xff0c;双方展开了深度合作&#xff0c;并在今天&#xff08;3月1日&#xff09;正式上线“云消息队列 Confluent 版”。 通过将 Co…

vue3学习(续篇)

vue3学习(续篇) 默认有vue3基础并有一定python编程经验。 chrome浏览器安装vue.js devtools拓展。 文章目录 vue3学习(续篇)1. element-ui使用2. axios 网络请求1. 简介2. 操作 3. flask-cors解决跨域问题1. 简介2. 操作 4. 前端路由 vue-router1. 简单使用2. 配置路径别名和…

基于远程NDIS的Internet共享设备驱动出现感叹号(Windows 仍在设置此设备的类配置 代码 56)解决办法

USB共享网络出现了RNDIS/MBIM设备驱动显示感叹号&#xff08;Windows 仍在设置此设备的类配置。 (代码 56)&#xff09;的情况的解决办法&#xff1a; 1.设置中搜索安全模式/更改高级启动选项->立即重新启动 2.重启后界面中选择疑难解答->高级选项->启动设置->屏…

触发HTTP preflight预检及跨域的处理方法

最近在做需求的过程中&#xff0c;遇到了很多跨域和HTTP预检的问题。下面对我所遇到过的HTTP preflight和跨域的相关问题进行总结&#xff1a; 哪些情况会触发HTTP preflight preflight属于cors规范的一部分&#xff0c;在有跨域的时候&#xff0c;在一定情况下会触发preflig…

迭代的 CKKS 高精度自举

参考文献&#xff1a; [KDE23] Kim A, Deryabin M, Eom J, et al. General bootstrapping approach for RLWE-based homomorphic encryption[J]. IEEE Transactions on Computers, 2023.[BCC22] Bae Y, Cheon J H, Cho W, et al. Meta-bts: Bootstrap** precision beyond the …