算法导论LUP分解

#include<iostream>
#include<math.h>

using namespace std;

void Swap(double *a,double *b) {//交换函数 
	double temp=*a;
	*a=*b;
	*b=temp;
}
void Swap1(int *a,int *b) {//交换函数 
	int temp=*a;
	*a=*b;
	*b=temp;
}


double Round(double dVal, short iPlaces) {//四舍五入保留小数位数 
    double dRetval;
    double dMod = 0.0000001;
    if (dVal<0.0) dMod=-0.0000001;
    dRetval=dVal;
    dRetval+=(5.0/pow(10.0,iPlaces+1.0));
    dRetval*=pow(10.0,iPlaces);
    dRetval=floor(dRetval+dMod);
    dRetval/=pow(10.0,iPlaces);
    return(dRetval);
}


void Input(double **A,double *b,int n) {
	int i,j;
	cout<<"请输入A矩阵:"<<endl; 
	for(i=1;i<=n;i++) {
		for(j=1;j<=n;j++) {
			cin>>A[i][j];
		}
	}
	
	cout<<"请输入b数组:"<<endl;
	for(i=1;i<=n;i++) {
		cin>>b[i];
	} 
}

void LUP_DECOMPOSITION(double **A,double **L,double **U,int *P,int n) {
	int i,j,k,k1;
	double temp,temp1;;
	for(i=1;i<=n;i++) {
		P[i]=i;
	}
	
	for(k=1;k<=n;k++) {
		int p=0;
		for(i=k;i<=n;i++) {
			if(fabs(A[i][k])>p) {
				p=fabs(A[i][k]);
				k1=i;
			}
		}
		if(p==0) {
			cout<<"singular matrix"<<endl;
		} else {
			Swap1(&P[k],&P[k1]);
		}
		
		for(i=1;i<=n;i++) {
			Swap(&A[k][i],&A[k1][i]);
		} 
		
		for(i=k+1;i<=n;i++) {
			temp=A[i][k]/A[k][k];
			A[i][k]=Round(temp,2);
		for(j=k+1;j<=n;j++) {
			temp=A[i][k]*A[k][j];
			temp1=Round(temp,2);
			A[i][j]=A[i][j]-temp1;
		}
	}
}
        for(i=1;i<=n;i++) {
        	for(j=1;j<=n;j++) {
        		if(i==j) {
        			L[i][j]=1;
				} else {
					if(i<j) {
						L[i][j]=0;
					} else {
						L[i][j]=A[i][j];
					}
				}
			}
		}
		
		for(i=1;i<=n;i++) {
        	for(j=1;j<=n;j++) {
        		if(i<=j) {
        			U[i][j]=A[i][j];
			} else {
				U[i][j]=0;
			}
		}
	}	

}

void LUP_SOLVE(double **A,double **L,double **U,int *P,double *x,double *y,double *b,int n) {
	int i,j;
	double sum,temp;
	y[1]=b[P[1]];
	for(i=2;i<=n;i++) {
		sum=0.0;
		for(j=1;j<=i-1;j++) {
			temp=L[i][j]*y[j];
			sum+=Round(temp,2);
		}
		y[i]=b[P[i]]-sum;
	}
	
	temp=y[n]/U[n][n];
	x[n]=Round(temp,2);
	for(i=n-1;i>=1;i++) {
		sum=0.0;
		for(j=i+1;j<=n;j++) {
			temp=U[i][j]*x[j];
			sum+=Round(temp,2);
		}
		temp=(y[i]-sum)/U[i][i];
		x[i]=Round(temp,2);
	}
}

void Print(double *x,int n) {
	int i,j;
	for(i=1;i<=n;i++) {
		cout<<x[i]<<"\t";
	}
}

void PrintL(double **L,int n) {
	int i,j;
	for(i=1;i<=n;i++) {
		for(j=1;j<=n;j++) {
			cout<<L[i][j]<<"\t";
		}
		cout<<endl;
	}
}

void Delete(double **A,double **L,double **U,double *x,double *y,double *b,int *P,int n) {
	int i,j;
	for(i=1;i<=n;i++) {
		delete []L[i];
	}
	delete []L;
	
	for(i=1;i<=n;i++) {
		delete []U[i];
	}
	delete []U;
	
	for(i=1;i<=n;i++) {
		delete []A[i];
	}
	delete []A;
	
	delete []P;
	delete []x;
	delete []y;
	delete []b;
}
	
int main() {
	int n;
	double *x=NULL;
    double *y=NULL;
	double **L=NULL;
	double **U=NULL;
	int     *P=NULL;
	double **A=NULL;
	double *b=NULL;
	cin>>n;
	int i=0; 
	L=new double*[n+1];
	for(i=1;i<=n;i++) {
		L[i]=new double[n+1];
	}
	
	U=new double*[n+1];
	for(i=1;i<=n;i++) {
		U[i]=new double[n+1];
	}
	
	A=new double*[n+1];
	for(i=1;i<=n;i++) {
		A[i]=new double[n+1];
	}
	
	P=new int[n+1];
	x=new double[n+1];
	y=new double[n+1];
	b=new double[n+1];
	 
	Input(A,b,n);
	LUP_DECOMPOSITION(A,L,U,P,n);
	LUP_SOLVE(A,L,U,P,x,y,b,n);
	Print(x,n);
	PrintL(L,n);
	Delete(A,L,U,x,y,b,P,n);
	return 0;
}

/*
2 0 2 0.6
3 3 4 -2
5 5 4 2
-1 -2 3.4 -1

1 2 0
3 4 4
5 6 3
*/



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,LUP分解是一种常见的线性方程组求解方法。它通过将矩阵分解为一个下三角矩阵(L)、一个上三角矩阵(U)和一个置换矩阵(P)的乘积来解决线性方程组。在LUP分解中,引入了一个选择步骤,以解决可能导致无法进行LUP分解的情况。以下是一个使用LUP分解解决线性方程组的Python代码示例: ```python def solve_by_lup(A, b): L, U, P = lup_decomposition(A) # 进行LUP分解 pb = P * Matrix([[num for num in b]) # 对向量b进行置换 pb_values = [i for i in pb.__lines # 将置换后的向量转换为列表 return solve(L, U, pb_values) # 使用代入法求解方程组 # 示例用法 A = Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 10]]) b = [3, 6, 9] x = solve_by_lup(A, b) print(x) ``` 在上述代码中,`lup_decomposition`函数用于进行LUP分解,`solve`函数用于使用代入法求解方程组。通过调用`solve_by_lup`函数,传入矩阵A和向量b,即可得到线性方程组的解x。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [python实现LU分解LUP分解](https://blog.csdn.net/qq_43409560/article/details/123928976)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [5.2 LUP分解](https://blog.csdn.net/m0_66201040/article/details/123812692)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值