文档库 最新最全的文档下载
当前位置:文档库 › 三次样条函数程序

三次样条函数程序

三次样条函数程序
三次样条函数程序

a = [1.0000 0.5000 0.2500 0.0500 0.0100 0.0050 0.0010];

b = [100.0000 97.8000 94.5000 79.0000 32.8000 23.0000 13.2000]; xx= [ 1.0000 0.0500 0.0020];

yy=interp1(a,b,xx,'pchip');

%plot绘图

plot(a,b,'o',a,b);

hold on

xxx=1:-0.01:0.001;

yspline=interp1(a,b,xxx,'spline');

ypchip=interp1(a,b,xxx,'pchip');

ycubic=interp1(a,b,xxx,'cubic');

plot(xxx,yspline, '--bo'); hold on

plot(xxx,ypchip,'-rs'); hold on

plot(xxx,ycubic, '-kx');

grid on

xlabel('土壤粒径(毫米)');

ylabel('颗粒累积百分数(%)');

title('土壤颗粒级配曲线')

hold off

三种三次样条插值函数比较

批量转换程序:

a = [2 1.0000 0.5000 0.2500 0.0500 0.0100 0.0050 0.0010];

b = [100.4 100 99 97.6 87.2 36.2 24.8 10

100.5 100 99.1 97.9 88 38 25 10.2

100.6 100 99.4 98.6 90 41.3 28.5 12.5

100.5 100 99.4 98.7 89.6 41 28.9 14.1

101.4 100 98.8 97.5 84.5 39.8 26.2 12.5]; bb=b';

xx=[ 2.0000 1.0 0.0500 0.0020];

yy=interp1(a,bb,xx,'pchip');

yt=yy';

三次样条插值代码

2 三次样条插值程序 三次样条插值利用方案二(求解固支样条或压紧样条) 按照要求要起点和终点的一阶导数值已知, 可得关于01,,.....,n M M M 的严格对角占优势的三对角方程组 然后利用三对角法(追赶法)解此线性方程组。 (1)编写M 文件,并保存文件名scfit.m % x,y 分别为n 个节点的横坐标和纵坐标值组成的向量 % dx0和dxn 分别为S 的导数在x0和xn 处的值,即m 0和m n n=length(x)-1; h=diff(x); d=diff(y)./h; a=h(2:n-1); b=2*(h(1:n-1)+h(2:n)); c=h(2:n); u=6*diff(d); b(1)=b(1)-h(1)/2; u(1)=u(1)-3*(d(1)-dx0); b(n-1)=b(n-1)-h(n)/2; u(n-1)=u(n-1)-3*(dxn-d(n)); %追赶法部分 for k=2:n-1 temp=a(k-1)/b(k-1); b(k)=b(k)-temp*c(k-1); u(k)=u(k)-temp*u(k-1); end m(n)=u(n-1)/b(n-1); for k=n-2:-1:1 m(k+1)=(u(k)-c(k)*m(k+2))/b(k); end %求S K1,S K2,S K3,S K4 m(1)=3*(d(1)-dx0)/h(1)-m(2)/2; m(n+1)=3*(dxn-d(n))/h(n)-m(n)/2; for k=0:n-1 00 ()S x m '=()n n S x m '=0011111111212212n n n n n n M d M d M d M d μλμλ----??????????????????????=??????????????????????????

三次样条插值函数

沈阳航空航天大学 数学软件课程设计 (设计程序) 题目三次样条插值函数 班级 / 学号 学生姓名 指导教师

沈阳航空航天大学 课程设计任务书 课程名称数学软件课程设计 院(系)理学院专业信息与计算科学 班级学号姓名 课程设计题目三次样条插值函数 课程设计时间: 2010 年12月20日至2010 年12月31日 课程设计的内容及要求: 1.三次样条插值函数 给出函数在互异点处的值分别为。 (1)掌握求三次样条插值函数的基本原理; (2)编写程序求在第一边界条件下函数的三次样条插值函数; (3)在区间上取n=10,20,分别用等距节点对函数 作三次样条插值函数,利用(1)的结果画出插值函数的图形,并在该图形界面中同时画出的图形。 [要求] 1.学习态度要认真,要积极参与课程设计,锻炼独立思考能力; 2.严格遵守上机时间安排; 3.按照MATLAB编程训练的任务要求来编写程序; 4.根据任务书来完成课程设计论文; 5.报告书写格式要求按照沈阳航空航天大学“课程设计报告撰写规范”; 6.报告上交时间:课程设计结束时上交报告;

7.严谨抄袭行为。 指导教师年月日负责教师年月日学生签字年月日

沈阳航空航天大学 课程设计成绩评定单 课程名称数学软件课程设计 院(系)理学院专业信息与计算科学课程设计题目三次样条插值函数 学号姓名 指导教师评语: 课程设计成绩 指导教师签字 年月日

