Gauss

 
然后自己根据CROUT代码编写了GAUSS消元法,
这个比CROUT简单点,
首先消除了所有的语法错误,现在把C++学好了,基本这样的代码页就没有什么大的语法错误了,很容易就搞定了
但是结果却不正确,
自己苦苦思考,想当然的直接修改了最后的一些代码,还是无法求出正确结果。
怎么办?
然后决定一行行检查。
加入注释代码跟踪程序运行时各个变量在每一步的值,
#include<iostream.h>
#include<math.h>
#define MAX_N 20
 
int main ()
{
int i, j, k;
int n;
double t;
static double a[MAX_N][MAX_N], b[MAX_N], x[MAX_N];
 
cout<< "Input n value(dim of ax=b):"<<endl;
cin>> n;
if (n>MAX_N)
cout<< "The input n is large then MAX_N,please redefine the MAX_N.";
if (n<=0)
cout << "Please input a number between 1 and"<<MAX_N;
 
cout << "Now input the matrix a(i,j), i,j=0,...,"<<n-1<<endl;
for (i=0; i<n; i++)
for (j=0; j<n; j++)
cin>> a[i][j];
//输入ax=b的a矩阵
 
cout<< "Now input the matrix b(i), i=0,...,"<<n-1<<endl;
for (i=0; i<n; i++)
cin >> b[i];
 
 
//输入不b矩阵
 
for (k=0; k<n-1; k++)
for (i=k+1; i<n; i++)
{  
t=a[i][k]/a[k][k];
cout <<t<<endl;
b[i]=b[i]-t*b[k];
for (j=k+1; j<n; j++)
{
a[i][j]=a[i][j]-t*a[k][j];
}
}
 
/* cout.setf(ios::showpoint );
for(i=0; i<n;i++)
for(j=0; j<n;j++)
cout<< a[i][j]<<endl;
 
for(i=0; i<n;i++)
cout<<b[i]<<endl;
*/
 
 
for (i=n-1; i>=0; i--)
{
x[i]= b[i];
for( j=i+1; j<n; j++)
x[i]-=(a[i][j]*x[j]);
x[i]=x[i]/a[i][i];
}
 
cout.setf(ios::showpoint );
cout << "Solve... x_i="<<endl;
for (i=0; i<n; i++)
cout <<x[i]<<endl;
return 0;
}
 
 
1首先查看了t的值,发现居然有5个值,应该只有三个,然后就从t开始下手,
2继续检查a[][]的值,修改了t时就已经修改完成了两个FOR内的控制条件
所以a正确.
3检查b矩阵的值,最后一个始终不对,纳闷,搞了半天居然程序是正确的,而是我手工算错了,
一头汗啊!!!!!!!
4最后就是检查x的值了,由于这段代码的把crout中的代码复制来用的,结果不正确,还是要重新修改但是还是不行,前面我刚开始就自己乱改了一些东西在这里就出现问题了,把它们修改回来。运行,正确
呵呵。。。。。。
很高兴,但是花了一下午的时间,寝室里好冷,打字手都冻僵了。
调试程序应该从上往下调试,那样才能保证不会出现一些奇怪的错误和重新修改上面已经正确三代码,就算要修改也不会出现什么大问题和导致自己的思维混乱。
发现自己逻辑思维还是不够,这个算法的调试的时候,必须每一步用笔弄出来才能发现错误,
不过这样细心点。出现错误的几率小.
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值