自己动手写Gauss消去法
昨天小武同学来让我帮他写一个程序,是关于Gauss消去法的,之前很少写这种跟数学有关的程序,所以决定试一试,这里我想展示一种编程的方法,以前我在不知道如何有效的编写程序时,就自己琢磨了一套方法,时间久了,我在网上看到过关于驱动测试编程的时候,就有一种“蓦然回首,那人却在灯火阑珊处”的感觉,所以现在不要学习什么设计模式之类的,自己一步一步写,你会更好的理解。
首先Gauss消去法的过程,就是利用初等行变换将原来不容易求解的方程组转化为容易求解的方程组,也就是化为所谓的三角阵,信计的同学不会不知道吧。
一开始我先整理了一下大概的思路,在解决问题时先理清思路就等于解决了一大半的问题,:
1, 主程序时要从第一行开始,对剩下的每一行做初等变换,使除第一行外,所有行的第一个元素都变成0,之后是第二行。。。。这样就变成了一个三角阵。
所以我觉得大概的主循环是这样的:
for(int i = 0;i!=ROW-1;i++)//这层循环用来“产生”每一个要作为主元的行。
{
for(int j = i+1;j!=ROW;j++)//对主元后的每一行做初等变换
//…………….做一些事情
}
2, 我觉得要写一个print函数;打印这个矩阵,不仅仅是方便显示结果,也可以在写程序的时候,方便的显示自己的错误 ,
3,用两个宏来定义矩阵的行与列ROW,LIST
4, 用一个二维矩阵来存储这个矩阵,并用float类型
5,在大一笔算的时候,我们还要把这个三角阵在向上做一次运算,这样就可以直接算出x们的值,不过现在可以用一个for循环回带出x们的值了。
现在开始写程序,,,,,,,
[cpp]
#include <stdio.h>
#define ROW 4
#define LIST 5
float a[ROW][LIST] = {{1,1,0,-4,1},{-1,1,1,3,-2},{1,3,5,-4,-4},{0,1,2,-1,-2}};
/*写一个打印函数用来测试数组元素*/
void print();
int main()
{
print();/*先测试一下,我们的数组元素是否正确*/
/*开始消去*/
for(int i = 0;i!=ROW-1;i++)
{
for(int j = i+1;j!=ROW;j++)
{
float p = a[j][i]/a[i][i];
for(int k =0;k!=LIST;k++)
{
a[j][k] = a[j][k]-p*a[i][k];
}
}
}
print();
/*开始回代*/
float x[ROW]={0,0,0,0};
for(int w = ROW-1;w>=0;w--)
{/*
x[w] = (a[w][LIST-1]-(a[w][0]*x[0]+a[w][1]*x[1]+a[w][2]*x[2]+a[w][3]*x[3]))/a[w][w];
*/
float temp = a[w][LIST-1];
for(int c = 0;c!=LIST-1;c++)
temp =temp-a[w][c]*x[c];
x[w]=temp/a[w][w];
printf("x%d=%-8.4f/n",w+1,x[w]);
}
return 0;
}
void print()
{
for(int i = 0;i!=ROW;i++)
{
for(int j = 0;j!=LIST;j++)
printf("%-8.4f",a[i][j]);
printf("/n");
}
printf("-----------------------/n");
}
需要说明的是,我在写会回带的时候先写了一个这样的“硬编码”。
x[w] = (a[w][LIST-1]-(a[w][0]*x[0]+a[w][1]*x[1]+a[w][2]*x[2]+a[w][3]*x[3]))/a[w][w];
因为这样能先知道自己的思路是不是对的。。对了之后,把程序改成
float temp = a[w][LIST-1];
for(int c = 0;c!=LIST-1;c++)
temp =temp-a[w][c]*x[c];
x[w]=temp/a[w][w];
大功告成!!!!
摘自 霸气的小草