线性方程求解器

  • 一、线性方程求解
  • 二、求解方法
    • 克莱姆法则
    • 高斯消元
    • 主元素法
    • LU分解法
    • 平方根法(A必须为正定矩阵)
    • 三角追赶法
    • 雅阁比迭代法
    • 高斯赛德尔迭代法
    • 松弛法
  • 三、测试及GUI
    • 测试
    • GUI

一、线性方程求解

部分代码参考网络,侵删

A0=[4 3 03 4 -10 -1 4];
b0=[16 20 -12]';

二、求解方法

克莱姆法则

function [ x ] = Cramer( A,b )
%CRAMER 此处显示有关此函数的摘要
%   此处显示详细说明
%用克莱姆法则求解方程组% n=input('方程个数=')
% A=input('系数矩阵A=')
% b=input('常数列向量b=')n=size(A,1);
if((size(A)~=[n,n])|(size(b)~=[n,1])) %判断矩阵A和向量b输入格式是否正确disp('输入不正确,要求A是n阶方阵,b是n维列向量') %disp:显示字符串x=0;
elseif det(A)==0   %判断系数行列式是否为零disp('系数行列式为零,不能用克莱姆法则解此方程。')
elsefor i=1:n   %计算x1,x2,...xnB=A;B(:,i)=b;x(i)=det(B)/det(A);endx=x'; %以列向量形式显示方程组的解
endend

高斯消元

function x=Gauss(A,b)
%参量说明:A,系数矩阵;B,常数列向量;zg,增广矩阵
%将增广矩阵化为上三角,再回带求解x
%此方法较为常规,将zg(k,k)元素乘以-zg(i,k)/zg(k,k)加到第i行
%从1:n-1列,主对角元素的以下行,通过两层循环来遍历
zg=[A,b];
zj=rref(zg);
n=length(b);
ra=rank(A);
rz=rank(zg);
temp=rz-ra;
if temp>0disp('无解');return;
end
if ra==rzif ra==nx=zeros(n,1);for p=1:n-1for k=p+1:nm=zg(k,p)/zg(p,p);zg(k,p:n+1)=zg(k,p:n+1)-m*zg(p,p:n+1);endendb=zg(1:n,n+1);A=zg(1:n,1:n);x(n)=b(n)/A(n,n);for q=n-1:-1:1x(q)=(b(q)-sum(A(q,q+1:n)*x(q+1:n)))/A(q,q);endend
end

主元素法

function [x]=Zhuyuansu(A,b)
%列主元素高斯消元法解线性方程组
n=0;
if length(b)==rank(A)n=rank(A);disp('方程有定解');
elseif length(b)>rank(A)disp('方程无解');
elsedisp('方程解不唯一');
end
%逐列寻找最大的元素并完成交换
for i=1:n-1max=abs(A(i,i)); %先假设主元素位置上的元素就是最大的m=i;for j=i:n     %逐行比较找到最大的元素并记录其位置if max<abs(A(j,i))max=abs(A(j,i));m=j;endendif(m~=i)  %主元素位置元素最大的假设失败了,发动行变换 for k=i:nc=A(i,k);A(i,k)=A(m,k);A(m,k)=c;end d=b(i);b(i)=b(m);b(m)=d;endfor k=i+1:n %逐行for j=i+1:n %逐列A(k,j)=A(k,j)-A(i,j)*A(k,i)/A(i,i);endb(k)=b(k)-b(i)* A(k,i)/A(i,i);A(k,i)=0;end
end
%三角矩阵已成,开始回代
x(n)=b(n)/A(n,n);
for i=n-1:-1:1sum=0;for j=i+1:nsum=sum+A(i,j)*x(j);endx(i)=(b(i)-sum)/A(i,i);
end
x=x';
% disp('方程组的解为:');
% x

LU分解法

