首页 > 其他分享 >(二)计算机数值方法之Cholesky分解法

(二)计算机数值方法之Cholesky分解法

时间:2024-03-31 15:59:16浏览次数:13  
标签:10 Cholesky ++ double 矩阵 数值 int 分解 include

数学问题:

利用 Cholesky分解法解决线性方程问题Ax=b,其中(A,b)分别为:

解决代码:

​
#include "windows.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <iomanip>
#include <math.h>
using namespace std;
void SolverEqCholesky(double** A, double* b, int n, double* x);
int main()
{
	
	int i, n;
	double** A, * b, * x;
	//输入维数
	cin >> n;
	A = new double* [n];
	b = new double[n];
	x = new double[n];
	for (i = 0; i < n; i++)
	{
		A[i] = new double[n];
	}
	//输入系数矩阵和向量
	for (i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cin >> A[i][j];
		}
	}
	for (int i = 0; i < n; i++)
	{
		cin >> b[i];
	}
	//计算
	SolverEqCholesky(A, b, n, x);
	//输出
	for (i = 0; i < n; i++)
	{
		cout << fixed << setprecision(6) << x[i] << " ";
	}
	delete[]b;//释放内存
	delete[]x;
	for (i = 0; i < n; i++)
	{
		delete[]A[i];
	}
	
	return 0;
}
double** two_array_malloc(int m, int n)   //二维数组分配
{
	double** a;
	int i, j;
	a = (double**)malloc(m * sizeof(double*));
	for (i = 0; i < m; i++)
	{
		a[i] = (double*)malloc(n * sizeof(double));
		for (j = 0; j < n; j++)
		{
			a[i][j] = 0;
		}
	}
	return a;
}
void two_array_clear(double** a, int m)   //二维数组释放
{
	int i;
	for (i = 0; i < m; i++)
	{
		delete[] a[i];
	}
	delete[] a;
}
bool blabel = true;
void SolverEqCholesky(double** A, double* b, int n, double* x)
{
	int  i, j, k;
	double** a;
	double temp;
	a = two_array_malloc(n, n + 1);
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			a[i][j] = A[i][j];
		}
		a[i][n] = b[i];
	}
	double** L;
	L = two_array_malloc(n, n);
	//分解过程
	//==============begin1===============
	for (j = 0; j < n; j++)
	{
		double qiuhe = 0;
		for (k = 0; k < j ; k++)
		{
			qiuhe = qiuhe + L[j][k] * L[j][k];
		}
		L[j][j] = sqrt(abs(a[j][j] - qiuhe));
		
		for (i = j+1; i < n; i++)
		{
			double qiuh = 0;
			for (k = 0; k <j; k++)
			{
				qiuh=qiuh+ L[i][k] * L[j][k];
			}
			L[i][j] = (a[i][j] - qiuh) / L[j][j];
		}
	}
	//==============end1=================
	double** tem;
	tem = two_array_malloc(2, n);
	//回代过程
	//==============begin2===============
	for (i = 0; i < n; i++)
	{
		double qiu = 0;
		for (int j = 0; j < i; j++)
		{
			qiu = qiu + L[i][j] * tem[0][j];
		}
		tem[0][i] = (a[i][n] - qiu) / L[i][i];
	}
	for (i = n - 1; i >= 0; i--)
	{
		double qi = 0;
		for (int j = i + 1; j < n; j++)
		{
			qi = qi + L[j][i] * tem[1][j];
		}
		tem[1][i] = (tem[0][i] - qi) / L[i][i];
	}
	//==============end2=================
	//输出解(在编辑区填写代码)
	//==============begin3===============
	for (i = 0; i < n; i++)
	{
		x[i] = tem[1][i];
	}
	two_array_clear(a, n);
	two_array_clear(L, n);
	two_array_clear(tem, 2);
	//==============end3=================
}

​

使用方法:

第一行是矩阵维度:n ;

后面的n行,输入n维矩阵A;

最后一行输入未知向量的值b

例如:

矩阵为:A=[[10,7,8,7],[7,5,6,5],[8,6,10,9],[7,5,9,10]]

向量为:b=[32,23,33,31]

测试输入:

4

10 7 8 7

7 5 6 5

8 6 10 9

7 5 9 10

32 23 33 31

预期输出: 1.000000 1.000000 1.000000 1.000000

问题解决:

注意:

