插值方法

news/2024/10/11 19:44:13

插值是什么

在工程中,我们经常要用一条曲线将一些点依次连接起来,称为插值。

插值的可行性证明

插值法定理:对n+1个不同的节点有唯一多项式\(\phi (x)=a_0+a_1x+\cdots+a_nx^n\),使得\(\phi_n(x_j)=y_j(j=0,1,2,\cdots,n)\)

证明:将\(x_0\)\(x_n\)带入多项式能得到一个线性方程组,AX=Y.其中A中元素为\(x_i\),X中为\(a_i\),Y中为\(y_i\).

A的形式是一个范德蒙行列式,一定可逆,所以线性方程有解,多项式一定存在。

插值函数

已知n+1个点\((x_i,y_i) (i=0,1,\cdots,n)\)下面讲各种插值函数。

分段线性插值函数

简单说就是将相邻的点两两用直线连接起来,如此形成一条折线,折线的方程为\(I_n(x)=\sum_{i=0}^ny_i l_i(x)\),满足\(I_n(x_i)=y_i\)其中

\(l_i(x)=\left\{ \begin{matrix} \frac{x-x_{i-1}}{x_i-x_{i-1}},x\in [x_{i-1},x_i], i\neq 0 \\ \frac{x-x_{i+1}}{x_i-x_{i+1}},x\in [x_{i},x_{i+1}], i\neq n \\ 0, 其他 \end{matrix} \right.\)

相当于是在求每个点的y值时将前面的点累加起来。

拉格朗日插值

\(L_n(x)=\sum_{i=0}^ny_i l_i(x)=\sum_{i=0}^ny_i(\prod_{j=0,j\neq i}^n \frac{x-x_j}{x_i-x_j})\)
对于每一个\(x_i,都有l_i(x_i)\neq 0, l_j(x_i)=0 (j\neq i)\).
这样求\(I_n(x_i)=y_i\).

function y=lagrange(x0,y0,x)
%x0,y0为节点
%x是插值点
n = length(x0);m = length(x);for i = 1:mz = x(i);s = 0.0;for k = 1:np = 1.0;for j = 1:nif j ~= kp = p * (z - x0(j)) / (x0(k) - x0(j));endends = p*y0(k)+s;endy(i)=s;end

牛顿插值

拉格朗日插值法中存在的“增加一个节点时整个计算工作重新开始”的问题。
牛顿插值法是拉格朗日插值法的改进方法,运用迭代的思路求函数,且可以节省乘除法运算次数, 同时在Newton插值多项式中用到差分与差商等概念,又与数值计算的其他方面有密切的关系。

function [A,y]= newtonzi(X,Y,x)
%   Newton插值函数
%   X为已知数据点的x坐标
%   Y为已知数据点的y坐标
%   x为插值点的x坐标
%   函数返回A差商表
%   y为各插值点函数值
n=length(X); m=length(x);
for t=1:mz=x(t); A=zeros(n,n);A(:,1)=Y';s=0.0; y=0.0; c1=1.0;for  j=2:nfor i=j:nA(i,j)=(A(i,j-1)- A(i-1,j-1))/(X(i)-X(i-j+1));endendC=A(n,n);for k=1:np=1.0;for j=1:k-1p=p*(z-X(j));ends=s+A(k,k)*p;endss(t)=s;
endy=ss;A=[X',A];
end

Hermite插值法

牛顿和拉格朗日插值法都有一些缺陷,它们只考虑了给出的点的拟合特性,没有考虑原函数的其他性质如导数与原函数是否适配。
有时候我们需要插值函数与原函数不仅需要一阶导数相同,还需要更高阶。
设原函数的导数为m(i),插值函数为H_i. 则Hermite函数满足
\(\left\{ \begin{matrix} H(x_i)=y_i\\ H'(x_i)=m_i \end{matrix} \right.\)
具体算法见:https://blog.csdn.net/SanyHo/article/details/106849323
下面给出代码.

function f = Hermite( x,y,y_1,x0 )
%Hermite插值函数
%   x为已知数据点的x坐标
%   y为已知数据点的y坐标
%   y_1为数据点y值导数
%   x0为插值点的x坐标
syms t;
f = 0.0;
if(length(x) == length(y))if(length(x) == length(y_1))n = length(x);elsedisp('y和y的导数维数不相等');renturn;end
elsedisp('x和y的维数不相等');return;
end
%以上为输入判断和确定“n”的值
for i = 1:nh =  1.0;a =  0.0;for j = 1:nif(j ~= i)h = h*(t-x(j))^2/((x(i)-x(j))^2);%求得值为(li(x))^2a = a + 1/(x(i)-x(j));   %求得ai(x)表达式之中的累加部分endendf = 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);  %输出结果elsef = vpa(f,6);  %输出精度为有效数字为6位的函数表达式endend
end

样条插值

给定区间[a,b]的一个划分
\(\Delta :a=x_0<x_1<\cdots <x_{n-1}<x_n=b\)
如果S(x)满足:

  1. 在每一个小区间上[\(x_i,x_{i+1}\)],S(x)为m次多项式
  2. 它有m-1阶连续导数。

则S(x)为m次样条函数。
计算比较繁琐,就不详细说了,感兴趣看https://blog.csdn.net/qq_41035283/article/details/121459043

https://blog.csdn.net/qq_41035283/article/details/121459043

% 定义三次样条函数的系数矩阵、插值宽度、差商表、g值和M值
function [D,h,A,g,M]=threesimple(X,Y)
% X: 已知的插值节点数组
% Y: 插值节点对应的函数值数组n = length(X); % 计算插值节点的数量A = zeros(n,n); % 初始化差商表为n*n的零矩阵A(:,1) = Y'; % 第一列填充插值点的函数值D = zeros(n-2,n-2); % 初始化系数矩阵D为(n-2)*(n-2)的零矩阵g = zeros(n-2,1); % 初始化g值为(n-2)*1的零向量% 构建差商表Afor j = 2:nfor i = j:nA(i,j) = (A(i,j-1) - A(i-1,j-1)) / (X(i) - X(i-j+1));endend% 计算插值宽度hfor i = 1:n-1h(i) = X(i+1) - X(i);end% 构建系数矩阵D和初始化g值for i = 1:n-2D(i,i) = 2;g(i) = (6 / (h(i+1) + h(i))) * (A(i+2,2) - A(i+1,2));end% 填充D矩阵的非对角线元素for i = 2:n-2u(i) = h(i) / (h(i) + h(i+1));n(i-1) = h(i) / (h(i-1) + h(i));D(i-1,i) = n(i-1);D(i,i-1) = u(i);end% 解线性方程组求解M值M = D \\ g;M = [0; M; 0]; % 边界条件,M的首尾元素设为0end% 定义三次样条插值函数
function s = threesimple1(X,Y,x)
% X: 已知的插值节点数组
% Y: 插值节点对应的函数值数组
% x: 需要计算插值值的点[D,h,A,g,M] = threesimple(X,Y); % 调用threesimple函数计算相关参数n = length(X); % 插值节点的数量m = length(x); % 需要计算插值值的点的数量% 计算每个插值点的函数值for t = 1:mfor i = 1:n-1if (x(t) <= X(i+1)) && (x(t) >= X(i))% 计算三次样条插值公式的各个部分p1 = M(i,1) * (X(i+1) - x(t)) ** 3 / (6 * h(i));p2 = M(i+1,1) * (x(t) - X(i)) ** 3 / (6 * h(i));p3 = (A(i,1) - M(i,1) / 6 * (h(i) ** 2)) * (X(i+1) - x(t)) / h(i);p4 = (A(i+1,1) - M(i+1,1) / 6 * (h(i) ** 2)) * (x(t) - X(i)) / h(i);s(t) = p1 + p2 + p3 + p4; % 计算插值点的函数值break; % 找到对应的区间后跳出循环elses(t) = 0; % 如果x不在X的范围内,插值结果为0endendend
end

matlab 工具包(香)

matlab有非常多的插值函数,详见官方文档:插值 - MATLAB & Simulink - MathWorks 中国

下面是一些例子。

三次Hermite插值法

p = pchip(x,y,new_x)

三次样条插值

p = spline(x,y,new_x)

n维插值
2维为例,函数为二元函数

p = interp2(x,y,z,new_x,new_y,method)
%method具体有 'linear','cublic','spline','nearest'
%x,y需要写成网格形式, [x,y] = meshgrid(x,y)

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

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

相关文章

5.4求解非凸非线性规划

import numpy as np from scipy.optimize import minimize# 定义目标函数 def objective(x):return -np.sum(np.sqrt(x)) # 注意:scipy的minimize默认是最小化问题,所以这里取负号# 定义约束条件 constraints = [{type: ineq, fun: lambda x: 10 - x[0]}, # x[0] <= 10{…

CentOS系统安全配置

一、账户安全及权限 禁用root以外的超级用户禁用root以外的超级用户 1.检测方法:点击查看代码 cat /etc/passwd 查看口令文件,文件格式如下 login_name:password:user_ID:group_ID:comment:home_dir:command 若user_ID=0,则该用户拥有超级用户的权限。查看此处是否有多…

基于最小二乘递推算法的系统参数辨识matlab仿真

1.程序功能描述 基于最小二乘递推算法的系统参数辨识。对系统的参数a1,b1,a2,b2分别进行估计,计算估计误差以及估计收敛曲线,然后对比不同信噪比下的估计误差。 2.测试软件版本以及运行结果展示MATLAB2022a版本运行 3.核心程序for i=(LEN0+4):LENz(i,1)=-A1*z(i-1,1)…

快乐数学7数学常数e

7 数学常数e 亦称自然常数、自然底数,或是欧拉数(Eulers number),是无理数的数学常数,以瑞士数学家欧拉命名;还有个较少见的名字纳皮尔常数,用来纪念苏格兰数学家约翰纳皮尔引进对数。它是一个无限不循环小数,数值约是(小数点后20位,https://oeis.org/A001113):7.1…

使用e【charts报错】

错误代码 <template><h1>home</h1><div id="main" style="width: 600px;height:400px;"></div> </template><script setup> import {onMounted} from vue; import * as echarts from echarts; // 确保正确导入 …

10.11 模拟赛(云智计划 模拟测#26)

S---【云智计划】---6月23日---模拟测#26 div1【补题】 - 比赛 - 梦熊联盟 (mna.wang) S---【云智计划】---6月23日---模拟测#26 div2【补题】 - 比赛 - 梦熊联盟 (mna.wang) 复盘 A。看到 \(n\) 为偶数思路秒出。10min 过样例。 B。好像不太会做啊。模拟了样例 2,猜出了一个很…

1.网页制作(✓)

2024年国庆期间,窝在宿舍七天,就把我之前和同学合伙做的红色网页修改上传到Github,感觉还行,🤣🤣🤣 复习回顾html,css,javascript的一些相关前端技术,做的过程中,感谢chatGPT。问了一堆问题,感谢有你,(❁◡`❁)ヾ(≧▽≦*)o

能让所有人都看懂的架构图

一、引言在当今复杂的技术和业务环境中,架构图成为了沟通和理解系统结构的重要工具。无论是软件开发、企业架构规划还是项目管理,架构图都扮演着关键的角色。然而,很多时候我们会发现,一些架构图让人摸不着头脑,难以理解其真正的含义和意图。那么,如何设计出能让所有人都…