C++实现Cholesky分解

题目:
编制程序求解矩阵 A 的 Cholesky 分解,并用程序求解方程组 Ax=b,其中
在这里插入图片描述
在这里插入图片描述

代码实现:

#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;
//Cholesky 分解
void Cholesky(double a[4][4], double L[4][4], int m, int n) {
	for (int j = 0; j < n; j++)
	for (int i = j; i < m; i++) {
		if (i == j) {
			double sum = 0;
			for (int k = 0; k < j; k++) {
				sum = sum + L[j][k] * L[j][k];
}
			L[i][j] = sqrt(a[i][j] - sum);
}
		else {
				double sum = 0;
				for (int k = 0; k < j; k++) {
					sum = sum + L[i][k] * L[j][k];
}
				L[i][j] = (a[i][j] - sum) / L[j][j];
}
}
}
//初始化矩阵 L
void InitL(double L[4][4], int m, int n) {
	for (int i = 0; i < m; i++)
		for (int j = 0; j < n; j++) {
			if (i < j) {
				L[i][j] = 0;
}
}
}
//显示 L 和 LT 矩阵
void Display(double L[4][4], double LT[4][4], int m, int n) {
	cout << "Cholesky 分解的 L 矩阵为:" << endl;
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			cout << setprecision(8) << setw(12) << L[i][j] << "";
}
		cout << endl;
}
	cout << "Cholesky 分解的 LT 矩阵为:" << endl;
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			cout << setprecision(8) << setw(12) << L[j][i] << "";
			LT[i][j] = L[j][i];
}
		cout << endl;
}
}
//Ax=b 的解答 中间步骤求 y
double* SolveOne(double L[4][4], double b[4], int m, int n) {
	static double y[4];
	y[0] = b[0] / L[0][0];
	for (int i = 1; i < m; i++) {
		double sum = 0;
		for (int k = 0; k < i; k++) {
			sum = sum + L[i][k] * y[k];
}
		y[i] = (b[i] - sum) / L[i][i];
}
	cout << "解答的中间结果 y 为:" << endl;
	for (int i = 0; i < m; i++) {
		cout << setprecision(8) << setw(12) << y[i] << endl;
}
	cout << endl;
	return y;
}
//Ax=b 的解答 最终结果
void SolveTwo(double L[4][4], double y[4], int m, int n) {
	double x[4];
	x[m - 1] = y[m - 1] / L[n - 1][n - 1];
	for (int i = m - 2; i >= 0; i--) {
		double sum = 0;
		for (int k = i + 1; k < m; k++) {
			sum = sum + L[k][i] * x[k];
}
		x[i] = (y[i] - sum) / L[i][i];
}
	cout << "解答的最终结果 x 为:" << endl;
	for (int i = 0; i < m; i++) {
		cout << setprecision(8) << setw(12) << x[i] << endl;
}
	cout << endl;
}
//主函数
int main() {
	double a[4][4] = { {2,1,-1,1},{1,5,2,7},{-1,2,10,1},{1,7,1,11} };
	double b[4] = { 13,-9,6,0 };
	double L[4][4];//L 矩阵
	double LT[4][4];//LT 矩阵
	double* y;//中间矩阵 y
	InitL(L, 4, 4);//初始化矩阵 L
	Cholesky(a, L, 4, 4);//Cholesky 分解矩阵 A
	Display(L, LT, 4, 4);//显示矩阵 L 和 LT
	//求解原方程 Ax=b 中间步骤:L*y = b; LT*x = y;
	y = SolveOne(L, b, 4, 4);
	SolveTwo(L, y, 4, 4);
	return 0;
}

数值结果:
在这里插入图片描述

分析:
首先对 A 矩阵进行 Cholesky 分解,得到 L 矩阵,然后通过中间矩阵 y 求解矩阵 x。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想学摄影的IT男

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值