加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

数值分析C程序:LU直接三角分解,改进平方根法,追赶法

(2010-11-09 12:43:17)
标签:

追赶法

平方根

数值分析

c程序

赋值

教育

分类: 学习
数值分析C程序:LU直接三角分解,改进平方根法,追赶法(摘)

#define N 4
#include<stdio.h>
main()
{
int i,j,r,k;
float a[N][N],l[N][N],u[N][N],b[N],x[N],y[N];
float de=0;
printf("Please imput the%d*%d matrix A:\n",N-1,N-1);
for(i=1;i<N;i++)
for(j=1;j<N;j++)
   scanf("%f",&a[i][j]);
printf("please imput the 1*%d matrix b:\n",N-1);
for(j=1;j<N;j++)
   scanf("%f",&b[j]);
for(j=1;j<N;j++)
{
u[1][j]=a[1][j];
l[j][1]=a[j][1]/u[1][1];

}

for(r=2;r<N;r++)
{
   for(j=r;j<N;j++)
   {
      for(k=1;k<r;k++)
      {
       de+=l[r][k]*u[k][j];
      }
      u[r][j]=a[r][j]-de;
      de=0;
     
    }
  
   for(i=r+1;i<N;i++)
   {
      for(k=1;k<r;k++)
      {
       de+=l[i][k]*u[k][r];
      }
      l[i][r]=a[i][r]-de;
      l[i][r]=l[i][r]/u[r][r];
      de=0;
     
   }
}

for(i=1;i<N;i++)
   {
    l[i][i]=1;
   }

  

y[1]=b[1];
for(k=2;k<N;k++)
   {
    de=0;
    for(j=1;j<k;j++)
    de+=l[k][j]*y[j];
    y[k]=b[k]-de;
   }

x[N-1]=y[N-1]/u[N-1][N-1];
for(k=N-2;k>=1;k--)
   {
    de=0;
    for(j=k+1;j<=N-1;j++)
    de+=u[k][j]*x[j];
    x[k]=(y[k]-de)/u[k][k];
   }
printf("The matrix x is:\n");
for(j=1;j<N;j++)
printf("x(%d)=%f \n",j,x[j]);

}

 

 

直接三角分解法(直接赋值):

#define N 4
#include<stdio.h>
main()
{
int i,j,r,k;
float a[N][N]={0,0,0,0,0,3.3330,15920,-10.333,0,2.2220,16.710,9.6120,0,1.5611,5.1791,1.6852},
b[N]={0,15913,28.544,8.4254},l[N][N],u[N][N],x[N],y[N];
float de=0;

for(j=1;j<N;j++)
{
u[1][j]=a[1][j];
l[j][1]=a[j][1]/u[1][1];

}

for(r=2;r<N;r++)
{
   for(j=r;j<N;j++)
   {
      for(k=1;k<r;k++)
      {
       de+=l[r][k]*u[k][j];
      }
      u[r][j]=a[r][j]-de;
      de=0;
     
    }
  
   for(i=r+1;i<N;i++)
   {
      for(k=1;k<r;k++)
      {
       de+=l[i][k]*u[k][r];
      }
      l[i][r]=a[i][r]-de;
      l[i][r]=l[i][r]/u[r][r];
      de=0;
     
   }
}

for(i=1;i<N;i++)
   {
    l[i][i]=1;
   }

  

y[1]=b[1];
for(k=2;k<N;k++)
   {
    de=0;
    for(j=1;j<k;j++)
    de+=l[k][j]*y[j];
    y[k]=b[k]-de;
   }

x[N-1]=y[N-1]/u[N-1][N-1];
for(k=N-2;k>=1;k--)
   {
    de=0;
    for(j=k+1;j<=N-1;j++)
    de+=u[k][j]*x[j];
    x[k]=(y[k]-de)/u[k][k];
   }
printf("The matrix x is:\n");
for(j=1;j<N;j++)
printf("x(%d)=%f \n",j,x[j]);

}

 

 

 

 

改进平方根法(非直接赋值):

#include"math.h"

#include"stdio.h"

main()                