function [ x ] = LU( A,b )
%LU 此处显示有关此函数的摘要
%   此处显示详细说明[L,U] =  MyLU(A);
[n,m] = size(A);
y(1)=b(1);
for i =2:n  for  j=1:i-1b(i)=b(i)-L(i,j)*y(j);endy(i)=b(i);
endx(n)=y(n)/U(n,n);
for  i=(n-1):-1:1for  j=n:-1:i+1y(i) =y(i)-U(i,j)*x(j);endx(i) =y(i)/U(i,i);
end
x=x';end

平方根法(A必须为正定矩阵)

function [ x ] = Choleskly( A,b )
%CHOLESKLY 此处显示有关此函数的摘要
%   此处显示详细说明n=length(A(:,1));
for k=1:nif (det(A(1:k,1:k))<=0)disp('矩阵不是正定矩阵,请重新运行程序');   x=0;return;end
end
%分解A=L*L'
for i=1:nt=0;for s=1:i-1t=t+L(i,s)^2;endL(i,i)=sqrt(A(i,i)-t);for k=i+1:nu=0;for s=1:i-1u=u+L(i,s)*L(k,s);endL(k,i)=(A(k,i)-u)/L(i,i);end
end
%分解AX=b为Ly=b  Lx=y%求y
for i=1:nr=0;for k=1:i-1r=r+L(i,k)*y(k);endy(i)=(b(i)-r)/L(i,i);
end
%求x
for i=n:-1:1q=0;for k=i+1:nq=q+L(k,i)*x(k);endx(i)=(y(i)-q)/L(i,i);
end
x=x'; %若要输出行向量,此处改为x即可end

三角追赶法

function [ x ] = Sanjiaozuigan( A,b )
%SANJIAOZUIGAN 此处显示有关此函数的摘要
%   此处显示详细说明
n=length(b);
U=zeros(n);
L=eye(n);
y=zeros(n,1);x=y;
%---------追--------
U(1,1)=A(1,1);y(1)=b(1);
for i=2:nL(i,i-1)=A(i,i-1)/U(i-1,i-1);U(i,i)=A(i,i)-L(i,i-1)*A(i-1,i);y(i)=b(i)-L(i,i-1)*y(i-1);U(i-1,i)=A(i-1,i);%U的上次对角线即为A的上次对角线
end
% L
% U
% y
%------赶--------
x(n)=y(n)/U(n,n);
for i=n-1:-1:1x(i)=(y(i)-A(i,i+1)*x(i+1))/U(i,i);
endend

雅阁比迭代法

function r = Jacobi(A,B,varargin)
sizeA=size(A);
sizev=size(varargin);
if sizev(2) == 0rol = 0.000001;n = 1000;x = zeros(sizeA(1),1);
elseif sizev(2) == 1rol = varargin{1};n = 1000;x = zeros(sizeA(1),1);
elseif sizev(2) == 2rol = varargin{1};n = varargin{2};x = zeros(sizeA(1),1000);
elseif sizev(2) == 3rol = varargin{1};n = varargin{2};x = varargin{3};
elseerror('输入参数过多');
end
for i = 2:nfor j = 1:sizeA(2)sum1=0;for k = 1:sizeA(1)if j == kcontinue;endsum1 = sum1 - x(k,i-1)*A(j,k)/A(j,j);endx(j,i)=B(j)/A(j,j)+sum1;endif any(abs(x(:,i)-x(:,i-1))>rol) == 0break;end
end
r = x;
end

高斯赛德尔迭代法

function x=GaussSeidelIteration(a,b,precision,x)
%时间:2013/12/08 姓名:邓能财
disp('%GaussSeidel——迭代法求解线性方程组')
if nargin<4,  x=zeros(dim,1);
elseif nargin<3,  precision=1e-9; end
[dim,dim2]=size(a);
disp('迭代的方程为:x(k+1)=s*xk+f')
%错误的矩阵:
assert( dim==dim2 && dim==length(b),...['Argument input error:   ',...'Matrix dimensions must agree.'])
d=diag(diag(a))
a=a-d;
l=-tril(a)
u=-triu(a)
invd_l=inv(d-l)
s=invd_l*u
f=invd_l*b
x_=ones(dim,1);
precision=precision/10;
x
iterationTimes=0
while any(abs(x-x_)>=precision)x_=x;x=s*x_+fiterationTimes=iterationTimes+1
end
end