目录 一正文 (1) 1问题分析 (1) 1.1 题目 (1) 1.2 分析 (1) 2 研究方法原理 (1) 2.1 求三次样条插值多项式,算法组织 (1) 3 算例结果 (3) 二总结 (7) 参考文献 (8) 附录 (9) 源程序: (9) 程序1 (9) 程序2 (10) 程序3 (12) 程序 4 (12)

三次样条插值作业题

例1 设)(x f 为定义在[0,3]上的函数,有下列函数值表: 且2.0)('0=x f ,1)('3-=x f ,试求区间[0,3]上满足上述条件的三次样条插值函数)(x s 本算法求解出的三次样条插值函数将写成三弯矩方程的形式: ) ()6()() 6()(6)(6)(211123 13 1j j j j j j j j j j j j j j j j x x h h M y x x h h M y x x h M x x h M x s -- + -- + -+ -= +++++其中,方程中的系数 j j h M 6, j j h M 61+,j j j j h h M y )6(2- , j j j j h h M y ) 6(211++- 将由Matlab 代码中的变量Coefs_1、Coefs_2、Coefs_3以及Coefs_4的值求出。 以下为Matlab 代码: %============================= % 本段代码解决作业题的例1 %============================= clear all clc % 自变量x 与因变量y ,两个边界条件的取值 IndVar = [0, 1, 2, 3]; DepVar = [0, 0.5, 2, 1.5]; LeftBoun = 0.2; RightBoun = -1; % 区间长度向量,其各元素为自变量各段的长度 h = zeros(1, length(IndVar) - 1); for i = 1 : length(IndVar) - 1 h(i) = IndVar(i + 1) - IndVar(i); end % 为向量μ赋值

三次样条插值方法的应用

CENTRAL SOUTH UNIVERSITY 数值分析实验报告

三次样条插值方法的应用 一、问题背景 分段低次插值函数往往具有很好的收敛性,计算过程简单,稳定性好,并且易于在在电子计算机上实现,但其光滑性较差,对于像高速飞机的机翼形线船体放样等型值线往往要求具有二阶光滑度,即有二阶连续导数,早期工程师制图时,把富有弹性的细长木条(即所谓的样条)用压铁固定在样点上,在其他地方让他自由弯曲,然后沿木条画下曲线,称为样条曲线。样条曲线实际上是由分段三次曲线并接而成,在连接点即样点上要求二阶导数连续,从数学上加以概括就得到数学样条这一概念。下面我们讨论最常用的三次样条函数及其应用。 二、数学模型 样条函数可以给出光滑的插值曲线(面),因此在数值逼近、常微分方程和偏微分方程的数值解及科学和工程的计算中起着重要的作用。 设区间[]b ,a 上给定有关划分b x x n =<<<= 10x a ,S 为[]b ,a 上满足下面条件的函数。 ● )(b a C S ,2∈; ● S 在每个子区间[]1,+i i x x 上是三次多项式。 则称S 为关于划分的三次样条函数。常用的三次样条函数的边界条件有三种类型: ● Ⅰ型 ()()n n n f x S f x S ''0'',==。 ● Ⅱ型 ()()n n n f x S f x S ''''0'''',==,其特殊情况为()()0''''==n n x S x S 。 ● Ⅲ型 ()() 3,2,1,0,0==j x S x S n j j ,此条件称为周期样条函数。 鉴于Ⅱ型三次样条插值函数在实际应用中的重要地位,在此主要对它进行详细介绍。 三、算法及流程 按照传统的编程方法,可将公式直接转换为MATLAB 可是别的语言即可;另一种是运用矩阵运算,发挥MATLAB 在矩阵运算上的优势。两种方法都可以方便地得到结果。方法二更直观,但计算系数时要特别注意。这里计算的是方法一的程序,采用的是Ⅱ型边界条件,取名为spline2.m 。 Matlab 代码如下: function s=spline2(x0,y0,y21,y2n,x) %s=spline2(x0,y0,y21,y2n,x) %x0,y0 are existed points,x are insert points,y21,y2n are the second

数值分析作业-三次样条插值

数值计算方法作业 实验4.3 三次样条差值函数 实验目的: 掌握三次样条插值函数的三弯矩方法。 实验函数: dt e x f x t ? ∞ -- = 2 221)(π 实验内容: (1) 编程实现求三次样条插值函数的算法,分别考虑不同的边界条件; (2) 计算各插值节点的弯矩值; (3) 在同一坐标系中绘制函数f(x),插值多项式,三次样条插值多项式的曲线 比较插值结果。 实验4.5 三次样条差值函数的收敛性 实验目的: 多项式插值不一定是收敛的,即插值的节点多,效果不一定好。对三次样条插值函数如何呢?理论上证明三次样条插值函数的收敛性是比较困难的,通过本实验可以证明这一理论结果。 实验内容: 按照一定的规则分别选择等距或非等距的插值节点,并不断增加插值节点的个数。 实验要求: (1) 随着节点个数的增加,比较被逼近函数和三样条插值函数的误差变化情 况,分析所得结果并与拉格朗日插值多项式比较; (2) 三次样条插值函数的思想最早产生于工业部门。作为工业应用的例子,考

虑如下例子:某汽车制造商根据三次样条插值函数设计车门曲线,其中一 算法描述: 拉格朗日插值: 错误!未找到引用源。 其中错误!未找到引用源。是拉格朗日基函数,其表达式为:() ∏ ≠=--=n i j j j i j i x x x x x l 0) ()( 牛顿插值: ) )...()(](,...,,[.... ))(0](,,[)0](,[)()(1102101210100----++--+-+=n n n x x x x x x x x x x f x x x x x x x f x x x x f x f x N 其中????? ?? ?? ?????? --=--= --= -)/(]),...,[],...,[(]...,[..],[],[],,[)()(],[01102110x x x x x f x x x f x x x f x x x x f x x f x x x f x x x f x f x x f n n n n i k j i k j k j i j i j i j i 三样条插值: 所谓三次样条插值多项式Sn(x)是一种分段函数,它在节点Xi(a

三次样条求导函数

三次样条求导函数 function ppd=ppder(pp) % pp=spline(x0,y0) [breaks,coefs,l]=unmkpp(pp); % breaks 是节点横坐标,coefs是每一段上的三次多项式的系数,l 是分的段 数 for n=1:l coefs1(n,:)=polyder(coefs(n,:)); end ppd=mkpp(breaks,coefs1,1); %ppd 是一个类似pp 的结构体数据,计算这样的分段多项式的值可以用 ppval(ppd,x) 举例: >> pp=spline(linspace(0,2*pi,50),sin(linspace(0,2*pi,50))) pp = form: 'pp' breaks: [1x50 double] coefs: [49x4 double] pieces: 49 order: 4 dim: 1 [breaks,coefs,l]=unmkpp(pp) breaks = Columns 1 through 12 0 0.1282 0.2565 0.3847 0.5129 0.6411 0.7694 … ….. Columns 49 through 50 6.1550 6.2832 coefs = -0.1643 -0.0007 1.0000 0 -0.1643 -0.0639 0.9918 0.1279

-0.1581 -0.1270 0.9673 0.2537 ……. 0.1453 -0.2731 -0.8381 0.5455 0.1546 -0.2172 -0.9010 0.4339 …… -0.1503 0.2457 0.8713 -0.4907 -0.1581 0.1879 0.9269 -0.3753 -0.1643 0.1270 0.9673 -0.2537 -0.1643 0.0639 0.9918 -0.1279 l = 49 >> pp1=mkpp(breaks,coefs,1) pp1 = form: 'pp' breaks: [1x50 double] coefs: [49x4 double] pieces: 49 order: 4 dim: 1 >>ppd=ppder(pp) ppd = form: 'pp' breaks: [1x50 double] coefs: [49x3 double] pieces: 49 order: 3 dim: 1 >>ppval(pp,3) ans = 0.1411 >> sin(3) ans = 0.1411

三次样条函数的自动求法(学院+专业+学号)

三次样条函数的自动求法 摘要:在MATLAB 的The Spline Toolbox 中,没有给出三次样条函数表达的求法,可在教学过程中,或在实际问题中,我们需要知道样条插值函数的分段表达式。在现行数值分析教材中,一般都是通过解方程确定三次样条插值函数的表达式,但这种方法的工作量很大。在本文中,我们用MATLAB 语言编制了三个程序,给出在三种边界条件下,三次样条插值函数表达式的自动求法。 关键词:三次样条函数;边界条件;插值 0 引言 分段低次插值多项式具有计算简单、收敛性有保证、数值稳定等优点,但它不能保证整条曲线的光滑性甚至连续性,从而不能满足一些工程技术的要求。从20 世纪60 年代开始,由航空、造船等工程设计的需要而发展起来的样条插值方法,既保留了分段低次插值多项式的各种优点,又保证了插值函数的光滑性,已在许多领域里得到越来越广泛的应用。在教学过程中,或在实际问题中,我们需要知道样条插值函数的分段表达式。可在MATLAB 的The Spline Toolbox 中,没有直接给出三次样条函数表达式的求法,在现行数值分析教材中,一般都是在给定条件下,通过解方程而确定三次样条插值函数的表达式,尽管在计算过程中可借助数学软件来完成,但这种方法的工作量仍然很大。本文中,利用数学软件MATLAB ,我们给出了三次样条插值函数表达式的自动求法,这样不但解决了上述问题,而且给出了用数学软件解决实际问题的一个范例。 1 计算方法 定义对于给定的函数值 ),,1,0)((n k x f y k k == 其中b x x x a n =<<<= 10,如果函数)(x S 满足条件: (1))(x S 在每个子区间[k k x x ,1-](k=1,2,n , )上都是不高于三次的多项式; (2))(x S 、)(x S '、)(x S ''在[a,b]上都连续; (3)),2,1,0()(n k y x S k ==。 则称)(x S 为函数)(x f 关于节点n x x x ,,,10 的三次样条插值函数。 要求三次样条插值函数)(x S ,只需在每个子区间[k k x x ,1-]上确定一个三次多项式k k k k k d x c x b x a x S +++=23)( )(x S k 共有4个系数, 确定它们需要4个条件,因此要完全确定)(x S 共需4n 个条件。由)(x S 所满足的条件(1)、(2)、(3),可确定4n-2个条件,还缺少两个条件。这两个条件通常由实际问题对三次样条插值函数在端点的状态要求给出,称之为边界条件,常用的边界条件有以下三类。

(精选)三次样条插值的MATLAB实现

MATLAB 程序设计期中考查 在许多问题中,通常根据实验、观测或经验得到的函数表或离散点上的信息,去研究分析函数的有关特性。其中插值法是一种最基本的方法,以下给出最基本的插值问题——三次样条插值的基本提法: 对插值区间[]b a ,进行划分:b x x x a n ≤

关于三次样条插值函数的学习报告(研究生)资料

学习报告—— 三次样条函数插值问题的讨论 班级:数学二班 学号:152111033 姓名:刘楠楠

样条函数: 由一些按照某种光滑条件分段拼接起来的多项式组成的函数;最常用的样条函数为三次样条函数,即由三次多项式组成,满足处处有二阶连续导数。 一、三次样条函数的定义: 对插值区间[,]a b 进行划分,设节点011n n a x x x x b -=<< <<=,若 函数2()[,]s x c a b ∈在每个小区间1[,]i i x x +上是三次多项式,则称其为三次样条函数。如果同时满足()()i i s x f x = (0,1,2)i n =,则称()s x 为()f x 在 [,]a b 上的三次样条函数。 二、三次样条函数的确定: 由定义可设:101212 1(),[,] (),[,]()(),[,] n n n s x x x x s x x x x s x s x x x x -∈??∈?=???∈?其中()k s x 为1[,]k k x x -上的三次 多项式,且满足11(),()k k k k k k s x y s x y --== (1,2,,k n = 由2()[,]s x C a b ∈可得:''''''()(),()(),k k k k s x s x s x s x -+-+== 有''1()(),k k k k s x s x -++= ''''1()(),(1 ,2,,1)k k k k s x s x k n -+ +==-, 已知每个()k s x 均为三次多项式,有四个待定系数,所以共有4n 个待定系数,需要4n 个方程才能求解。前面已经得到22(1)42n n n +-=-个方程,因此要唯一确定三次插值函数,还要附加2个条件,一般上,实际问题通常对样条函数在端点处的状态有要求,即所谓的边界条件。 1、第一类边界条件:给定函数在端点处的一阶导数,即 ''''00(),()n n s x f s x f == 2、第二类边界条件:给定函数在端点处的二阶导数,即

试求三次样条插值S(X)

给定数据表如下: 试求三次样条插值S(X),并满足条件: i)S’(0.25)=1.0000, S’(0.53)-0.6868; ii) S”(0.25)= S”(0.53)=0; 解: 由给定数据知: h0 =0.3-0.25 - 0.05 , h 1=0.39-0.30-0.09 h 2=0.45-0.39-0.06, h 3=0.53-0.45-0.08 由μ i=h i/(h i1+h i), λ i= h i/(h i1+h i) 得: μ1= 5/14 ; λ 1= 9/14 μ2= 3/5 ; λ 2= 2/5 μ3= 3/7 ; λ 3=4/7 0.25 0.5000 ﹨ ﹨ 1.0000 ∕﹨ 0.25 0.5000 ∕ -0.9200-f[x 0,x 0, x 1 ] ﹨∕ 0.9540 ∕﹨ 0.30 0.5477 -0.7193-f[x 0,x 1,x 2 ] ﹨∕

0.8533 ∕﹨ 0.39 0.6245 -0.5440-f[x1,x2,x 3 ] ﹨∕ 0.7717 ∕﹨ 0.45 0.6708 -0.4050-f[x 2,x 3,x 4 ] ﹨∕ 0.7150 ∕﹨ 0.53 0.7280 -0.3525-f[x 3,x 4,x 5 ] ﹨∕ 0.6868 ∕ 0.53 0.7280 i)已知一节导数边界条件,弯矩方程组 ┌┐┌┐ │ 2 1 │┌M 0 ┐│-0.9200 ︳ ︳5/14 2 9/14 ︳︳M ︳︳-0.7193 ︳ 1 ︳3/5 2 2/5 ︳︳M 2 ︳_6 ︳-0.5440︳ ︳ 3/7 2 4/7 ︳︳M ︳︳-0.4050 ︳ 3

三次样条函数

计算方法实验报告 1、实验题目 三次样条插函数。 2、实验内容 三次样条插值是建立在Hermite 插值的基础上的。Hermite 插值是在一个区间上的插值,而三次样条插则是建立多个区间上插值,构造一个具有二阶光滑度的曲线,在求出给定点上对应的函数。本实验就是建立一个能根据三次样条插值函数求根的程序。 3、算法思想 给定一个区间,并把它分成n 等份,并且给出了每个结点对就的横坐标和纵坐标。利用程序输出给定插值点对应的值。横坐标设为:X 0, X 1, X 2, X 3, …X n 纵坐标为Y 0, Y 1, Y 2, …Y n ,设插点为u 。则令h k =X k+1-X k ,λk =1-+k k k h h h , μk =11--+k k k h h h , g k =3(1 11--+-+-k k k k k k k k h y y h y y λμ), 其中k=1,2,…,n-1 再根据第一类边界条件则可以确定公式6.16,再根据6.17解出方程中的m 向量,最后代入公式6.8求解。 4、源程序清单 #include #define N 21/*最大结点个数减一*/ void sanCi() { /*定义过程数据变量*/ float x[N],y[N],h[N]; /*横纵坐标及区间长度*/ float rr[N],uu[N],gg[N]; /*计算m 用的中间数组rr 、uu 、gg 分别对应:λ、μ、g 数组*/

float aa[N],bb[N],tt[N]; /*矩阵分解时用到的中间变量aa、bb、tt分别对应:α、β数组以及A=LU时中间矩阵*/ float mm[N]; /*最后要用到的系数m*/ int n,k,kv,chose; /* n为实际结点个数,k为下标,kv为最后确定k的值*/ float s,u; /*最后计算u对应的值*/ printf("请输入区间段数:"); scanf("%d",&n); /*输入结点个数*/ /*输入所有横坐标:*/ printf("输入所有横坐标:"); for(k=0; k<=n; k++) scanf("%f",&x[k]); /*输入对应纵坐标:*/ printf("输入对应纵坐标:"); for(k=0; k<=n; k++) scanf("%f",&y[k]); for(k=0; k

MATLAB三次样条插值之三弯矩法

MATLAB三次样条插值之三弯矩法 首先说这个程序并不完善,为了实现通用(1,2,…,n)格式解题,以及为调用追赶法程序,没有针对节点数在三个以下的情况进行分类讨论。希望能有朋友给出更好的方法。 首先,通过函数sanwanj得到方程的系数矩阵,即追赶法方程的四个向量参数,接下来调 用追赶法(在intersanwj函数中),得到三次样条分段函数系数因子,然后进行多项式合并 得到分段函数的解析式,程序最后部分通过判断输入值的区间自动选择对应的分段函数并计算 改点的值。附:追赶法程序chase %%%%%%%%%%%%%% function [newv,w,newu,newd]=sanwj(x,y,x0,y0,y1a,y1b)?%三弯矩样 条插值?%将插值点分两次输入,x0y0单独输入?% 边值条件a的二阶导数 y1a 和b 的二阶导数y1b,这里建议将y1a和y1b换成y2a和y2b,以便于和三转角代码相区别 ?n=length(x);m=length(y); if m~=n?error('x or y 输入有误,再来'); end?v=ones(n-1,1);u=ones(n-1,1);d=zeros(n-1,1);?w=2*o nes(n+1);?h0=x(1)-x0;?h=zeros(n-1,1); for k=1:n-1?h(k)=x(k+1)-x(k);?end v(1)=h0/(h0+h(1)); u(1)=1-v(1); d(1)=6*((y(2)-y(1))/h(1)-(y(1)-y0)/h0)/(h0+h(1));?% for k=2:n-1?v(k)=h(k-1)/(h(k-1)+h(k));?u(k)=1-v(k);?d(k)= 6*((y(k+1)-y(k))/h(k)-(y(k)-y(k-1))/h(k-1))/(h(k-1)+h(k)); end newv=[v;1];?newu=[1;u]; d0=6*((y(1)-y0)/h0-y1a)/h0; d(n)=6*(y1b-(y(n)-y(n-1))/h(n-1))/h(n-1); newd=[d0;d]; %%%%%%%%%%%% function intersanwj(x,y,x0,y0,y1a,y1b) %三弯矩样条插值?%第一部分?n=length(x);m=length(y); if m~=n?error('xory 输入有误,再来'); end?%重新定义h?h=zeros(n,1); h(1)=x(1)-x0; for k=2:n h(k)=x(k)-x(k-1);?end %sptep1调用三弯矩函数?[a,b,c,d]=sanwj(x,y,x0,y0,y1a,y1b);

三次样条拟合范例

1设计目的、要求 对龙格函数2 2511 )(x x f += 在区间[-1,1]上取10=n 的等距节点,分别作多项式插值、三次样条插值和三次曲线拟合,画出)(x f 及各逼近函数的图形,比较各结果。 2设计原理 (1) 多项式插值:利用拉格朗日多项式插值的方法,其主要原理是拉格朗日多项 式,即: 01,,...,n x x x 表示待插值函数的1n +个节点, ()()n n j k k j j k L x y l x y ===∑,其中0,1,...,j n =; 011011()...()()...() ()()...()...()...() k k n k k k k k k k n x x x x x x x x l x x x x x x x x x -+-+----= ---- (2) 三次样条插值:三次样条插值有三种方法,在本例中,我们选择第一边界条 件下的样条插值,即两端一阶导数已知的插值方法: 00'()'S x f = '()'n n S x f = (3)三次曲线拟合:本题中采用最小二乘法的三次多项式拟合。最小二乘拟合是 利用已知的数据得出一条直线或者曲线,使之在坐标系上与已知数据之间的距离的平方和最小。在本题中,n= 10,故有11个点,以这11个点的x 和 y 值为已知数据,进行三次多项式拟合,设该多项式为 23432xi i i i p a a x a x ax =+++,该拟合曲线只需2[]xi i p y -∑的值最小即可。 3采用软件、设备 计算机、matlab 软件

4设计内容 1、多项式插值: 在区间[]1,1-上取10=n 的等距节点,带入拉格朗日插值多项式中,求出各个节点的插值,并利用matlab 软件建立m 函数,画出其图形。 在matlab 中建立一个lagrange.m 文件,里面代码如下: %lagrange 函数 function y=lagrange(x0,y0,x) n=length(x0);m=length(x); for i=1:m z=x(i); s=0.0; for k=1:n p=1.0; for j=1:n if j~=k p=p*(z-x0(j))/(x0(k)-x0(j)); end end s=p*y0(k)+s; end y(i)=s; end 建立一个polynomial.m 文件,用于多项式插值的实现,代码如下: %lagrange 插值 x=[-1:0.2:1]; y=1./(1+25*x.^2); x0=[-1:0.02:1]; y0=lagrange(x,y,x0); y1=1./(1+25*x0.^2); plot(x0,y0,'--r') %插值曲线 hold on %原曲线 plot(x0,y1,'-b') 运行duoxiangshi.m 文件,得到如下图形:

实验四三次样条插值Word版

实验四三次样条插值的应用 一、问题描述 The upper portion of this noble beast is to be approximated using clamped cubic spline interpolants. The curve is drawn on a grid from which the table is constructed. Use Algorithm 3.5 to construct the three clamped cubic splines. 二、模型建立 三次样条插值 给定一个列表显示的函数 yi=y(xi),i=0,1,2,...,N-1。特别注意在xj和xj+1之间的一个特殊的区间。该区间的线性插值公式为:

(3.3.1)式和(3.3.2)式是拉格朗日插值公式(3.1.1)的特殊情况。 因为它是(分段)线性的,(3.3.1)式在每一区间内的二阶导数为零,在横坐标为xj处的二阶导数不定义或无限。三次样条插值的目的就是要得到一个内插公式,不论在区间内亦或其边界上,其一阶导数平滑,二阶导数连续。 做一个与事实相反的个假设,除yi的列表值之外,我们还有函数二阶导数y"的列表值,即一系列的yi"值,则在每个区间内,可以在(3.3.1)式的右边加上一个三次多项式,其二阶导数从左边的yj"值线性变化到右边的yj+1"值,这么做便得到了所需的连续二阶导数。如果还将三次多项式构造在xj和xj+1处为零,则不会破坏在终点xj和xj+1处与列表函数值yj和yj+1的一致性。 进行一些辅助计算便可知,仅有一种办法才能进行这种构造,即用 注意,(3.3.3)式和(3.3.4)式对自变量x的依赖,是完全通过A和B对x的线性依赖,以及C和D(通过A和B)对x的三次依赖而实现。可以很容易地验证,y"事实上是该插值多项式的二阶导数。使用ABCD的定义对x求(3.3.3)式的导数,计算dA/dx dB/dx dC/dx dD/dx,结果为一阶导数

样条函数(三次样条)

样条插值是一种工业设计中常用的、得到平滑曲线的一种插值方法,三次样条又是其中用的较为广泛的一种。 1. 三次样条曲线原理 假设有以下节点 1.1 定义 样条曲线是一个分段定义的公式。给定n+1个数据点,共有n个区间,三次样条方程满足以下条件: a. 在每个分段区间(i = 0, 1, …, n-1,x递增),都是一个三次多项式。 b. 满足(i = 0, 1, …, n ) c. ,导数,二阶导数在[a, b]区间都是连续的,即曲线是光滑的。 所以n个三次多项式分段可以写作: ,i = 0, 1, …, n-1 其中ai, bi, ci, di代表4n个未知系数。 1.2 求解 已知: a. n+1个数据点[xi, yi], i = 0, 1, …, n b. 每一分段都是三次多项式函数曲线 c. 节点达到二阶连续 d. 左右两端点处特性(自然边界,固定边界,非节点边界) 根据定点,求出每段样条曲线方程中的系数,即可得到每段曲线的具体表达式。 插值和连续性: , 其中i = 0, 1, …, n-1 微分连续性:

, 其中i = 0, 1, …, n-2 样条曲线的微分式: 将步长带入样条曲线的条件: a. 由(i = 0, 1, …, n-1)推出 b. 由(i = 0, 1, …, n-1)推出 c. 由(i = 0, 1, …, n-2)推出 由此可得: d. 由(i = 0, 1, …, n-2)推出 设,则 a. 可写为:

,推出 b. 将ci, di带入可得: c. 将bi, ci, di带入(i = 0, 1, …, n-2)可得: 端点条件 由i的取值范围可知,共有n-1个公式,但却有n+1个未知量m 。要想求解该方程组,还需另外两个式子。所以需要对两端点x0和xn的微分加些限制。选择不是唯一的,3种比较常用的限制如下。 a. 自由边界(Natural) 首尾两端没有受到任何让它们弯曲的力,即。具体表示为和 则要求解的方程组可写为: b. 固定边界(Clamped) 首尾两端点的微分值是被指定的,这里分别定为A和B。则可以推出

三次样条插值的C程序(很全啊)

三次样条插值C/C++程序(自己整理的) 具体推导看书<<数值分析>> code: #include using namespace std; const int MAXN = 100; int n; double x[MAXN], y[MAXN]; //下标从0..n double alph[MAXN], beta[MAXN], a[MAXN], b[MAXN]; double h[MAXN]; double m[MAXN]; //各点的一阶导数; inline double sqr(double pa) { return pa * pa; } double sunc(double p, int i) { return (1 + 2 * (p - x[i]) / (x[i + 1] - x[i])) * sqr((p - x[i + 1]) / (x[i + 1] - x[i])) * y[i] + (1 + 2 * (p - x[i + 1]) / (x[i] - x[i + 1])) * sqr((p - x[i]) / (x[i + 1] - x[i])) * y[i + 1] + (p - x[i]) * sqr((p - x[i + 1]) / (x[i] - x[i + 1])) * m[i] + (p - x[i + 1]) * sqr((p - x[i]) / (x[i + 1] - x[i])) * m[i + 1]; } int main() { int i, j;

freopen("threeInsert.in", "r", stdin); scanf("%d", &n); for (i = 0; i <= n; i++) scanf("%lf%lf", &x[i], &y[i]); // scanf("%lf%lf", &m[0], &m[n]); for (i = 0; i <= n - 1; i++) h[i] = x[i + 1] - x[i]; //第一种边界条件 //alph[0] = 0; alph[n] = 1; beta[0] = 2 * m[0]; beta[n] = 2 * m[n]; //第二种边界条件 alph[0] = 1; alph[n] = 0; beta[0] = 3 * (y[1] - y[0]) / h[0]; beta[n] = 3 * (y[n] - y[n - 1] / h[n - 1]); for (i = 1; i <= n - 1; i++) { alph[i] = h[i - 1] / (h[i - 1] + h[i]); beta[i] = 3 * ((1 - alph[i]) * (y[i] - y[i - 1]) / h[i - 1] + alph[i] * (y[i + 1] - y[i]) / h[i]); } a[0] = - alph[0] / 2; b[0] = beta[0] / 2; for (i = 1; i <= n; i++) { a[i] = - alph[i] / (2 + (1 - alph[i]) * a[i - 1]); b[i] = (beta[i] - (1 - alph[i]) * b[i - 1]) / (2 + (1 - alph[i]) * a[i - 1]); } m[n + 1] = 0; for (i = n; i >= 0; i--) { m[i] = a[i] * m[i + 1] + b[i]; } scanf("%lf", &xx); for (i = 0; i < n; i++) { if (xx >= x[i] && xx <= x[i + 1]) break ; } printf("%lf\n", sunc(xx, i));

三次样条程序

function [a b f]=spline3(x,y,flag,vl,vr) %三次样条插值函数 %(x,y)为插值节点,xx为插值点; %flag表端点边界条件类型: %flag=1:第一类边界条件(端点一阶导数给定); %flag=2:第二类边界条件(端点二阶导数给定); %flag=3:第三类边界条件; %vl,vr表左右端点处的在边界条件值。 %样条函数为:Si(x)=yi+bi*(x-xi)+ci*(x-xi)^2+di*(x-xi)^3 %b,c,d分别为各子区间上的系数值 %yy表插值点处的函数值. if length(x)~=length(y) error('输入数据应成对!'); end n=length(x); a=zeros(n-1,1); b=zeros(n-1,1); dx=a;dy=a; A=zeros(n);B=zeros(n,1); for i=1:n-1 dx(i)=x(i+1)-x(i); dy(i)=y(i+1)-y(i); end for i=2:n-1 A(i,i-1)=dx(i-1)/(dx(i-1)+dx(i)); A(i,i)=2; A(i,i+1)=dx(i)/(dx(i-1)+dx(i)); B(i,1)=6*(dy(i)/dx(i)-dy(i-1)/dx(i-1))/(dx(i)+dx(i-1)); end %---------------------------------% %端点一阶导数条件% if flag==1 A(1,1)=2; A(1,2)=1; A(n,n-1)=1; A(n,n)=2; B(1,1)=6*(dy(1)/dx(1)-vl)/dx(1); B(n,1)=6*(vr-dy(n-1)/dx(n-1))/dx(n-1); c=A\B; end %---------------% %端点二阶导数条件% if flag==2 A(1,1)=2; A(n,n)=2; B(1,1)=2*vl; B(n,1)=2*vr; c=A\B; end

三次函数

三次函数 百科名片 三次函数 基本概念与性质形如y=ax^3+bx^2+cx+d(a≠0,b,c,d为常数)的函数叫做三次函数(cubics function)。三次函数的图像是一条曲线----回归式抛物线(不同于普通抛物线),具有比较特殊性。 目录 1二.零点求法1.盛金公式 12.盛金判别法 13.盛金定理 14.传统解法 三.三次函数性态的五个要点 1四.三次函数对称中心1.三次函数有对称中心 12.推广 五.其他性质 展开 编辑本段二.零点求法 求函数的零点可用盛金公式、盛金判别法、或传统解法盛金公式与盛金判别法及盛金定理的运用从这里向您介绍三次方程应用广泛。用根号解一元三次方程,虽然有著名的卡尔丹公式,并有相应的判别法,但使用卡尔丹公式解题比较复杂,缺乏直观性。范盛金推导出一套直接用a、b、c、d表达的较简明形式的一元三次方程的一般式新求根公式,并建立了新判别法。 1.盛金公式 一元三次方程aX^3+bX^2+cX+d=0,(a,b,c,d∈R,且a≠0)。重根判别式:A=b^2-3ac;B=bc-9ad;C=c^2-3bd,总判别式:

Δ=B^2-4AC。当A=B=0时,盛金公式①:X1=X2=X3=-b/(3a)=-c/b=-3d/c。当Δ=B^2-4AC>0时,盛金公式②:X1=(-b-(Y1)^(1/3)-(Y2)^(1/3))/(3a);X2,3=(-2b+(Y1)^(1/3)+(Y2)^(1/3))/(6a)±i3^(1/2)((Y1)^(1/3)-(Y2)^(1/3))/(6a),其中Y1,2=Ab+3a(-B±(B^2-4AC)^(1/2))/2,i^2=-1。当Δ=B^2-4AC=0时,盛金公式③:X1=-b/a+K;X2=X3=-K/2,其中K=B/A,(A≠0)。当Δ=B^2-4AC<0时,盛金公式④:X1= (-b-2A^(1/2)cos(θ/3))/(3a);X2,3= (-b+A^(1/2)(cos(θ/3)±3^(1/2)sin(θ/3)))/(3a),其中θ=arccosT,T= (2Ab-3aB)/(2A^(3/2)),(A>0,-10时,方程有一个实根和一对共轭虚根;③:当Δ=B^2-4AC=0时,方程有三个实根,其中有一个两重根;④:当Δ=B^2-4AC<0时,方程有三个不相等的实根。 3.盛金定理 当b=0,c=0时,盛金公式①无意义;当A=0时,盛金公式③无意义;当A≤0时,盛金公式④无意义;当T<-1或T>1时,盛金公式④无意义。当b=0,c=0时,盛金公式①是否成立?盛金公式③与盛金公式④是否存在A≤0的值?盛金公式④是否存在T<-1或T>1的值?盛金定理给出如下回答:盛金定理1:当A=B=0时,若b=0,则必定有c=d=0(此时,方程有一个三重实根0,盛金公式①仍成立)。盛金定理2:当A=B=0时,若b≠0,则必定有c≠0(此时,适用盛金公式①解题)。盛金定理3:当A=B=0时,则必定有C=0(此时,适用盛金公式①解题)。盛金定理4:当A=0时,若B≠0,则必定有Δ>0(此时,适用盛金公式②解题)。盛金定理5:当A<0时,则必定有Δ>0(此时,适用盛金公式②解题)。盛金定理6:当Δ=0时,若B=0,则必定有A=0(此时,适用盛金公式①解题)。盛金定理7:当Δ=0时,若B≠0,盛金公式③一定不存在A≤0的值(此时,适用盛金公式③解题)。盛金定理8:当Δ<0时,盛金公式④一定不存在A≤0的值。(此时,适用盛金公式④解题)。盛金定理9:当Δ<0时,盛金公式④一定不存在T≤-1或T≥1的值,即T出现的值必定是-10时,不一定有A<0。盛金定理表明:盛金公式始终保持有意义。任意实系数的一元三次方程都可以运用盛金公式直观求解。当Δ=0(d≠0)时,使用卡尔丹公式解题仍存在开立方。与卡尔丹公式相比较,盛金公式的表达形式较简明,使用盛金公式解题较直观、效率较高;盛金判别法判别方程的解较直观。重根判别式A=b^2-3ac;B=bc-9ad;C=c^2-3bd是最简明的式子,由A、B、C构成的总判别式Δ=B^2-4AC也是最简明的式子(是非常美妙的式子),其形状与一元二次方程的根的判别式相同;盛金公式②中的式子(-B±(B^2-4AC)^(1/2))/2具有一元二次方程求根公式的形式,这些表达形式体现了数学的有序、对称、和谐与简洁美。

相关文档