⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gongetidu.cpp

📁 这个程序利用共轭梯度方法
💻 CPP
字号:
#include <iostream.h>
#include <assert.h>
#include <math.h>



void gongetidu(double **a,double *b,double * x,const int n,const double eps)
{
	int i,j;
	int num;
	double alphak,betak,add,err,h,l,t;
	add=alphak=betak=0;
	
	double *p=new double [n];
	assert(p!=NULL);
	double *r=new double [n];
	assert(r!=NULL);
	
	for (i=0;i<n;i++)
	{
		p[i]=r[i]=b[i];
	}
	num=1;
	do 
	{
		//计算ALPHAK;
		h=l=0;
		for (i=0;i<n;i++)
		{
			t=0;
			for (j=0;j<n;j++)
			{
				t+=a[i][j]*p[j];
			}
			l+=p[i]*t;
			h+=r[i]*p[i];
		}
		alphak=h/l;
		/////////////////////////////////////////////		
		for (i=0;i<n;i++)
		{
			x[i]+=alphak*p[i];
		}
		
		
		for (i=0;i<n;i++)
		{
			h=0;
			for (j=0;j<n;j++)
			{
				h+=a[i][j]*x[j];
			}
			r[i]=b[i]-h;
		}
		//计算BETAK;
		h=l=0;
		for (i=0;i<n;i++)
		{	
			t=0;
			for (j=0;j<n;j++)
			{
				t+=a[i][j]*p[j];
			}
			h+=r[i]*t;
			l+=p[i]*t;
		}
		betak=-h/l;
		
		for (i=0;i<n;i++)
		{
			p[i]=r[i]+betak*p[i];
		}
		
		
		//计算误差
		err=0;
		for(i=0;i<n;i++) err+=r[i]*r[i];
		// 		if(num%10==0)
		{cout<<num<<"\t"<<sqrt(err)<<endl;}
		num++;
	} while(sqrt(err)>eps);
	
	delete [] p;
	p=NULL;
	delete [] r;
	r=NULL;
}


void ssorpcg(double **a, double *b, double *x,const int n,const double omiga,const double eps)
{
	int i,j,num=0;
	double delta,add,add2,add3,alphak,betak,temp;
	delta=add=add2=add3=0;


	double *r=new double[n];
	assert(r!=NULL);
	double *h=new double[n];
	assert(h!=NULL);
	double *p=new double[n];
	assert(p!=NULL);

	for (i=0;i<n;i++)
	{
		r[i]=h[i]=p[i]=0;
	}
// x[]为零向量

//r=b-Ax0
	for (i=0;i<n;i++)
	{
		r[i]=b[i];
	}
//Sovle M*h=r
	 h[0]=r[0];
	 for (i=1;i<n;i++)
	 {
		 add=0;
		 for (j=0;j<=i-1;j++)
		 {
			 add+=(omiga*a[i][j]/a[j][j])*h[j];
		 }
		 h[i]=r[i]-add;
	 }
	 h[n-1]=h[n-1]/a[n-1][n-1];
	 for (i=n-2;i>=0;i--)
	 {
		 add=0;
		 for (j=i+1;j<n;j++)
		 {
			 add+=-omiga*a[i][j]*h[j];
		 }
		 h[i]=(h[i]-add)/a[i][i];
	 }


//p=h
	 for (i=0;i<n;i++)
	 {
		 p[i]=h[i];
	 }

//|r|^2
	 delta=0;
	 for (i=0;i<n;i++)
	 {
		 delta+=r[i]*r[i];
	 }

while(sqrt(delta)>eps)
	 {
		 cout<<num++<<"\t"<<sqrt(delta)<<endl;

// ji suan AlphaK
		 add=add2=0;
		 for (i=0;i<n;i++)
		 {
			 add3=0;
			 for (j=0;j<n;j++)
			 {
				 add3+=a[i][j]*p[j];
			 }
			 add+=p[i]*add3;
			 add2+=r[i]*h[i];
		 }
		alphak=add2/add;


        temp=add2;

//x[k+1] and r[k+1]
		for (i=0;i<n;i++)
		{
			x[i]=x[i]+alphak*p[i];
			add=0;
			for (j=0;j<n;j++)
			{
				add+=a[i][j]*p[j];
			}
// 			cout<<add<<endl;
			r[i]=r[i]-alphak*add;
		}
		delta=0;
		for (i=0;i<n;i++)
		{
			delta+=r[i]*r[i];
		}

//h[k+1]=M^(-1)r[k+1]
		h[0]=r[0];
		for (i=1;i<n;i++)
		{
			add=0;
			for (j=0;j<=i-1;j++)
			{
				add+=omiga*a[i][j]/a[j][j]*h[j];
			}
			h[i]=r[i]-add;
		}
		h[n-1]=h[n-1]/a[n-1][n-1];
		for (i=n-2;i>=0;i--)
		{
			add=0;
			for (j=i+1;j<n;j++)
			{
				add+=-omiga*a[i][j]*h[j];
			}
			h[i]=(h[i]-add)/a[i][i];
		}

//betaK
		add=0;

		for (i=0;i<n;i++)
		{
			add=r[i]*h[i];
		}

		betak=add/temp;
//p(k+1)
		for (i=0;i<n;i++)
		{
			p[i]=h[i]+betak*p[i];
		}
//|r|^2
		delta=0;
		for (i=0;i<n;i++)
		{
			delta+=r[i]*r[i];
		}
	 }


	 delete [] r;
	 r=NULL;
	 delete [] h;
	 h=NULL;
	 delete [] p;
	 p=NULL;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -