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

被折叠的 条评论
为什么被折叠?



