三次样条插值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,立方体样条 ...
随机推荐
- asp.net MVC 中枚举创建下拉列表?
我将尝试使用 Html.DropDownList 扩展方法,但不能找出如何使用它的枚举. 让我们说我有一个这样的枚举: public enum ItemTypes { Movie = 1, Game ...
- AnyCAD在医疗中的应用
void addPoint(List<float> buffer, Vector3 pt) { buffer.Add((float)pt.X); buffer.Add((float)pt. ...
- Javascript学习笔记-一些关键点
Javascript学习笔记-一些关键点 Table of Contents 1. 调试 2. == vs === 3. 两种函数声明 4. 技术感悟 1 调试 现在的主流浏览器都提供了开发者模式,可 ...
- Js/Jquery获取input file的文件名
html代码: <input type="file" name="file" id="file" class="in ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:11.定制化Log输出
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 前言 在<迷你微信>服务器中,我们用了Log4J来进行输出,这可以在我们程序出现异常的时候找到错误发生时 ...
- 合理设置apache的最大连接数
手头有一个网站在线人数增多,访问时很慢.初步认为是服务器资源不足了,但经反复测试,一旦连接上,不断点击同一个页面上不同的链接,都能迅速打开,这种现象就是说明apache最大连接数已经满了,新的访客只能 ...
- SQL中如何避免书签查找
1.使用聚集索引 对于聚集索引,索引的叶子页面和表的数据页面相同.因此,当读取聚集索引键列的值时,数据引擎可以读取其他列的值而不需要任何导航.例如前面的区间数据查询的操作,SQLServer通过B树结 ...
- COGS 1191. [Tyvj Feb11] 猫咪的进化
★ 输入文件:neko.in 输出文件:neko.out 简单对比时间限制:1 s 内存限制:128 MB [背景] 对于一只猫咪来说,它是有九条命的.但是并不是所有的猫咪都是这样,只 ...
- COGS 1043. [Clover S2] Freda的迷宫
★ 输入文件:mazea.in 输出文件:mazea.out 简单对比时间限制:1 s 内存限制:128 MB Freda 的迷宫 (mazea.pas/.c/.cpp) 题目叙述 F ...
- pat甲级1013
1013 Battle Over Cities (25)(25 分) It is vitally important to have all the cities connected by highw ...