共轭梯度法解油藏数值模拟线性方程中的稀疏矩阵及C++程序(测试通过)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

共轭梯度法用于求解油藏数值模拟线性方程中的稀疏矩阵系统数学上,共轭梯度法是求解特定线性系统的数值解的方法,其中那些矩阵为对称和正定。共轭梯度法是一个迭代方法,所以它适用于稀疏矩阵系统,因为这些系统对于象乔莱斯基分解这样的直接方法太大了。这种系统在数值求解偏微分方程时相当常见。共轭梯度法也可以用于求解无约束的最优化问题。双共轭梯度法提供了一种处理非对称矩阵情况的推广。方法的表述近来在解方程组(1)时,常将共轭梯度法同其他一些迭代法结合作用。特别是对病态方程组这种方法往往能收到比较显著的效果共轭梯度法,计算公式为最后c++算法#includeiostream.h#includefstream.h#includemath.h#includestdlib.h#includestdio.h#includemalloc.h#includestring.h#includeprocess.h#includefstream.hvoidgrad(intn,doublea[],doubleb[],doubleeps,doublex[]){inti,j,k;double*p,*r,*s,*q,alpha,beta,d,e;if((p=newdouble[n])==NULL){}if((r=newdouble[n])==NULL){}if((s=newdouble[n])==NULL){}if((q=newdouble[n])==NULL){}for(i=0;i=n-1;i++){x[i]=0.0;p[i]=b[i];r[i]=b[i];}i=0;while(i=n-1){for(k=0;k=n-1;k++){s[k]=0.0;for(j=0;j=n-1;j++)s[k]=s[k]+a[k*n+j]*p[j];}d=0.0;e=0.0;for(k=0;k=n-1;k++){d=d+p[k]*b[k];e=e+p[k]*s[k];}alpha=d/e;for(k=0;k=n-1;k++){x[k]=x[k]+alpha*p[k];}for(k=0;k=n-1;k++){q[k]=0.0;for(j=0;j=n-1;j++){q[k]=q[k]+a[k*n+j]*x[j];}}d=0.0;for(k=0;k=n-1;k++){r[k]=b[k]-q[k];d=d+r[k]*s[k];}beta=d/e;d=0.0;for(k=0;k=n-1;k++){d=d+r[k]*r[k];}d=sqrt(d);if(deps){free(p);free(r);free(s);free(q);return;}for(k=0;k=n-1;k++){p[k]=r[k]-beta*p[k];}i=i+1;}free(p);free(r);free(s);free(q);return;}voidmain(){inti;doubleeps;doublex[5];doubleaa[25];intm=0;doublea[5][5]={{5,7,6,5,3},{7,10,8,7,7},{6,8,10,9,8},{5,7,9,10,9}};for(intii=0;ii5;ii++){for(intjj=0;jj5;jj++){aa[m++]=a[ii][jj];}}doubleb[5]={23,32,33,31,66};eps=0.000001;grad(5,aa,b,eps,x);for(i=0;i=4;i++){coutx[i]=x[i]endl;}}(5未知数求解方程,,,求解成功,,,)

1 / 4
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功