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

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

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值