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

📄 1.cpp

📁 解n阶线形方程组Ax=b的列主元高斯消去法的通用程序如下(下列程序都是在 matlab平台下编写的)
💻 CPP
字号:

template<class T>
void BandMtx<T>::GaussElimPP(Vcr<T>&bb) const{
	if (nrows != bb.size())
		error("matrix-vector sizes not match");
	BandMtx<T> tx(nrows,bwleft,min(nrows-1,bwleft+bwrit));
	 for(int i=0;i<nrows;i++)
       for(int j=-bwleft;j<=bwrit;j++)
		   tx[i][j]=bdmx[i][j];
	   Vcr<int> pvt(nrows);  //保存主元信息
	     
	   //部分列主元的LU分解
	   const int nrowsmone=tx.nrow-1;
	   for (int k=0;k<nrowsmone-k;k++){
        int kbrow=min(nrowsmone-k,tx.bwleft);
		int kbcol=min(nrowsmone-k,tx.bwrit);

		//找第k列的主元
		int pc=k;
		double aet=abs(tx[k][0]);
		for (int i=1;i<=kbrow;i++)
		{if (abs(tx[k+i][-i])>aet)
		{ aet=abs(tx[k+i][-i]);
		    pc=k+i;
		}
		}
		if(!aet) error("pivot is zero in GaussElimPP");
		pvt[k]=pc;


		//交换U,而不是L的主元行和第k行
		if(pc!=k){
			for(int j=0;j<=kbcol;j++)
				swap(tx[pc][k+j-pc],tx[k][j]);
		}


		//接下来消去该列元素
		for(int i=1;i<=kbrow;i++){
			int kpi=k+i;
			if (tx[kpi][-i]!=0){
				T dmul=tx[kpi][-i]/tx[k][0];
                tx[kpi][-i]=dmul;
				for(int j=1;j<=kbcol;j++)
					tx[kpi][j-i]-=dmul*tx[k][j];
			}
		}
}
  


//向前代入法求解LY=Pb
for(int k=0; k<nrowsmone;k++){
	int kbrow=min(nrowsmone-k,tx.bwleft);
	int pvtk=pvt[k];
	T sb=bb[pvtk];
	if(k!=pvtk)
		swap(bb[k],bb[pvtk]);
	 for(int j=1;j<=kbrow;j++)
		 bb[k+j]-=tx[k+j][-j]*sb;
}


//向后代入法求解Ux=y
for(int k=nrowsmone;k>=0;k--){
	int kb=min(nrowsmone-k,tx.bwrit);
	for(int j=1;j<=kb;j++) bb[k]-=tx[k][j]*bb[k+j];
	bb[k]/=tx[k][0];
}
}   //GaussElimpp()结束


		

⌨️ 快捷键说明

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