题目:
利用高斯消元法、LU分解法分别求解下列方程组:
高斯消元法原理很简单,用笔算非常简单,但是写程序的时候要理顺I,j,k,三个下标的循环语句,不要搞错,否则会出现数组溢出、无法输出数据等问题。最简单的高斯消元法对角线不能为零,于是延伸出了列主元素高斯消元法和完全主元素高斯消元法。
LU分解要一分为二的看待,就是先求L,用L求出y,再用U求出X。
方法一:高斯消元法
高斯消元法手写计算非常容易,用程序语言写会稍微复杂一点点。
高斯消元法的要点在于三个循环语句的理解和运用,理解i,j,k下标的运用即可,多看书。
#include<stdio.h>
#include<math.h>
int n = 3;
int main(){
float a[10][10];
float l[10][10];
float x[10];
int i,j,k;
for(i=1;i<=n;i++)
for(j=1;j<=n+1;j++)
scanf("%f",&a[i][j]);
for (i = 1; i <= n; i++)
if (a[i][i] == 0)
{
printf("无法使用高斯消元法\n");
return 0;
break;
}
for(k=1;k<n;k++)
for(i=k+1;i<=n;i++){
l[i][k]=a[i][k]/a[k][k];
for(j=k+1;j<=n+1;j++)
a[i][j] = a[i][j] - l[i][k] * a[k][j];
}
x[n]=a[n][n+1]/a[n][n];
for(k=n-1;k>=1;k--)
{
x[k]=a[k][n+1];
for(j=k+1;j<=n;j++)
x[k]-=a[k][j]*x[j];
x[k]=x[k]/a[k][k];
}
printf("X的值为\n");
for (i = 1; i <= n; i++)
printf("%f\n",x[i]);
return 0;
}
方法二:LU分解法
高斯消元法弄懂了之后,LU分解就迎刃而解了。
#include<stdio.h>
#include<math.h>
int n = 4;
int main(){
float a[10][10];
float l[10][10];
float u[10][10];
float x[10];
float y[10];
int i,j,k;
float sum;
sum=0;
for(i=1;i<=n;i++)
for(j=1;j<=n+1;j++)
scanf("%f",&a[i][j]);
for(j=1;j<=n;j++)
u[1][j]=a[1][j];
for(i=1;i<=n;i++)
l[i][1]=a[i][1]/u[1][1];
for(k=2;k<=n;k++){
for(j=k;j<=n;j++)
for(i=1;i<=k-1;i++)
u[k][j]=a[k][j]-l[k][i]*u[i][j];
for(i=k+1;i<=n;i++){
sum=0;
for(j=1;i<=k-1;j++)
sum+=l[i][j]*u[j][k];
l[i][k]=(a[i][k]-sum)/u[k][k];
}
}
y[1]=a[1][n+1];
for(k=2;k<=n;k++){
sum=0;
for(j=1;j<=k-1;j++)
sum+=l[k][j]*y[j];
y[k]=a[k][n+1]-sum;
}
printf("y的值为\n");
for (i = 1; i <=n; i++)
printf("%f\n",y[i]);
x[n]=y[n]/u[n][n];
for(k=n-1;k>=1;k--)
{
sum=0;
for(j=k+1;j<=n;j++)
sum+=u[k][j]*x[j];
x[k]=(y[k]-sum)/u[k][k];
}
printf("X的值为\n");
for (i = 1; i <=n; i++)
printf("%f\n",x[i]);
return 0;
}