三次樣条C语言的实现
实验二 .三次样条C语言的实现
1.实验目的:
进一步熟悉三次样条插值法。
掌握编程语言字符处理程序的设计和调试技术。
2.实验要求:
已知:某些点的坐标以及初值条件。
输入:条件点数以及这些点的坐标,边界条件
输出:根据三次样条公式求出多项式公式。
3.程序流程:
(1)输入已知点的个数;
(2)分别输入已知点的X,Y坐标;
(3)输入边界条件;
(4)通过调用函数,求三次样条函数。
三次样条函数如下:
常见边界条件有三种:
第1种边界条件:
第2种边界条件:
周期边界条件
对于第1,2种条件可写成矩阵形式:
对于第3种条件可写成矩阵形式:
通过以上方程求出Mi
其中:
将求出的解带入:
即得所求函数
程序流程图:
↓
↓
↓
↓
程序如下:
#include
#include
using namespace std;
const int MAX = 250;
float x[MAX], y[MAX], h[MAX];
float c[MAX], a[MAX], fxym[MAX];
float f(int x1, int x2, int x3){
float a = (y[x3] - y[x2]) / (x[x3] - x[x2]);
float b = (y[x2] - y[x1]) / (x[x2] - x[x1]);
return (a - b)/(x[x3] - x[x1]);
} //求差分
void printout(int n){
cout<
for(int i = 0; i < n; i++){
cout<
float t = fxym[i]/(6*h[i]);
if(t > 0)cout<
else cout<
t = fxym[i+1]/(6*h[i]);
if(t > 0)cout<
else cout<
cout<
t = (y[i] - fxym[i]*h[i]*h[i]/6)/h[i];
if(t > 0)cout<
else cout<
t = (y[i+1] - fxym[i+1]*h[i]*h[i]/6)/h[i];
if(t > 0)cout<
else cout<
cout<
}
cout<
}
void cal_m(int n){ //用追赶法求解出弯矩向量M……
float B[MAX];
B[0] = c[0] / 2;
for(int i = 1; i < n; i++)
B[i] = c[i] / (2 - a[i]*B[i-1]);
fxym[0] = fxym[0] / 2;
for(i = 1; i <= n; i++)
fxym[i] = (fxym[i] - a[i]*fxym[i-1]) / (2 - a[i]*B[i-1]);
for(i = n-1; i >= 0; i--)
fxym[i] = fxym[i] - B[i]*fxym[i+1];
}
void printout(int n);
int mai