共轭梯度法、 最速下降法求解大规模稀疏方程组【Matlab】

2023-12-29 02:20

本文主要是介绍共轭梯度法、 最速下降法求解大规模稀疏方程组【Matlab】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

针对此题,可分别用共轭梯度法、 最速下降法求解线性方程组。

程序如下:

附录1   共辄梯度法求解大规模稀疏方程组程序

附录2   三对角矩阵A、右端项b生成程序

附录3   最速下降法求解线性方程组程序

% 附录1 共轭梯度法求解大规模稀疏方程组程序
%% 利用共轭梯度法求解大规模稀疏方程组
clear       %清除变量
clc         %清除命令行窗口代码
aa=input('\n请选择系数矩阵A、右端项b的输入方式:\n从文件中输入数据请输入0,\n从命令行窗口输入数据请输入1\n');
if aa==0A = load('data_A.txt');b = load('data_b.txt');
end
if aa==1A=input('\n请输入系数矩阵A(对称正定):\n');b=input('\n请输入线性方程组的右端项b:\n');
end
[n1,n2]=size(A);           %求解矩阵维数
n3=length(b);
if n1==n3 && n2==n3        %验证A、b维数是否相等n=n1;
elsefprintf('\nA、b维数不相等,程序结束。\n')return;
end
[R,flag] = chol(A);        %验证A是否对称正定
if flag ~= 0fprintf('\nA不是对称正定矩阵,程序结束。\n');return;
end
accuracy = input('\n请输入计算要求的精度:\n');   %给定计算要求的精度
x(:,1) = zeros(n,1);                               %给定初始向量
r(:,1) = b-A*x(:,1);
y1(1)=log10(norm(r(:,1)));                         %初始残差取对数
d(:,1)= r(:,1);                                     %搜索方向
for k=1:nalpha(k)=(r(:,k))'*d(:,k)/((d(:,k))'*A*d(:,k));  %最佳步长x(:,k+1)= x(:,k)+alpha(k)*d(:,k);r(:,k+1)= b-A*x(:,k+1);y1(k+1)=log10(norm(r(:,k+1)));       %纵轴为误差取对数if norm(r(:,k+1))<=accuracybreak;elsebeta(k)=-(r(:,k+1))'*A*d(:,k)/((d(:,k))'*A*d(:,k));d(:,k+1)=r(:,k+1)+beta(k)*d(:,k);end
end
figure;
plot([0:k],y1,'- r o', 'markersize',2)
xlabel('迭代步数');
ylabel('误差(取对数)');
title(['n=',num2str(n),'时的收敛速度图']);
grid;
xlswrite('data_x_result.xls', x(:,k+1), 'sheet1');   
%将x结果以“.xls”格式保存至“程序所在文件夹”目录下
fprintf('\n所求线性方程组的解为:\n')          %显示x数值解结果
fprintf('%.6f\n',x(:,k+1))% 附录2 三对角矩阵A、右端项b生成程序
%% 三对角矩阵A、右端项b生成
clear       %清除变量
clc         %清除命令行窗口代码
n = input('请输入系数矩阵A的阶数n:\n');
a = input('请输入系数矩阵A第n行第n-1、n、n+1个数:\n');
A= zeros(n,n);
A(1,1:2)=-[a(2),a(3)];
A(n,n-1:n)=-[a(1),a(2)];
for i=2:n-1A(i,i-1:i+1)=-[a(1),a(2),a(3)];
end
b = zeros(n,1);
b(1)=1;
b(n)=1;
csvwrite('data_A.txt', A);
csvwrite('data_b.txt', b);% 附录3 最速下降法求解线性方程组程序
%% 最速下降法,求解线性方程组Ax=b
clear       %清除变量
clc         %清除命令行窗口代码
aa=input('\n请选择系数矩阵A、右端项b的输入方式:\n从文件中输入数据请输入0,\n从命令行窗口输入数据请输入1\n');
if aa==0A = load('data_A.txt');b = load('data_b.txt');
end
if aa==1A=input('\n请输入系数矩阵A(对称正定):\n');b=input('\n请输入线性方程组的右端项b:\n');
end
[n1,n2]=size(A);           %求解矩阵维数
n3=length(b);
if n1==n3 && n2==n3        %验证A、b维数是否相等n=n1;
elsefprintf('\nA、b维数不相等,程序结束。\n')return;
end
[R,flag] = chol(A);        %验证A是否对称正定
if flag ~= 0fprintf('\nA不是对称正定矩阵,程序结束。\n');return;
end
accuracy = input('\n请输入计算要求的精度:\n');   %给定计算要求的精度
x(:,1) = rand(n,1);                     %给定初始向量
r(:,1)=b-A*x(:,1);   y(1)=log10(norm(r(:,1)));   %初始残差取对数
k=1;
while norm(r(:,k))> accuracyalpha=(r(:,k))'*r(:,k)/(r(:,k)'*A*r(:,k));x(:,k+1) =x(:,k)+alpha*r(:,k);r(:,k+1)=b-A*x(:,k+1);y(k+1)=log10(norm(r(:,k+1)));           %残差取对数k=k+1;
end
figure;
plot([0:k-1],y,'- r o', 'markersize',2)
xlabel('迭代步数');
ylabel('误差');
title(['n=',num2str(n),'时的收敛速度图']);
grid;
xlswrite('data_x_result.xls', x(:,k), 'sheet1');
fprintf('\n所求线性方程组的解为:\n')
fprintf('%.6f\n',x(:,k))

