计算方法:高斯-若当主元消去法解线性方程组
2012-12-05 16:37
134 查看
#include<stdio.h>
#include<math.h>
#define N 100
void xzy(int m, int n,double a
[N+1])//选列主元函数(绝对值最大)一旦选出,则进行交换
{
double max=a[m][m],t;//t为交换变量时的临时变量
int i,l=m,j;
for(i=m+1;i<n;i++)
if(fabs(a[i][m])>fabs(max)) l=i;
if(l>m)
for(j=m;j<=n+1;j++)
{
t=a[m][j];
a[m][j]=a[l][j];
a[l][j]=t;
}
}
void print(double a
[N+1],int n)
{
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=n+1;j++)
printf("%.4f\t",a[i][j]);
printf("\n");
}
}
int main()
{
int i,j,k,n;//输入方程阶数
double a
[N+1],x
,sum,m;//系数行列式、解的数组
printf("请输入方程的阶数:\n");
scanf("%d",&n);
printf("请输入方程增广矩阵:\n");
for(i=1;i<=n;i++)
for(j=1;j<=n+1;j++)
scanf("%lf",&a[i][j]);
for(i=1;i<n;i++)
{
xzy(i,n,a);
for(j=i+1;j<=n;j++)
{
m=(-a[j][i]/a[i][i]);
for(k=i;k<=n+1;k++)
a[j][k]=m*a[i][k]+a[j][k];
}
}
printf("化为上三角阵为:\n");
print(a,n);//输出变形后的上三角阵,查看一下是否正确
for(i=n;i>=1;i--) //对上三角阵进行解方程
{
for(j=n,sum=0;j>i;j--)//注意要使sum初始化为0
sum=sum+a[i][j]*x[j];
x[i]=(a[i][n+1]-sum)/a[i][i];
}
printf("方程的根为:\n");
for(i=1;i<=n;i++)
printf("x%d=%.4f\n",i,x[i]);
system("pause");
return 0;
}
/*方程实例
3
11 -3 -2 3
-23 11 1 0
1 -2 2 -1
x3=1.001,x2=2.001,x1=1.000
3
1 4 -5 3
1 3 -2 2
6 -1 18 2
x1=1.333333.x2=0,x3=-0.33333
3
1 -1 1 -4
5 -4 3 -12
2 1 1 11
x1=3,x2=6,x3=-1
3
2 3 5 5
3 4 7 6
1 3 3 5
x1=-4,x2=1,x3=2(书上答案有误)
4
1.1161 0.1254 0.1397 0.1490 1.5471
0.1582 1.1675 0.1768 0.1871 1.6471
0.1968 0.2071 1.2168 0.2271 1.7471
0.2368 0.2471 0.2568 1.2671 1.8471
x1=1.0406,x2=0.9870,x3=0.9351,x4=0.8813
*/
#include<math.h>
#define N 100
void xzy(int m, int n,double a
[N+1])//选列主元函数(绝对值最大)一旦选出,则进行交换
{
double max=a[m][m],t;//t为交换变量时的临时变量
int i,l=m,j;
for(i=m+1;i<n;i++)
if(fabs(a[i][m])>fabs(max)) l=i;
if(l>m)
for(j=m;j<=n+1;j++)
{
t=a[m][j];
a[m][j]=a[l][j];
a[l][j]=t;
}
}
void print(double a
[N+1],int n)
{
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=n+1;j++)
printf("%.4f\t",a[i][j]);
printf("\n");
}
}
int main()
{
int i,j,k,n;//输入方程阶数
double a
[N+1],x
,sum,m;//系数行列式、解的数组
printf("请输入方程的阶数:\n");
scanf("%d",&n);
printf("请输入方程增广矩阵:\n");
for(i=1;i<=n;i++)
for(j=1;j<=n+1;j++)
scanf("%lf",&a[i][j]);
for(i=1;i<n;i++)
{
xzy(i,n,a);
for(j=i+1;j<=n;j++)
{
m=(-a[j][i]/a[i][i]);
for(k=i;k<=n+1;k++)
a[j][k]=m*a[i][k]+a[j][k];
}
}
printf("化为上三角阵为:\n");
print(a,n);//输出变形后的上三角阵,查看一下是否正确
for(i=n;i>=1;i--) //对上三角阵进行解方程
{
for(j=n,sum=0;j>i;j--)//注意要使sum初始化为0
sum=sum+a[i][j]*x[j];
x[i]=(a[i][n+1]-sum)/a[i][i];
}
printf("方程的根为:\n");
for(i=1;i<=n;i++)
printf("x%d=%.4f\n",i,x[i]);
system("pause");
return 0;
}
/*方程实例
3
11 -3 -2 3
-23 11 1 0
1 -2 2 -1
x3=1.001,x2=2.001,x1=1.000
3
1 4 -5 3
1 3 -2 2
6 -1 18 2
x1=1.333333.x2=0,x3=-0.33333
3
1 -1 1 -4
5 -4 3 -12
2 1 1 11
x1=3,x2=6,x3=-1
3
2 3 5 5
3 4 7 6
1 3 3 5
x1=-4,x2=1,x3=2(书上答案有误)
4
1.1161 0.1254 0.1397 0.1490 1.5471
0.1582 1.1675 0.1768 0.1871 1.6471
0.1968 0.2071 1.2168 0.2271 1.7471
0.2368 0.2471 0.2568 1.2671 1.8471
x1=1.0406,x2=0.9870,x3=0.9351,x4=0.8813
*/
相关文章推荐
- 计算方法之用高斯列主元消去法求线性方程组
- 计算方法之用高斯列主元消去法求线性方程组
- 计算方法-全主元高斯消元法解线性方程组(Matlab)
- 解线性方程组的直接方法——高斯消去和LU消去法
- 计算方法 -- 解线性方程组直接法(LU分解、列主元高斯消元、追赶法)
- 计算方法之高斯消去
- 计算方法列主元素消去法求线性方程组的解
- 高斯全主元消去法解线性方程组
- 计算方法总体选主元素消去法求线性方程组的解
- 计算方法实验三 高斯消元
- 计算方法之用追赶法求线性方程组
- 全选主元高斯消去算法
- 计算方法之用追赶法求线性方程组
- 计算方法之用雅克比法求线性方程组
- 整数行列式计算 高斯方法 无精度损失
- 选主元的高斯-约当(Gauss-Jordan)消元法解线性方程组和求逆矩阵
- 计算方法之用雅克比法求线性方程组
- 计算方法:矩阵三角分解法解线性方程组
- 选主元的高斯-约旦(Gauss-Jordan)消元法解线性方程组/求逆矩阵
- 求解线性方程组--主元消去法