如(设x为未知数)
b[1]*x[1]+c[1]x[2]=d[1]
a[2]*x[1]+b[2]*x[2]+c[2]*x[3]=d[2]
a[3]*x[2]+b[3]*x[3]+c[3]*x[4]=d[3]
............
..............
a[n-1]*x[n-2]+b[n-1]*x[n-1]+c[n-1]*x[n]=d[n-1]
a[n]*x[n-1]+b[n]*x[n]=d[n]
把他转化成
x[1]+q[1]*x[2]=p[1]
x[2]+q[2]*x[3]=p[2]
.............
x[n-1]+q[n-1]x[n]=p[n-1]
x[n]=p[n]
再迭代回去就可以解出X[n]了
其中:
p[1]=d[1]/b[1]
q[1]=c[1]/b[1]
t[k]=b[k]-a[k]*q[k-1]
p[k]=(d[k]-a[k]*p[k-1])/t[k]
q[k]=c[k]/t[k]
k=2,3,4,........,n
回代得到
x[N]=p[N]
x[k]=p[k]-q[k]*x[k+1]
k=n-1,n-2,n-3.........2,1
#include < stdio.h >
#include < stdlib.h >
int n;
float * a, * b, * c, * d, * p, * q, * x;
void get_array()
{
a = ( float * )malloc((n + 1 ) * sizeof ( float ));
b = ( float * )malloc((n + 1 ) * sizeof ( float ));
c = ( float * )malloc((n + 1 ) * sizeof ( float ));
d = ( float * )malloc((n + 1 ) * sizeof ( float ));
q = ( float * )malloc((n + 1 ) * sizeof ( float ));
p = ( float * )malloc((n + 1 ) * sizeof ( float ));
x = ( float * )malloc((n + 1 ) * sizeof ( float ));
}
void get_num()
{
int i;
printf( " 请按行输入数据,若x的系数是0则不用输,但等号右边的要输 " );
scanf( " %f %f %f " , & b[ 1 ], & c[ 1 ], & d[ 1 ]);
for (i = 2 ;i <= n - 1 ;i ++ )
scanf( " %f %f %f %f " , & a[i], & b[i], & c[i], & d[i]);
scanf( " %f %f %f " , & a[n], & b[n], & d[n]);
}
void work()
{
int i = 0 ,k;
float t;
a[ 1 ] = c[n] = 0 ;
p[ 1 ] = d[ 1 ] / b[ 1 ];
q[ 1 ] = c[ 1 ] / b[ 1 ];
// 初始化
for (k = 2 ;k <= n;k ++ ){
t = b[k] - a[k] * q[k - 1 ];
p[k] = (d[k] - a[k] * p[k - 1 ]) / t;
q[k] = c[k] / t;
}
// 对原三对角方程组进行顺序消元,且每步都吧主元素系数化为1
x[n] = p[n];
for (k = n - 1 ;k >= 1 ;k -- )
x[k] = p[k] - q[k] * x[k + 1 ];
// 回代求解
}
int main()
{
// freopen("in.txt","r",stdin);
int i = 0 ;
print1();
printf( " 请输入方程阶数 " );
scanf( " %d " , & n);
get_array();
get_num();
work();
for (i = 1 ;i <= n;i ++ )
printf( " x[%d]= %.4f " ,i,x[i]);
return 0 ;
}