三次样条插值的C程序

上传人:工**** 文档编号:562156107 上传时间:2023-11-26 格式:DOCX 页数:9 大小:45.14KB
返回 下载 相关 举报
三次样条插值的C程序_第1页
第1页 / 共9页
三次样条插值的C程序_第2页
第2页 / 共9页
三次样条插值的C程序_第3页
第3页 / 共9页
三次样条插值的C程序_第4页
第4页 / 共9页
三次样条插值的C程序_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《三次样条插值的C程序》由会员分享,可在线阅读,更多相关《三次样条插值的C程序(9页珍藏版)》请在金锄头文库上搜索。

1、三次样条插值C/C+程序(自己整理的)具体推导看书 code:#in elude using namespace std;const int MAXN = 100;int n;double xMAXN, yMAXN; 下标从 0.ndouble alphMAXN, betaMAXN, aMAXN, bMAXN;double hMAXN;double mMAXN; 各点的一阶导数;Einline double sqr(double pa) I return pa * pa;Edouble sunc(double p, int i) I return (1 +2 * (p - xi) / (xi

2、+ 1 - xi) * sqr(p - xi+ 1)/ (xi+ 1-xi)*yi+ (1+ 2 * (p - xi + 1) / (xi - xi + 1) * sqr(p- xi) / (xi+ 1-xi)*yi + 1+ (p-xi) * sqr(p - xi + 1) / (xi - xi + 1) *mi+ (p-xi + 1) * sqr(p - xi) / (xi + 1 - xi) *mi +1;LEint mai n() double xx;freope n(three In sert in, r, stdi n);scan f(%d, &n);for (i = 0; i =

3、 n; i+ + ) scanf(%lf%lf, &xi, &yi);/ sca nf(%lf%lf, & m0, & m n);for (i = 0; i = n - 1; i+) hi = xi + 1 - xi;第一种边界条件/alph0 = 0; alph n = 1; beta0 = 2 * m0; beta n = 2 * mn;第二种边界条件alph0 = 1; alphn = 0; beta0 = 3 * (y1 - y0) / h0; betan = 3 * (yn - yn - 1 / hn - 1);for (i = 1; i = n - 1; i +) alphi =

4、hi - 1 / (hi - 1 + hi);betai = 3 * (1 - alphi) * (yi - yi - 1) / hi - 1 + alphi * (yi + 1 - yi) / hi);for (i = 1; i = n; i+) ai = - alphi / (2 + (1 - alphi) * ai - 1);bi = (betai - (1 - alphi) * bi - 1) / (2 + (1 - alphi) * ai - 1);#include#includeusing namespace std;const int MAX = 50;floatxMAX, yM

5、AX, hMAX;/变量设置:x为各点横坐标;y为各点纵坐标; h为步长float cMAX, aMAX, fxymMAX;float f(int x1, int x2, int x3)/* 求差分函数(含三个参 数)*/float a = (yx3 - yx2) / (xx3 - xx2);float b = (yx2 - yx1) / (xx2 - xx1); return (a - b)/(xx3 - xx1);void cal_m(int n)/* 用追赶法求解出弯矩向量 M*/float BMAX;B0 = c0 / 2;for(int i = 1; i n; i+)Bi = ci

6、/ (2 - ai*Bi-1);/fxym0 = fxym0 / 2;for(i = 1; i = 0; i-) fxymi = fxymi - Bi*fxymi+1;void printout(int n);int main()int n,i; char ch;docou t n;for(i = 0; i = n; i+)coutPlease put in Xixi;/coutendl;coutPlease put in Yiyi; /coutendl;for(i = 0; i n; i+) /求步长;其数组值较之x, y个数少一hi = xi+1 - xi;coutt;switch(t)c

7、ase 1:cou tPlease put in Y0 Ynf0f1;c0 = 1; an = 1;fxym0 = 6*(y1 - y0) / (x1 - x0) - f0) / h0;fxymn=6*(f1-(yn-yn-1)/(xn-xn-1) / hn-1;break;case 2:cou tPlease put in Y0 Ynf0f1;cO = an = O;fxymO = 2*fO; fxymn = 2*f1; break;defaul t:cou t 不可用 n;/待定;/switchfor(i = 1; i n; i+)fxymi = 6 * f(iT, i, i+1);/调用

8、差分函数(only!)for(i = 1; i n; i+)ai = hi-1 / (hi + hi-1);ci = 1 - ai; an = hn-1 / (hn-1 + hn);cal_m(n);/调用弯矩函数(only!) coutn输出三次样条插值函数:n;prin tou t(n);/调用求解三次样条插值函数;函数输出coutch; while(ch = y | ch = Y);return 0;void printout(int n)/*求三次样条插值函数(因已知断点个数 而异)*/coutsetprecision(6);/通过操作器 setprecision()设置有效位数; 其

9、为头文件所包含;括号内为参数。for(int i = 0; i n; i+)/所输出函数个数由所设断点个数而定 couti+1: xi , xi+1n 0) cou t t *(xi+l - x)3;elsecou t-1 *(x - xi+l 0)cou t + t*(x - xi厂3;elsecou t - -1 *(x - xi厂3; cout 0)cout+ t*(xi+1 - x);else cout- -t*(xi+1 0)cout + t*(x - xi);elsecout - -t*(x - xi);coutendlendl;coutendl;/*提供测试数据:(来自课本55页

10、例5 数值分析清华大学出版社第四版)*/*输入327.7 4.128 4.329 4.130 3.013.0 -4.0*/*输出输出三次样条插值函数:1: 27.7 , 2813.07*(x 28厂3 + 0.22*(x 27.7厂3+ 14.84*(28 - x) + 14.31*(x - 27.7)2: 28 , 290.066*(29 - X), + 0.1383*(x - 28厂3+ 4.234*(29 - x) + 3.962*(x - 28)3: 29 , 300.1383*(30 - x厂3 - 1.519 *(x - 29厂3+ 3.962*(30 - x) + 4.519*(x - 29)*/ purpose :给定,值的三次样条插值多项式/# define MAX_N 20/ 定义(x_i,y_i)的最大的维数typedef struct tagPOINT/ 点的结构dou

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号