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

📄 共轭梯度法.cpp

📁 共轭梯度法
💻 CPP
字号:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<iostream.h>
#include<math.h>

void main(){
    double *A;
	double *b;
	double *x;
	double *r;
	double *v;
	double *z;
	double t,c,d,sum,p,q;
	int M,n,i,j,k;
	char tag;

L:	cout<<"n=";
	cin>>n;
	
	//initial x,A,b,r,v,z
    A=(double*)malloc((n*n+1)*sizeof(double));
	x=(double*)malloc((n+1)*sizeof(double));
	b=(double*)malloc((n+1)*sizeof(double));
	r=(double*)malloc((n+1)*sizeof(double));
	v=(double*)malloc((n+1)*sizeof(double));
	z=(double*)malloc((n+1)*sizeof(double));

	//initial the values of A[i,j],b[i]
	for(i=1;i<=n;i++){

		sum=0;
		for(j=1;j<=n;j++){

			A[n*(i-1)+j]=pow((i+j+1),-1);
            sum=sum+A[n*(i-1)+j];

		}//for

		b[i]=sum/3;

	}//for

//output A,b
	cout<<"A is as follows:"<<endl;

	for(i=1;i<=n;i++){

		for(j=1;j<=n;j++) printf("%f  ",A[n*(i-1)+j]);

	cout<<endl;

	}//for
    
	cout<<endl<<"b is as follows:"<<endl;
    for(i=1;i<=n;i++) printf("%f\n",b[i]);

	//input initial value of x
	cout<<endl<<"Please input x as directions:"<<endl;
    for(i=1;i<=n;i++){

		printf("x[%d]=",i);
        cin>>x[i];

	}//for

	//r=b-Ax,v=r,c=<r,r>
	c=0;
	for(i=1;i<=n;i++){

		sum=0;
		for(j=1;j<=n;j++) sum=sum+A[n*(i-1)+j]*x[j];

		r[i]=b[i]-sum;
        v[i]=r[i];
        c=c+r[i]*r[i];

	}//for
    
	cout<<"M=";
	cin>>M;
/*	cout<<"delta=";
	cin>>delta;
	cout<<"e=";
	cin>>e;
*/
    for(k=1;k<=M;k++){

		p=0;
		for(i=1;i<=n;i++) p=p+v[i]*v[i];

		if(sqrt(p)<pow(0.00000001,n)) break;

        //z=Av,t=c/<v,z>
		q=0;
		for(i=1;i<=n;i++){

			z[i]=0;
			for(j=1;j<=n;j++) z[i]=z[i]+A[n*(i-1)+j]*v[j];
            
            q=q+v[i]*z[i];

		}//for
        t=c/q;
		
        //x=x+tv,r=r-tz,d=<r,r>
		d=0;
		for(i=1;i<=n;i++){
			x[i]=x[i]+t*v[i];
			r[i]=r[i]-t*z[i];
            d=d+r[i]*r[i];
		}//for

		if(d<=pow(0.00000001,n)) break;

		//v=r+(d/c)v,c=d
		for(i=1;i<=n;i++) v[i]=r[i]+(d/c)*v[i];
		c=d;

		//output k,x,r
		printf("step %d:\n",k);
        for(i=1;i<=n;i++){

			printf("x[%d]=%f\tr[%d]=%f\n",i,x[i],i,r[i]);

		}//for
		cout<<endl;
	}//for
	
    cout<<"Try again?<y/n>";
	cin>>tag;
	cout<<endl;

	if(tag=='y') goto L;

	free(A);
	free(b);
	free(v);
	free(x);
	free(z);
	free(r);

}//main
		



⌨️ 快捷键说明

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