松弛法

function [x, k] = LinearEquations_SSOR(A, b, x0, MaxIters, err, w)
%{函数功能:对超松弛迭代法求解线性方程组;
输入:A:系数矩阵b:常数矩阵;x0:初始解;MaxIters:最大迭代次数;err:精度阈值;w:松弛因子;
输出:x:近似解;k:迭代次数;
示例:
clear; clc;
A = [1, 1, 1; 1, 2, 3; 2, 1, 3];
b = [3; 6; 6];
x0 = [0; 0; 0];
MaxIters = 1000;
err = 1e-6;
w = 0.5;
[x, k] = LinearEquations_SSOR(A, b, x0, MaxIters, err, w);
%}
% = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
n = length(x0);
x1 = x0;
x2 = zeros(n, 1);
x3 = zeros(n, 1);
r = max(abs(b - A*x1));
k = 0;
while r > errfor i = 1 : nsum = 0;for j = 1 : nif j > isum = sum + A(i, j) * x1(j);elseif j < isum = sum + A(i, j) * x2(j);endendx2(i) = (1 - w)*x1(i) + w*(b(i) - sum) / (A(i, i) + eps);endfor i = n : -1 : 1sum = 0;for j = 1 : nif j > isum = sum + A(i, j) * x3(j);elseif j < isum = sum + A(i, j) * x2(j);endendx3(i) = (1 - w) * x2(i) + w * (b(i) - sum) / A(i, i);endr = max(abs(x3 - x1));x1 = x3;k = k + 1;if k > MaxItersx = [];return;end
end
x = x1;

三、测试及GUI

测试

直接测试每一个方法的求解结果

