三次样条插值函数(边界二)分析及代码
根据三次样条插值公式与题目中所给出的X Y值,分别计算所需要的数值。
-
步长:hi=xi+1-xi (i=0,1,…,n-1),
-
μ值:μ[k] = h[k - 1] / (h[k - 1] + h[k])
-
λ值 :λ[k] = 1 - μ[k];
-
计算一阶差商,二阶差商。
-
根据边界条件二与所求的的二阶差商计算出C,C=6*二阶差商,(c[i] = (6 / (h[i - 1] + h[i]) * ((y[i + 1] - y[i]) / h[i] - (y[i] - y[i - 1]) / h[i - 1]))。
-
再利用λ和µ以及C用追赶法计算出矩阵的解M。
-
对于所求出的 μ, λ,列成矩阵A[][],为初始矩阵。
-
利用追赶法,对初始矩阵A[][]进行LU分解,并进行计算 。
-
s″(x0)=f0″, s″(xn)=fn″,利用边界二进行求解。
-
若第2种端点条件取为:M0=Mn=0(s″(x0)=s″(xn)=0)
-
最后,利用求解出来的M[i],计算是s(x);
求解过程
1. 设置step()函数,利用for循环,计算出步长h, μ值,λ值;
2. 设置connect()函数,计算C;
3. 设置det()函数,初始化矩阵A;
4. 设置run()函数,用追赶法计算求得M;
5. 设置get()函数,根据s(x)公式,分别计算出每个段的插值。
程序代码
在这里插入代码片
#include<iostream>
#include<math.h>
using namespace std;
const int max = 19;
double x[max], y[max];//已知 自变量 因变量
double h[max], b[max], m[max], n[max];//步长 常量2 μ λ
double c[max], Y[max], M[max];//解向量 追赶中间的Y 求得的解
double A[max][max] = {
0 }, l[max][max] = {
0 }, u[max][max];//追赶法矩阵
double s; //s(x)的结果
void step(double x[])
{
for (int i = 0; i < max - 1; i++)
b[i] = 2;
for (int i = 0; i < max - 1; i++)
{
h[i] = x[i + 1] - x[i];
//cout << h[i] << " ";
}
for (int k = 1; k < max - 1; k++)
{
m[k] = h[k - 1] / (h[k - 1] + h[k]);//μ值
n[k] = 1 - m[k];//λ值
//cout << m[k] << " ";
}
}
void conect(double y[])
{
c[0] = 0;
c[max - 1] = 0;
for (int i = 1; i < max