三对角阵的LU分解和三对角方程组的求解(C语言)

原创 2012年03月30日 18:42:32

/*三对角阵的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[n]=2;a[n+1]=1;c[n]=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;
}

追赶法求解三对角方程组

在这篇文章里,我们介绍追赶法的基本原理,以及用追赶法求解三对角方程组的算法....
  • u010450214
  • u010450214
  • 2015年12月04日 09:37
  • 7668

n阶三取对角阵的LU分解及利用其解方程组

  • 2011年12月24日 23:13
  • 941B
  • 下载

LU分解法解线性方程组(C语言)

#include #include #define N 10 //矩阵大小范围 /** 使用已经求出的x,向前计算x(供getx()调用)* float a[][] 矩阵U* float x[] ...
  • linvo
  • linvo
  • 2009年02月15日 18:33
  • 5415

三对角阵的LU分解和三对角方程组的求解(C语言)

/*三对角阵的LU分解和三对角方程组的求解 -------------A=LU的分解算法------- 参考教材:《数值分析》李乃成,梅立泉,科学出版社     《计算方法教程》第二版 凌永...
  • zhangchao3322218
  • zhangchao3322218
  • 2012年03月30日 18:42
  • 2939

LU分解与求解

1.Lu分解
  • plkolili
  • plkolili
  • 2017年10月10日 15:38
  • 233

求解三对角方程组的追赶法(Matlab程序)

clear all;clc; fprintf('输入n:(10,20,30)\n'); n=input(''); n a=zeros(1,n);b=zeros(1,n);c=zeros(1,n...
  • zhangchao3322218
  • zhangchao3322218
  • 2012年03月30日 18:43
  • 10357

Opencv 三对角线矩阵(Tridiagonal Matrix)解法之(Thomas Algorithm)

三对角线矩阵(Tridiagonal Matrix)的(Thomas Algorithm)解法。
  • YhL_Leo
  • YhL_Leo
  • 2015年09月03日 15:17
  • 4887

矩阵手册(三)

矩阵 fro 范数的平方矩阵(A) fro 范数的平方就是 tr(A’*A)。
  • lanchunhui
  • lanchunhui
  • 2016年05月08日 09:03
  • 285

三次B样条反求控制点

  • 2011年11月19日 19:25
  • 207KB
  • 下载

数值分析 追赶法求解三对角线性方程组 MATLAB实现

函数主体部分编程算法  参考 数值分析 第四版 颜庆津 P27 运行结果截图: %追赶法求解三对角线性方程组,Ax=b,A用一维数组a,c,d存储。 function [L,U,x]=cr...
  • jingmiaa
  • jingmiaa
  • 2015年11月05日 11:48
  • 4898
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:三对角阵的LU分解和三对角方程组的求解(C语言)
举报原因:
原因补充:

(最多只允许输入30个字)