此处仅展示了代码实现,具体算法原理可参考《数值分析》等有关书籍,或在博主“资源”下载页面,下载相关文档进行查看。

计算方法-上机作业-示例【仅供交流参考】-统计分析文档类资源-CSDN文库icon-default.png?t=M85Bhttps://download.csdn.net/download/m0_56425991/87264676

这篇关于共轭梯度法、 最速下降法求解大规模稀疏方程组【Matlab】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/548056

相关文章

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

✨机器学习笔记(二)—— 线性回归、代价函数、梯度下降

1️⃣线性回归(linear regression) f w , b ( x ) = w x + b f_{w,b}(x) = wx + b fw,b​(x)=wx+b 🎈A linear regression model predicting house prices: 如图是机器学习通过监督学习运用线性回归模型来预测房价的例子,当房屋大小为1250 f e e t 2 feet^

libsvm在matlab中的使用方法

原文地址:libsvm在matlab中的使用方法 作者: lwenqu_8lbsk 前段时间,gyp326曾在论坛里问libsvm如何在matlab中使用,我还奇怪,认为libsvm是C的程序,应该不能。没想到今天又有人问道,难道matlab真的能运行libsvm。我到官方网站看了下,原来,真的提供了matlab的使用接口。 接口下载在: http://www.csie.ntu.edu.

AI学习指南深度学习篇-带动量的随机梯度下降法的基本原理

AI学习指南深度学习篇——带动量的随机梯度下降法的基本原理 引言 在深度学习中,优化算法被广泛应用于训练神经网络模型。随机梯度下降法(SGD)是最常用的优化算法之一,但单独使用SGD在收敛速度和稳定性方面存在一些问题。为了应对这些挑战,动量法应运而生。本文将详细介绍动量法的原理,包括动量的概念、指数加权移动平均、参数更新等内容,最后通过实际示例展示动量如何帮助SGD在参数更新过程中平稳地前进。

Matlab/Simulink中PMSM模型的反电动势系数和转矩系数

Matlab/Simulink中PMSM模型的反电动势系数和转矩系数_matlab pmsm-CSDN博客

AI学习指南深度学习篇-带动量的随机梯度下降法简介

AI学习指南深度学习篇 - 带动量的随机梯度下降法简介 引言 在深度学习的广阔领域中,优化算法扮演着至关重要的角色。它们不仅决定了模型训练的效率,还直接影响到模型的最终表现之一。随着神经网络模型的不断深化和复杂化,传统的优化算法在许多领域逐渐暴露出其不足之处。带动量的随机梯度下降法(Momentum SGD)应运而生,并被广泛应用于各类深度学习模型中。 在本篇文章中,我们将深入探讨带动量的随

MATLAB层次聚类分析法

转自:http://blog.163.com/lxg_1123@126/blog/static/74841406201022774051963/ 层次聚类是基于距离的聚类方法,MATLAB中通过pdist、linkage、dendrogram、cluster等函数来完成。层次聚类的过程可以分这么几步: (1) 确定对象(实际上就是数据集中的每个数据点)之间的相似性,实际上就是定义一个表征

2024 年高教社杯全国大学生数学建模竞赛题目——2024 年高教社杯全国大学生数学建模竞赛题目的求解

2024 年高教社杯全国大学生数学建模竞赛题目 (请先阅读“ 全国大学生数学建模竞赛论文格式规范 ”) 2024 年高教社杯全国大学生数学建模竞赛题目 随着城市化进程的加快、机动车的快速普及, 以及人们活动范围的不断扩大,城市道 路交通拥堵问题日渐严重,即使在一些非中心城市,道路交通拥堵问题也成为影响地方经 济发展和百姓幸福感的一个“痛点”,是相关部门的棘手难题之一。 考虑一个拥有知名景区