做三次样条曲线时,需要解三对角矩阵(Tridiagonal Matrices)。常用解法为Thomas Algorithm,又叫The tridiagonal matrix algorithm (TDMA)。它是一种基于高斯消元法的算法, 分为两个阶段:向前消元forward elimination和回代backward substitution。
理论学习:三对角矩阵(Tridiagonal Matrices)的求法:Thomas Algorithm(TDMA) - 马语者 - 博客园
一般公式:
使用C++使用TDMA算法解题:
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
//构建三对角矩阵求解函数
//x[]未知数列向量; a[]三对角矩阵中下三角数组; b[]三对角矩阵对角数组;
//c[]三对角矩阵中上三角数组;N 矩阵维度; d[]是等号右侧结果矩阵
double *TDMA(double x[], double a[], double b[], double c[], double d[], int N){
c[0]=c[0]/b[0];
d[0]=d[0]/b[0];
for(int i=1;i<N-1;i++)
c[i]=c[i]/(b[i]-c[i-1]*a[i]);
for(int i=1;i<N;i++)
d[i]=(d[i]-d[i-1]*a[i])/(b[i]-c[i-1]*a[i]);
x[N-1]=d[N-1];
cout<<"x"<<N-1<<" "<<x[N-1]<<endl;
for(int i=N-2; i>=0; i--){
x[i]=d[i]-c[i]*x[i+1];
cout<<"x"<<i<<" "<<x[i]<<endl;
}
return x;
}
int main(){
const int n=5;
double b[n]={1,0,0,0,0};
double D[n], u[n], v[n], x[n];
fill(D,D+n,2);
fill(u,u+n,-1);
fill(v,v+n,-1);
TDMA(x, u, D, v, b, n);
}
代码运行结果:
x4 0.166667
x3 0.333333
x2 0.5
x1 0.666667
x0 0.833333