追赶法求三对角方程组~~

如(设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 ;
}

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值