{int i,j,k;           

int n=4;

float m,a[4][4],t[4][4],l[4][4],b[4],d[4],x[4],y[4];

printf("Please input matrix a:\n");  

for(i=0;i<n;i++)

    for(j=0;j<n;j++)

      {l[j][j]=1.0;  

       scanf("%f",&a[i][j]);

       }

    printf("\n");

printf("Please input matrix b:\n");      

for(i=0;i<n;i++)

   scanf("%f",&b[i]);

   printf("\n");

d[0]=a[0][0];                  

for(i=1;i<n;i++)   

    for(j=0;j<i;j++)

      {m=0.0;

         for(k=0;k<j;k++)           

           m+=t[i][k]*l[j][k];

            t[i][j]=a[i][j]-m;

           l[i][j]=t[i][j]/d[j];

       m=0.0;

         for(k=0;k<i;k++)           

           {m+=t[i][k]*l[i][k];

            d[i]=a[i][i]-m;

            }

        l[j][i]=l[i][j];            

       }

y[0]=b[0];           

for(i=1;i<n;i++)           

    {m=0.0;

      for(k=0;k<i;k++)

      {m+=l[i][k]*y[k];

        y[i]=b[i]-m;

       }

     }

x[n-1]=y[n-1]/d[n-1];        

for(i=n-1;i>=0;i--)           

    {m=0.0;

      for(k=i+1;k<n;k++)

        {m+=l[k][i]*x[k];

         x[i]=y[i]/d[i]-m;

         }

     }

for(i=0;i<n;i++)      

printf("x(%d)=%f \n",i,x[i]);         

}

 

改进平方根法(直接赋值):

#include"math.h"

#include"stdio.h"

main()                

{int i,j,k;           

int n=4;

float m,a[4][4]={6,2,1,-1,2,4,1,0,1,1,4,-1,-1,0,-1,3},b[4]={-1,2,1,3},t[4][4],l[4][4],d[4],x[4],y[4];


d[0]=a[0][0];                  

for(i=1;i<n;i++)   

    for(j=0;j<i;j++)

      {m=0.0;

         for(k=0;k<j;k++)           

           m+=t[i][k]*l[j][k];

            t[i][j]=a[i][j]-m;

           l[i][j]=t[i][j]/d[j];

       m=0.0;

         for(k=0;k<i;k++)           

           {m+=t[i][k]*l[i][k];

            d[i]=a[i][i]-m;

            }

        l[j][i]=l[i][j];            

       }

y[0]=b[0];           

for(i=1;i<n;i++)           

    {m=0.0;

      for(k=0;k<i;k++)

      {m+=l[i][k]*y[k];

        y[i]=b[i]-m;

       }

     }

x[n-1]=y[n-1]/d[n-1];        

for(i=n-1;i>=0;i--)           

    {m=0.0;

      for(k=i+1;k<n;k++)

        {m+=l[k][i]*x[k];

         x[i]=y[i]/d[i]-m;

         }

     }

for(i=0;i<n;i++)      

printf("x(%d)=%f \n",i,x[i]);         

}

 

追赶法(非直接赋值):

 

#include"stdio.h"
#include"math.h"
void main()
{
   int i,n;
   float a[100],b[100],c[100],d[100];
   float u[100],l[100],y[100],x[100];
   printf("Please input the square distance set of piece n:\r\n");
     scanf("%d",&n);
     printf("Please input a2--an:\n");
     for(i=2;i<=n;i++)
     {
       printf("a%d=",i);
       scanf("%f",&a[i]);
     }
    
     printf("Please input b1--bn:\n");
     for(i=1;i<=n;i++)
     {
       printf("b%d=",i);
       scanf("%f",&b[i]);
     }
    
     printf("Please input c1--c(n-1):\n");
     for(i=1;i<n;i++)
     {
       printf("c%d=",i);
       scanf("%f",&c[i]);
     }
    
     printf("Please input d1--dn:\n");
     for(i=1;i<=n;i++)
     {
       printf("d%d=",i);
       scanf("%f",&d[i]);
     }
   
     u[1]=b[1];
     y[1]=d[1];
     for(i=2;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];
     }
     x[n]=y[n]/u[n];
     for(i=n-1;i>0;i--)
       x[i]=(y[i]-c[i]*x[i+1])/u[i];
     printf("The result:\n\n");
     for(i=n;i>=1;i--)
       printf("   x%d=%f\n",i,x[i]);
    
}

追赶法(直接赋值):

 

#include"stdio.h"
#include"math.h"
void main()
{
   int i,n=3;
   float a[4]={0,0,2,2},b[4]={0,3,4,5},c[4]={0,2,1,0},d[4]={0,-1,-7,9};
   float u[10],l[10],y[10],x[10];

     u[1]=b[1];
     y[1]=d[1];
     for(i=2;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];
     }
     x[n]=y[n]/u[n];
     for(i=n-1;i>0;i--)
       x[i]=(y[i]-c[i]*x[i+1])/u[i];
     printf("The result:\n\n");
     for(i=n;i>=1;i--)
       printf("   x%d=%f\n",i,x[i]);
    
}


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有