三对角阵的LU分解和三对角方程组的求解(C语言)
2012-03-30 18:42
411 查看
/*三对角阵的LU分解和三对角方程组的求解
-------------A=LU的分解算法-------
参考教材:《数值分析》李乃成,梅立泉,科学出版社
《计算方法教程》第二版 凌永祥,陈明逵
*/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main(void)
{
int i,j,n;
int N;
printf("请输入 N(10,20,30或任意值): ");
scanf("%d",&N);
float *a=(float *)malloc(sizeof(float)*N);
float *b=(float *)malloc(sizeof(float)*N);
float *c=(float *)malloc(sizeof(float)*(N-1));
float *d=(float *)malloc(sizeof(float)*N);
float *x=(float *)malloc(sizeof(float)*N);
float *y=(float *)malloc(sizeof(float)*N);
float *u=(float *)malloc(sizeof(float)*N);
float *l=(float *)malloc(sizeof(float)*N);
a[0]=0;
for(n=0;n<N-1;n++)
{
b
=2;a[n+1]=1;c
=1;
}
b[N-1]=2;
d[0]=1;d[N-1]=-1;
for(i=1;i<N-1;i++)
{
d[i]=0;
d[N-1]=d[N-1]*(-1);
}
//------追过程-------
u[0]=b[0];y[0]=d[0];
l[0]=0;
for(i=1;i<N;i++)
{
l[i]=a[i]/u[i-1];
u[i]=b[i]-l[i]*c[i-1];
y[i]=d[i]-l[i]*y[i-1];
}
printf("三对角阵A进行LU分解后的结果:\n\n");
//U的上次主对角线
printf("U的上次主对角线元u[]:\n");
for(i=0;i<N;i++)
printf("%4.3f ",u[i]);
printf("\n\n");
//L的下次主对角线
printf("L的下次主对角线元l[]:\n");
for(i=0;i<N;i++)
printf("%4.3f ",l[i]);
printf("\n\n");
//打印上三角阵U
printf("上三角阵U:\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(j==i)
{
printf("%4.3f ",u[i]);
}
else if(j==(i+1))
{
printf("%4.3f ",c[i]);
}
else
{
printf("%4.3f ",l[0]);
}
}
printf("\n");
}
//打印单位下三角阵L
printf("单位下三角阵L:\n");
float dig=1.0;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(j==i)
{
printf("%4.3f ",dig);
}
else if(i==(j+1))
{
printf("%4.3f ",l[i]);
}
else
{
printf("%4.3f ",l[0]);
}
}
printf("\n");
}
printf("\n");
//------赶过程-------
x[N-1]=y[N-1]/u[N-1];
for(i=N-2;i>=0;i--)
{
x[i]=(y[i]-c[i]*x[i+1])/u[i];
}
printf("中间解向量y[]:\n");
for(i=0;i<N;i++)
printf("%4.3f ",y[i]);
printf("\n\n");
printf("解向量x[]:\n");
for(i=0;i<N;i++)
printf("%4.3f ",x[i]);
printf("\n\n");
free(a);free(b);free(c);free(d);free(x);free(y);free(l);
return 0;
}
-------------A=LU的分解算法-------
参考教材:《数值分析》李乃成,梅立泉,科学出版社
《计算方法教程》第二版 凌永祥,陈明逵
*/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main(void)
{
int i,j,n;
int N;
printf("请输入 N(10,20,30或任意值): ");
scanf("%d",&N);
float *a=(float *)malloc(sizeof(float)*N);
float *b=(float *)malloc(sizeof(float)*N);
float *c=(float *)malloc(sizeof(float)*(N-1));
float *d=(float *)malloc(sizeof(float)*N);
float *x=(float *)malloc(sizeof(float)*N);
float *y=(float *)malloc(sizeof(float)*N);
float *u=(float *)malloc(sizeof(float)*N);
float *l=(float *)malloc(sizeof(float)*N);
a[0]=0;
for(n=0;n<N-1;n++)
{
b
=2;a[n+1]=1;c
=1;
}
b[N-1]=2;
d[0]=1;d[N-1]=-1;
for(i=1;i<N-1;i++)
{
d[i]=0;
d[N-1]=d[N-1]*(-1);
}
//------追过程-------
u[0]=b[0];y[0]=d[0];
l[0]=0;
for(i=1;i<N;i++)
{
l[i]=a[i]/u[i-1];
u[i]=b[i]-l[i]*c[i-1];
y[i]=d[i]-l[i]*y[i-1];
}
printf("三对角阵A进行LU分解后的结果:\n\n");
//U的上次主对角线
printf("U的上次主对角线元u[]:\n");
for(i=0;i<N;i++)
printf("%4.3f ",u[i]);
printf("\n\n");
//L的下次主对角线
printf("L的下次主对角线元l[]:\n");
for(i=0;i<N;i++)
printf("%4.3f ",l[i]);
printf("\n\n");
//打印上三角阵U
printf("上三角阵U:\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(j==i)
{
printf("%4.3f ",u[i]);
}
else if(j==(i+1))
{
printf("%4.3f ",c[i]);
}
else
{
printf("%4.3f ",l[0]);
}
}
printf("\n");
}
//打印单位下三角阵L
printf("单位下三角阵L:\n");
float dig=1.0;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(j==i)
{
printf("%4.3f ",dig);
}
else if(i==(j+1))
{
printf("%4.3f ",l[i]);
}
else
{
printf("%4.3f ",l[0]);
}
}
printf("\n");
}
printf("\n");
//------赶过程-------
x[N-1]=y[N-1]/u[N-1];
for(i=N-2;i>=0;i--)
{
x[i]=(y[i]-c[i]*x[i+1])/u[i];
}
printf("中间解向量y[]:\n");
for(i=0;i<N;i++)
printf("%4.3f ",y[i]);
printf("\n\n");
printf("解向量x[]:\n");
for(i=0;i<N;i++)
printf("%4.3f ",x[i]);
printf("\n\n");
free(a);free(b);free(c);free(d);free(x);free(y);free(l);
return 0;
}
相关文章推荐
- Matlab实现——严格对角占优三对角方程组求解(高斯赛尔德Gauss-Seidel迭代、超松弛)
- 求解三对角方程组的追赶法(Matlab程序)
- 追赶法求解三对角方程组
- 列主元消去法求解方程组(C语言)
- 列选主元Guass消元法求解方程组+c语言
- LU分解法求解方程组(C语言)
- 改进平方根法求解方程组(C语言)
- 追赶法求解方程组(C语言)
- 雅克比迭代法与高斯塞德尔迭代法求解方程组(C语言)
- Guass列主元、平方根法、追赶法求解方程组的C++实现
- 高斯_塞德尔迭代求解方程组
- solve,subs循环求解方程组
- 遗传算法的C语言实现(二)-----以求解TSP问题为例
- 形如abcde/fghij = n 的表达式(C语言求解)
- C语言 概率算法求解π
- C语言求解一元二次方程
- C语言求解最长公共子字符串问题及相关的算法分析
- C语言之基本算法35—数组上三角之积 主对角之积 副对角之积
- C语言求解数独
- 使用C语言求解扑克牌的顺子及n个骰子的点数问题