三次样条插值matlab实现
三次样条插值matlab实现
%三次样条差值-matlab通用程序 - zhangxiaolu2015的专栏 - CSDN博客 https://blog.csdn.net/zhangxiaolu2015/article/details/42744823
%【图文】三次样条插值算法详解_百度文库 https://wenku.baidu.com/view/14423f2e1711cc7931b716ae.html与课堂使用PPT一致。
clc
clear
x=input('请按照格式[x1,x2,x3...]格式输入y=f(x)函数已知点的横坐标xi='); %三次样条差值函数
y=input('请按照格式[y1,y2,y3...]格式输入y=f(x)函数已知点对应的纵坐标yi=');
x
y
n=size(x,2); %特别注意,matlab中的矩阵编号是从1开始的,而教材上的矩阵编号是从0开始的,即本程序n比PPT上n值大1
for k=2:n %计算h(i)
h(k-1)=x(k)-x(k-1);
end
for k=1:(n-2) %计算μ和λ
mu(k)=h(k)/(h(k)+h(k+1));
lambda(k)=1-mu(k);
end
mu
lambda
以上无论是M还是m关系式矩阵通用。
for k=1:(n-2)
g(k)=3*(lambda(k)*(y(k+1)-y(k))/h(k)+mu(k)*(y(k+2)-y(k+1))/h(k+1)); %计算g(1)到g(n-2)
end
fprintf('边界条件类型选择:\n1.已知f(a)和f(b)的二阶导数\n2.已知f(a)和f(b)的一阶导数\n3.y=f(x)是以T=b-a为周期的周期函数\n');
1.已知f(a)和f(b)的二阶导数
2.已知f(a)和f(b)的一阶导数
3.y=f(x)是以T=b-a为周期的周期函数
in=input('请输入对应序号:');
if in==1
in
M(1)=input('请输入f(a)的二阶导数值:');
M(n)=input('请输入f(b)的二阶导数值:');
M(1)
M(n)
A=zeros(n,n); %构造追赶法所需的A和b
for k=2:(n-1)
A(k,k)=2;
A(k,k+1)=mu(k-1);
A(k,k-1)=lambda(k-1);
end
A(1,1)=2;
A(1,2)=1;
A(end,end)=2;
A(end,end-1)=1;
A
b=zeros(n,1);
for k=2:(n-1)
b(k,1)=g(k-1);
end
b(1,1)=3*((y(2)-y(1))/h(1)-2*h(1)*M(1));
b(n,1)=3*((y(n)-y(n-1))/h(n-1)+2*h(n-1)*M(n));
b
b=b';
m=zhuigan(A,b); %利用追赶法求解成功,这里的参数b形式应为行向量而非列向量
elseif in==2
y0=input('请输入f(a)的一阶导数值:');
yn=input('请输入f(b)的一阶导数值:');
A=zeros(n-2,n-2); %构造追赶法所需的A和b
for k=2:(n-3)
A(k,k)=2;
A(k,k+1)=mu(k);
A(k,k-1)=lambda(k);
end
A(1,1)=2;
A(1,2)=mu(1);
A(end,end)=2;
A(end,end-1)=lambda(n-2);
b=zeros(n-2,1);
for k=2:(n-3)
b(k,1)=g(k);
end
b(1,1)=g(1)-lambda(1)*y0;
b(end,1)=g(n-2)-mu(n-2)*yn;
b=b';
m=zhuigan(A,b);%利用追赶法求解
m(1)
m(2)
%这里解出m(1)至m(n-2),为能代入带一阶导数的分段三次埃米尔特插值多项式,要对m进行调整
for k=(n-2):-1:1
m(k+1)=m(k);
end
m(1)=y0;
m(n)=yn;
elseif in==3
A=zeros(n,n); %构造追赶法所需的A和b
for k=2:(n-1)
A(k,k)=2;
A(k,k+1)=mu(k-1);
A(k,k-1)=lambda(k-1);
end
A(1,1)=2;
A(1,2)=mu(1);
A(1,end)=lambda(1);
A(end,end)=2;
A(end,end-1)=lambda(n-1);
A(end,1)=mu(n-1);
b=zeros(n-1,1);
for k=1:(n-1)
b(k,1)=d(k+1);
end
N=LU_fenjieqiuxianxingfangcheng(A,b); %利用LU分解求解线性方程组
for k=1:(n-1)
M(k+1)=N(k,1);
end
M(1)=M(n);
else
fprintf('您输入的序号不正确');
end
0.6667 2.0000 0.3333 0
0 0.3333 2.0000 0.6667
0 0 1.0000 2.0000
4.5000
-3.5000
-6.0000
m
%三转角公式
for k=1:(n-1)
clear S1
syms X
S1=(1-2*(X-x(k))/(-h(k)))*((X-x(k+1))/(h(k)))^2*y(k)+...
(X-x(k))*((X-x(k+1))/(h(k)))^2*m(k)+...
(1-2*(X-x(k+1))/(h(k)))*((X-x(k))/(h(k)))^2*y(k+1)+...
(X-x(k+1))*((X-x(k))/(h(k)))^2*m(k+1);
fprintf('当%d=<X=<%d时\n',x(k),x(k+1));
S=expand(S1)
end
$$
\begin{array}{l}
{\rm{S(x)}} = {m_k}(X - {x_k}){\left( {\frac{{X - {x_{k + 1}}}}{{{h_k}}}} \right)^2} + \\
{m_{k + 1}}(X - {x_{k + 1}}){\left( {\frac{{X - {x_k}}}{{{h_k}}}} \right)^2} + \\
{y_k}\left( {1 - - \frac{{2(X - {x_k})}}{{{h_k}}}} \right){\left( {\frac{{X - {x_{k + 1}}}}{{{h_k}}}} \right)^2} + \\
{y_{k + 1}}{\left( {\frac{{X - {x_k}}}{{{h_k}}}} \right)^2}\left( {1 - \frac{{2(X - {x_{k + 1}})}}{{{h_k}}}} \right)
\end{array}
$$
三次样条插值matlab实现的更多相关文章
- 数值计算方法实验之按照按三弯矩方程及追赶法的三次样条插值 (MATLAB 代码)
一.实验目的 在已知f(x),x∈[a,b]的表达式,但函数值不便计算,或不知f(x),x∈[a,b]而又需要给出其在[a,b]上的值时,按插值原则f(xi)= yi(i= 0,1…….,n)求出简单 ...
- java 三次样条插值 画光滑曲线 例子
java 三次样条插值 画光滑曲线 例子 主要是做数值拟合,根据sin函数采点,取得数据后在java中插值并在swing中画出曲线,下面为截图 不光滑和光滑曲线前后对比: 代码: 执行类: p ...
- 三次样条插值 cubic spline interpolation
什么是三次样条插值 插值(interpolation)是在已知部分数据节点(knots)的情况下,求解经过这些已知点的曲线, 然后根据得到的曲线进行未知位置点函数值预测的方法(未知点在上述已知点自变量 ...
- 多项式函数插值:全域多项式插值(一)单项式基插值、拉格朗日插值、牛顿插值 [MATLAB]
全域多项式插值指的是在整个插值区域内形成一个多项式函数作为插值函数.关于多项式插值的基本知识,见“计算基本理论”. 在单项式基插值和牛顿插值形成的表达式中,求该表达式在某一点处的值使用的Horner嵌 ...
- 井眼轨迹的三次样条插值 (vs + QT + coin3d)
井眼轨迹数据的测量值是离散的,根据某些测斜公式,我们可以计算出离散的三维的井眼轨迹坐标,但是真实的井眼轨迹是一条平滑的曲线,这就需要我们对测斜数据进行插值,使井眼轨迹变得平滑,我暂时决定使用三次样条进 ...
- 拉格朗日插值和牛顿插值 matlab
1. 已知函数在下列各点的值为 0.2 0.4 0.6 0.8 1.0 0.98 0.92 0.81 0.64 0.38 用插值法对数据进行拟合,要求给出Lagrange插值多项式和Newto ...
- 拉格朗日插值matlab实现
已给sin0.32=0.314567,sin0.34=0.333487,sin0.36=0.352274,用线性插值及抛物插值计算sin0.3367的值并估计截断误差. 1. 线性插值 clc;cle ...
- 数值计算方法实验之Newton 多项式插值(MATLAB代码)
一.实验目的 在己知f(x),x∈[a,b]的表达式,但函数值不便计算或不知f(x),x∈[a,b]而又需要给出其在[a,b]上的值时,按插值原则f(xi)=yi (i=0,1,……, n)求出简单函 ...
- 平滑算法:三次样条插值(Cubic Spline Interpolation)
https://blog.csdn.net/left_la/article/details/6347373 感谢强大的google翻译. 我从中认识到了航位推算dead reckoning,立方体样条 ...
随机推荐
- android 开发DatePickerDialog/TimePickerDialog对话框的实现
AndroidAPI提供了Dialog对话框控件,DatePickerDialog/TimePickerDialog均是AlertDialog的子类,通过DatePickerDialog/TimePi ...
- Mysql5.7.6安装和主从配置手册
Mysql5.7.6+ 安装手册 linux server版本 1.下载 http://dev.mysql.com/downloads/mysql/#downloads 2. 检查库文件是否存在 ...
- 数学建模大赛-NO.1
数学建模大赛-NO.1 论文精析 近期,在网上各种的收罗,张开了各式各样的捕抓.哈哈… .终于,在一个不经意之间发现了一个巨大无比的宝藏式的网站,此网站网址为:http://cjsxjm.gzsi ...
- label+input实现按钮开关切换效果
label+input实现按钮开关切换效果 <!DOCTYPE html> <html lang="en"> <head> <meta c ...
- Vue.js(2.x)之插值
看了一些友邻写的文章,不少是基于1.0版本的,有些东西在2.x版本应该已经废除了(如属性插值.单次插值在2.x版本上运行根本不执行).对于不理解的东东,找起资料来就更麻烦了.不得不老老实实线下测试并整 ...
- MATLAB之易经卜卦程序+GUI
MATLAB之易经卜卦程序+GUI 日月为易,刚柔相推. 是故易有太极,是生两仪,两仪生四象,四象生八卦,八卦定吉凶,吉凶生大业.是故法象莫大乎天地,变通莫大乎四时,悬象著明莫大乎日月. 本文 ...
- intelij idea相关笔记--持续更新
一.快捷键: Ctrl+F 文件内查找 Ctrl+Shift+F 全局查找 Ctrl+Shift+N 查找文件 Ctrl+Alt+← 返回上一步 Ctrl+Alt+→ 返回下一步 二.编译相关: 如果 ...
- dac verilog ad5601
首先从官网下载数据手册.DAC有串行有并行,ad5601是串行,(需要好多时钟沿的移位内部转换为并行在输出). 按照手册的时序编写程序, 关注下芯片的波特率范围 看看手册的数据传输那些事有效的数据位 ...
- COGS 201. [BYVoid S1] 埃雷萨拉斯的宝藏
★★ 输入文件:eldrethalas.in 输出文件:eldrethalas.out 简单对比时间限制:1 s 内存限制:256 MB 问题描述 一万两千年前,精灵还是在艾萨拉女王的 ...
- HDU1430 BFS + 打表 + 康托展开
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1430 , 一道比较好的题. 这道题要用到很多知识,康托展开.BFS.打表的预处理还要用到一一映射,做完 ...