%% 克莱姆法则
[ x ] = Cramer(A0,b0)
%% 高斯消元
[ x ] = Gauss(A0,b0)
%% 主元素法
[ x ]=Zhuyuansu(A0,b0)
%% LU分解法
[ x ]=LU(A0,b0)
%% 平方根法(A必须为正定矩阵)
[ x ] = Choleskly(A0,b0)
%% 三角追赶法
[ x ] = Sanjiaozuigan(A0,b0)
%% 雅阁比迭代法
[ x ]=Jacobi(A0,b0,0)
%% 高斯赛德尔迭代法
x=GaussSeidelIteration(A0,b0,1e-6,[0 0 0 ]')
%% 松弛法
[x, k] = LinearEquations_SSOR(A0, b0, [0 0 0 ]', 200, 1e-6, 1.5)

GUI

方便用户操作,设计成GUI的方式

MATLAB线性方程求解器(GUI+9种方法)相关推荐

  1. MATLAB求解线性方程组的八种方法

    MATLAB求解线性方程组的八种方法 求解线性方程分为两种方法–直接法和迭代法 常见的方法一共有8种 直接法 Gauss消去法 Cholesky分解法 迭代法 Jacobi迭代法 Gauss-Seid ...

  2. matlab保存所有图,Matlab中图片保存的5种方法

    matlab的绘图和可视化能力是不用多说的,可以说在业内是家喻户晓的. Matlab提供了丰富的绘图函数,比如ez**系类的简易绘图函数,surf.mesh系类的数值绘图函数等几十个.另外其他专业工具 ...

  3. Matlab中数组元素引用——三种方法

    Matlab中数组元素引用--三种方法 1.Matlab中数组元素引用有三种方法 1 2 3 1.下标法(subscripts) 2.索引法(index) 3.布尔法(Boolean) 注意:在使用这 ...

  4. Matlab中计算程序运行时间的几种方法

    平常科研当中,当我们在看文献时,没看到一个优秀的算法时都有想要自己动手编程去实现的愿望,算法好坏可以用代码的运行时间来评估,在MATLAB中大致有以下几种方法来计算程序的运行时间: 1.tic和toc ...

  5. matlab读取cvs文件的几种方法

    matlab读取CVS文件的几种方法: 1,实用csvread()函数 csvread()函数有三种使用方法: 1.M = csvread('filename') 2.M = csvread('fil ...

  6. 计算机音乐播放器设置,Win7系统下设置默认音乐播放器的两种方法

    可能很多新手用户不知道Win7系统下怎么设置默认音乐播放器?我们习惯将某一程序设置为默认打开方式,音乐播放器也可以这样子的.一些用户想把酷狗播放器.或者qq音乐设置为默认音乐播放器,只要打开音乐文件, ...

  7. 用键盘打开计算机管理,windows10系统使用键盘打开设备管理器的三种方法

    我们经常都会通过设备管理器,来查看windows10系统中的硬件是否已经正常安装驱动.那么,在鼠标没用的情况下,该如何打开win10设备管理器呢?接下来,系统城小编给大家介绍下没有鼠标直接使用键盘打开 ...

  8. 如何用键盘打开设备管理器里计算机的属性,技巧:在Windows10系统中使用键盘打开设备管理器的三种方法...

    我们经常使用设备管理器来检查Windows10系统中的硬件是否已正确安装驱动程序. 那么,当鼠标无用时如何打开win10设备管理器?接下来,System City的编辑器将介绍三种方法,无需使用键盘即 ...

  9. Matlab 计算均方误差MSE的三种方法

    Matlab 计算均方误差MSE的三种方法 数据说明: ytest 测试集y,真实的y值,是一维数组: ytest_fit 基于测试集 x 预测的y值,是一维数组: test_error 是预测误差. ...

最新文章

  1. ADPRL - 近似动态规划和强化学习 - Note 8 - 近似策略迭代 (Approximate Policy Iteration)
  2. Find The Multiple POJ - 1426(只包含01的十进制倍数(同余模定理))
  3. 干货|2018物流机器人行业报告发布!不容错过
  4. JVM 调优(学习篇)
  5. js调用.net后台事件,和后台调用前台等方法总结
  6. 20应用统计考研复试要点(part21)--概率论与数理统计
  7. EcmaScript正則表達式( 深入淺出系列之淺出 )
  8. for each java_Java 实例 - for 和 foreach循环使用
  9. Windows 编程[11] - WM_SIZE 消息
  10. nest.js 使用express需要提供多个静态目录的操作
  11. 【转载】白话经典算法系列之三 希尔排序的实现
  12. snb处理器hd3000显卡专用extra_Intel十代酷睿处理器:移动平台性能有了质飞跃!...
  13. 实验吧 因缺思汀的绕过 By Assassin(with rollup统计)
  14. 哥伦比亚大学计算机科学硕士排名,哥伦比亚大学计算机科学硕士排名第16(2020年TFE Times排名)...
  15. [Tips]Ubuntu20.04域名解析失败或网速很慢
  16. SRP Batcher:提升您的渲染性能
  17. 47 软件工程34h-北京大学孙艳春老师
  18. ctf的flask模板注入config、current_app、url_for和get_flashed_messages(转自浩哥)
  19. 云服务器(阿里云)的简单应用
  20. C语言实现无符号乘法

热门文章

  1. 学习软件设计的非功能性需求
  2. 660测试软件,联发科P60还是骁龙660?联发科P60和骁龙660游戏测试详细对比
  3. 什么是Ajax ? 为什么要学习Ajax jQuery中的Ajax怎么使用 10
  4. 谷歌浏览器版本查看方法
  5. 构建网站从0开始 -3 网络建站 织梦建站培训
  6. 大屏统计图可以有多炫
  7. 主流的关系型数据库的市场占有率?--2022.02
  8. 台式机win10关闭fn热键_win10惠普怎么取消fn win10惠普取消fn的简单方法
  9. Python数据分析宝藏地带
  10. 多个PDF怎么合并成一个PDF文件?好用的方法学习一下