Matlab——C++常用算法

一、求解对称正定方程组的平方根

 Matlab——C++常用算法_第1张图片

代码:

%% 0.平方根法解线性方程组,输出L矩阵和根

%% 1.对称正定矩阵的Cholesky分解

%对称正定矩阵A存在唯一的对角元素均为正数的下三角矩阵L,使得A=L*L(转置)

%这种分解叫做Cholesky分解

A=[3,3,5;3,5,9;5,9,17];

b=[0;-2;-4];

%判断矩阵A是否对称正定,对称+所有顺序主子式为正

L=zeros(3);

%求下三角矩阵L

L(1,1)=sqrt(A(1,1));%L11

L(2,1)=A(2,1)/L(1,1);%L21

L(3,1)=A(3,1)/L(1,1);%L31

L(2,2)=sqrt(A(2,2)-L(2,1)*L(2,1));%L22

L(3,2)=(A(3,2)-L(3,1)*L(2,1))/L(2,2);%L32

L(3,3)=sqrt(A(3,3)-L(3,1)*L(3,1)-L(3,2)*L(3,2));%L33

L%输出L矩阵

%% 2.由Ly=b得到y

y=L\b;

%% 3.由L_转置*x=y得到方程组的解x

x=L'\y%输出线性方程组的根

运行结果:

Matlab——C++常用算法_第2张图片

 二、高斯赛德尔迭代法求解线性方程组

Matlab——C++常用算法_第3张图片

代码:

clear;clc

format compact

%% 输入线性方程组矩阵,A为系数矩阵,C为常数列向量。

A = [7 2 1 -2 ;

9 15 3 -2 ;

-2 -2 11 5

1 3 2 13];% 相关系数矩阵

C = [4;7;-1;0];% 常数列向量

n=length(A);

X = ones(n,1);

Error_eval = ones(n,1);

%% 检查矩阵是否是完全严格对角占优矩阵,如果不是则无解。

for i = 1:n

j = 1:n;

j(i) = [];

B = abs(A(i,j));

Check(i) = abs(A(i,i)) - sum(B);

if Check(i) < 0

fprintf('矩阵在第%3i行上不是严格的对角线\n\n',i)

end

end

%% 迭代过程如下

k = 0;

while max(Error_eval) > 0.001

k = k + 1;

Z = X;

for i = 1:n

j = 1:n;

j(i) = [];

Xtemp = X;

Xtemp(i) = [];

X(i) = (C(i) - sum(A(i,j) * Xtemp)) / A(i,i);

end

Xsolution(:,k) = X;

Error_eval = sqrt((X - Z).^2);

end

%% 结果

GaussSeidelTable = [1:k;Xsolution]' %输出迭代过程

Solution = [A X C] %输出迭代结果

运行结果:

以上为在Maltab中实现C++的基本运算。

 

 

 

 

你可能感兴趣的:(matlab,c++,算法)