数值分析三次样条插值
- 格式:ppt
- 大小:924.50 KB
- 文档页数:33


东南大学《数值分析》上机练习——算法与程序设计实验报告
第四章 多项式插值与函数最佳逼近
——曲线拟合之3次样条插值
*****(学号) *****(姓名)
上机题目要求见教材P195,37题。
一、算法原理
题目要求编写第一边界条件的3次样条插值函数的通用程序,同时根据汽车门曲线值点构造三次紧压样条曲线函数()Sx。其基本原理如下
定义 设0{(,)}Nkkkxy有N+1个点,其中01Naxxxb。如果存在N个三次多项式()kSx,系数为,0,1,2,3,,kkkkSSSS和满足如下性质:
23,0,1,2,3()()()()kkkkkkkkSxssxxsxxsxx (1)
111''111''''111(), 0,1,...,()(), 0,1,...,2()(), 0,1,...,2()(), 0,1,...,2kkkkkkkkkkkkkkSxyforkNSxSxforkNSxSxforkNSxSxforkN (2)
则成()Sx为三次样条函数。
现证明其存在:
由于()Sx是分段三次多项式,其二阶导数是在区间0[,]Nxx内是分段线性的。根据线性拉格朗日插值"()"()kSxSx可以表示为:
11111"()"()"()kkkkkkkkkxxxxSxSxSxxxxx (3)
用111(),()kkkkkkkmSxmSxxx和h代入上式,得
11"()kkkkkkkmmSxxxxxhh (4)
将上式积分两次,会引入两个积分常数,可得到如下形式:
33111()()()66kkkkkkkkkkkmmSxxxxxpxxqxxhh (5) 第二章 非线性方程的解法
(完整)三次样条插值的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; (完整)三次样条插值的C程序(很全啊)
double
xx;
freopen("threeInsert.in",
"r",
stdin); scanf(”%d", &n);
for (i = 0; i <= n; i++) scanf(”%lf%lf”, &x[i], &y[i]);
-----WORD格式--可编辑--专业资料-----
--完整版学习资料分享---- 1设计目的、要求
对龙格函数22511)(xxf在区间[-1,1]上取10n的等距节点,分别作多项式插值、三次样条插值和三次曲线拟合,画出)(xf及各逼近函数的图形,比较各结果。
2设计原理
(1) 多项式插值:利用拉格朗日多项式插值的方法,其主要原理是拉格朗日多项式,即:
01,,...,nxxx表示待插值函数的1n个节点,
0()()nnjkkjjkLxylxy,其中0,1,...,jn;
011011()...()()...()()()...()...()...()kknkkkkkkknxxxxxxxxlxxxxxxxxx
(2) 三次样条插值:三次样条插值有三种方法,在本例中,我们选择第一边界条件下的样条插值,即两端一阶导数已知的插值方法:
00'()'Sxf
'()'nnSxf
(3)三次曲线拟合:本题中采用最小二乘法的三次多项式拟合。最小二乘拟合是利用已知的数据得出一条直线或者曲线,使之在坐标系上与已知数据之间的距离的平方和最小。在本题中,n= 10,故有11个点,以这11个点的x和y值为已知数据,进行三次多项式拟合,设该多项式为23432xiiiipaaxaxax,该拟合曲线只需2[]xiipy的值最小即可。
3采用软件、设备
计算机、matlab软件
4设计内容
1、多项式插值: -----WORD格式--可编辑--专业资料-----
--完整版学习资料分享---- 在区间1,1上取10n的等距节点,带入拉格朗日插值多项式中,求出各个节点的插值,并利用matlab软件建立m函数,画出其图形。
在matlab中建立一个lagrange.m文件,里面代码如下:
%lagrange 函数
function y=lagrange(x0,y0,x)
/* 三次样条插值计算算法 */
#include "math.h "
#include "stdio.h "
#include "stdlib.h "
/*
N:已知节点数N+1
R:欲求插值点数R+1
x,y为给定函数f(x)的节点值{x(i)} (x(i)
<=N
P0=f(x0)的二阶导数;Pn=f(xn)的二阶导数
u:存插值点{u(i)} 0 <=i <=R
求得的结果s(ui)放入s[R+1] 0 <=i <=R
返回0表示成功,1表示失败
*/
int SPL(int N,int R,double x[],double y[],double P0,double Pn,double
u[],double s[])
{
/*声明局部变量*/
double *h; /*存放步长:{hi} 0 <=i <=N-1 */
double *a; /*存放系数矩阵{ai} 1 <=i <=N ; 分量0没有利用 */
double *c; /*先存放系数矩阵{ci} 后存放{Bi} 0 <=i <=N-1 */
double *g; /*先存放方程组右端项{gi} 后存放求解中间结果{yi} 0 <=i <=N
*/
double *af; /*存放系数矩阵{a(f)i} 1 <=i <=N ; */
double *ba; /*存放中间结果 0 <=i <=N-1*/
double *m; /*存放方程组的解{m(i)} 0 <=i <=N ; */
int i,k;
double p1,p2,p3,p4;
/*分配空间*/
if(!(h=(double*)malloc(N*sizeof(double)))) exit(1);
if(!(a=(double*)malloc((N+1)*sizeof(double)))) exit(1);
if(!(c=(double*)malloc(N*sizeof(double)))) exit(1);
if(!(g=(double*)malloc((N+1)*sizeof(double)))) exit(1);