Cholesky分解法的使用对象与(一)中的Gauss列主元素消去法略有不同。它主要用于对称正定的线性方程组,其矩阵必须是对称且正定的。该方法将对称正定矩阵分解成下三角矩阵的转置和该下三角矩阵之间的乘积。其计算效率较高,特别在处理大型对称正定矩阵时效果更为明显。由于其对称正定矩阵的性质,Cholesky分解通常更为稳定,能够减少数值误差的传播。

标签:10,Cholesky,++,double,矩阵,数值,int,分解,include
From: https://blog.csdn.net/szt12345__/article/details/137060129

相关文章

  • c语言:用do-while输出前40项的斐波那契数值
    求Fibonacci数列的前40个元素。该数列的特点是第1、2两个数为1、1。从第3个数开始,每数是其前两个数之和。  分析:从题意可以用如下等式来表示斐波那契数列:     1,1,2,3,5,8,13,21…     f1=1     (n=1)     f2=1   ......
  • 基于 FlexLua 开源代码4G远程上报水表电表数值
    基于FlexLua开源代码4G远程上报水表电表数值1采集器和电表、水表连接方式采集器通过485总线可连接不同的水表和电表,每个表的RS485Modbus地址设置为不同即可。采集器通过4G无线传输方式,将采集到的电表数据(比如:三相电压,三相电流,功率因素,有功功率,频率)、水表(用水量)这些数......
  • 兼容模式下导致数值类型发生隐式转换,SQL在生产上无法正常使用案例
    兼容模式下导致数值类型发生隐式转换,SQL在生产上无法正常使用案例本文出处:https://www.modb.pro/db/403148基于MogDB版本V2.0.1问题现象厂商研发描述InsertSQL在生产上无法执行,而测试环境中同版本的数据库该SQL可以正常运行。检查SQL后,发现是很简单的insertinto......
  • Python环境下一种改进小波分解方法-用于多分量信号的分解
    小波通俗的讲就是一种振幅表现为在正负之间震荡的波形。小波变换在基于短时傅立叶变换的前提下,又加入了其所没有的可随频率变化的“时间-频率”窗口,其能对时间、频率进行局部化分析,并且对待处理信号通过多尺度处理使其表现为时-频细分的特点,是一种能突出信号时频特点以及细节的......
  • 数值分析复习:Newton-Cotes求积公式及复合求积公式
    文章目录1.中矩形公式2.梯形公式3.Simpson(辛普森)公式4.Newton-Cotes(牛顿-科特斯)求积公式5.各种求积公式的性质6.复合求积公式本篇文章适合个人复习翻阅,不建议新手入门使用本专栏:数值分析复习的前置知识主要有:数学分析、高等代数、泛函分析1.中矩形公式......
  • 数值分析复习:数值积分概述
    文章目录数值积分法基本概念插值型数值积分本篇文章适合个人复习翻阅,不建议新手入门使用本专栏:数值分析复习的前置知识主要有:数学分析、高等代数、泛函分析数值积分法基本概念定义:数值积分公式数值积分法是指逼近I......
  • QMIX:用于深度多智能体强化学习的单调值函数分解
    目录QMIX:MonotonicValueFunctionFactorisationfor DeepMulti-AgentReinforcementLearningQMIX:用于深度多智能体强化学习的单调值函数分解Abstract 摘要1Introduction引言2RelatedWork 2相关工作3Background 3背景 3.1Deep Q-Learning 3.1深......
  • 【基于价值分解网络的多智能体协同学习】【VDN】 【Value-Decomposition Networks For
    目录Value-DecompositionNetworksForCooperativeMulti-AgentLearning基于价值分解网络(VDN)的多智能体协同学习Abstract 摘要1Introduction引言1.1OtherRelatedWork 1.1其他相关工作2Background 2背景2.1ReinforcementLearning2.1强化学习​2.2De......
  • 剑指offerJZ20题 表示数值的字符串 java
    描述剑指offerJZ20题表示数值的字符串请实现一个函数用来判断字符串str是否表示数值(包括科学计数法的数字,小数和整数)。科学计数法的数字(按顺序)可以分成以下几个部分:1.若干空格2.一个整数或者小数3.(可选)一个‘e’或‘E’,后面跟着一个整数(可正可负)4.若干空格......
  • 自制lilypond中文命令包,包含音阶、调式、和弦、分解、节奏等基础板块
    可以使用中文命令打lilypond,包括输出音阶、调式、和弦、和弦分解、节奏等,示例如下  下面是示例文件,按需要删除%号\version"2.24.0"\language"english"\include"Chinesecommands.ly"{%大调与小调\音阶c'4\大调%\音阶c'4\小调%教会调......