%文件名:gauss_seidel.m
%实现高斯-赛德尔迭代算法
%函数原型:[x, k] = gauss_seidel(A, b, e)
%函数描述:高斯-赛德尔迭代法求线性方程组的解
%输入参数:A:未知数向量的系数矩阵;[A, b]:增广矩阵;e:误差限
%输出参数:x是线性方程组Ax = b的解;k是迭代次数;Ve是误差向量
%作者:尚明金
function [x, k, Ve] = gauss_seidel(A, b, e)
%A矩阵的大小必须为 NA x NA, b必须是NA x 1的列向量
%检查A是否是方阵
[NAr, NA] = size(A);
if NAr ~= NA, error('A is not a square matrix'); end
%检查A,b的大小是否匹配
[Nbr, Nb] = size(b);
if ((Nbr ~= NA) && (1 ~= Nb)), error('A and b have non-compatible dimensions'); end
%e不能小于计算机的最小精度
if e < eps, error('Limitation of Error is too small'); end
x = zeros(size(b));%初始解设置为与b同型的零向量
k = 0; %迭代次数的记数变量,初始量设为0
r = 1 + e; %前后项之间的误差
%构造D、B、f矩阵
D = diag(diag(A));
U = -triu(A, 1);
L = -tril(A, -1);
DsubL = (D - L);
B = inv(DsubL) * U;
f = inv(DsubL) * b;
%谱半径大于等于1就不收敛
% p = max(abs(eig(B)));
% if p >= 1 %%%%, error('Jacobi iteration method not convergent');
% return;
% end
%为了画图,返回误差向量
Ve = zeros(100, 1);
while r > e
x0 = x;
x = B*x0 + f;
k = k + 1;
r = max(abs(x - x0));
if k <= size(Ve, 1)
Ve(k,1) = r;
end
end
%谱半径大于等于1就不收敛
p = max(abs(eig(B)));
if p >= 1
sprintf('Jacobi iteration method not convergent');
%return
end
% %画图
% if k <= size(Ve, 1)
% Vk = 1 : 1 : k;
% %plot(Vk, Ve(1:k, 1));
% stem(Vk, Ve(1:k, 1));
% else
% Vk = 1 : 1 : size(Ve, 1);
% %plot(Vk, Ve);
% stem(Vk, Ve);
% end
% title('高斯-赛德尔迭代误差曲线');
% xlabel('迭代次数');
% ylabel('误差');
UnwellLineEquSet-matlab.zip_Hilbert矩阵病态线性方程组的计算_hslogic算法仿真_病态方程
版权申诉
174 浏览量
2022-07-14
00:14:08
上传
评论 1
收藏 6KB ZIP 举报
JonSco
- 粉丝: 67
- 资源: 1万+
最新资源
- 基于matlab实现多车辆车辆路径问题,用遗传算法编程,保证可用.rar
- 基于matlab实现多层极限学习机实现手写体识别,准确率超过99%.rar
- 基于matlab实现电力系统最优潮流程序,可以应用于电力市场下的最优潮流计算 适合电力系统专业的同仁使用.rar
- 串行通信的通信协议串口协议串行通信的通信协议串口协议
- Vue构建交互式的单页面应用程序Vue构建交互式的单页面应用程序
- Spring Boot快速搭建和部署应用程序
- Redis开源的高性键值存储系统广泛应用于缓存、实时消息传递
- Qt跨平台的应用程序开发框架Qt跨平台的应用程序开发框架
- 单片机是集成处理器、存储器和输入输出设备
- 深度学习机器习方法模仿人脑神经网络深度学习机器习方法模仿人脑神经网络
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0