高斯消去、追赶法 matlab
1. 分别用Gauss消去法、列主元Gauss消去法、三角分解方法求解方程组

程序:
(1)Guess消去法:
function x=GaussXQByOrder(A,b)
%Gauss消去法
N = size(A);
n = N(1);
x = zeros(n,1);
for i=1:(n-1)
for j=(i+1):n
if(A(i,i)==0)
disp('对角元不能为0');
return;
end
m = A(j,i)/A(i,i);
A(j,i:n)=A(j,i:n)-m*A(i,i:n);
b(j)=b(j)-m*b(i);
end
end
x(n)=b(n)/A(n,n);
for i=n-1:-1:1
x(i)=(b(i)-sum(A(i,i+1:n)*x(i+1:n)))/A(i,i);
end
命令行输入:
A=[1 -1 2 1;-1 3 0 -3 ;2 0 9 -6;1 -3 -6 19];
b=[1 3 5 7];
b=b';
x=GaussXQByOrder(A,b)
运算结果:
x =
-8.000000000000000
0.333333333333333
3.666666666666667
2.000000000000000
(2)列主元Gauss消去法
程序:
function x=GaussXQLineMain(A,b)
%列主元Gauss消去法
N = size(A);
n = N(1);
x = zeros(n,1);
zz=zeros(1,n);
for i=1:(n-1)
[~,p]=max(abs(A(i:n,i)));
zz=A(i,:);
A(i,:)=A(p+i-1,:);
A(p+i-1,:)=zz;
temp=b(i);
b(i)=b(i+p-1);
b(i+p-1)=temp;
for j=(i+1):n
m = A(j,i)/A(i,i);
A(j,i:n)=A(j,i:n)-m*A(i,i:n);
b(j)=b(j)-m*b(i);
end
end
x(n)=b(n)/A(n,n);
for i=n-1:-1:1
x(i)=(b(i)-sum(A(i,i+1:n)*x(i+1:n)))/A(i,i);
end
命令行:
A=[1 -1 2 1;-1 3 0 -3 ;2 0 9 -6;1 -3 -6 19];
b=[1 3 5 7];
b=b';
x=GaussXQLineMain(A,b)
运行结果:
x =
-8.000000000000005
0.333333333333332
3.666666666666668
2.000000000000000
(3)三角分解方法
程序:
function x = LU(A,b)
%三角分解
N = size(A);
n = N(1);
L = eye(n,n);
U = zeros(n,n);
x = zeros(n,1);
y = zeros(n,1);
U(1,1:n) = A(1,1:n);
L(1:n,1) = A(1:n,1)/U(1,1);
for k=2:n
for i=k:n
U(k,i) = A(k,i)-L(k,1:(k-1))*U(1:(k-1),i);
end
for j=(k+1):n
L(j,k) = (A(j,k)-L(j,1:(k-1))*U(1:(k-1),k))/U(k,k);
end
end
y(1)=b(1)/L(1,1);
for i=2:n
y(i)=b(i)-sum(L(i,1:i-1)*y(1:i-1));
end
x(n)=y(n)/U(n,n);
for i=n-1:-1:1
x(i)=(y(i)-sum(U(i,i+1:n)*x(i+1:n)))/U(i,i);
end
命令行:
A=[1 -1 2 1;-1 3 0 -3 ;2 0 9 -6;1 -3 -6 19];
b=[1 3 5 7];
b=b';
x=LU(A,b)
运行结果:
x =
-8.000000000000000
0.333333333333333
3.666666666666667
2.000000000000000

程序:function [times,wucha]=zhuiganfa(a,b,c,f)
%追赶法:x为所求解,times为所有乘除运算次数(即时间),wucha为误差的2-范数。
n=length(f);
x=zeros(n,1);
y=zeros(n,1);
times=0;
alpha=zeros(1,n);
p=zeros(1,n-1);
alpha(1)=b(1);
for i=2:n
p(i-1)=c(i-1)/alpha(i-1);
alpha(i)=b(i)-a(i-1)*p(i-1);
times=times+1;
end
y(1)=f(1)/b(1);
for i=2:n
y(i)=(f(i)-a(i-1)*y(i-1))/alpha(i);
times=times+1;
end
x(n)=y(n);
for i=n-1:-1:1
x(i)=y(i)-p(i)*x(i+1);
times=times+1;
end
A=zeros(n,n);
A=diag(b,0)+diag(a,-1)+diag(c,1);
wucha=norm((A*x-f'),2);
命令行(n=20):
a=repmat(11,1,19);
b=repmat(-19,1,20);
c=repmat(7,1,19);
f1=repmat(1.1,1,18);
f=[0 f1 1];
[times,wucha]=zhuiganfa(a,b,c,f)
运行结果:
times =
57
wucha =
8.009010697694412e-15
n=50时
命令行:
a=repmat(11,1,49);
b=repmat(-19,1,50);
c=repmat(7,1,49);
f1=repmat(1.1,1,48);
f=[0 f1 1];
[times,wucha]=zhuiganfa(a,b,c,f)
运行结果:
times =
147
wucha =
1.292635294609912e-14
命令行(n=100)
a=repmat(11,1,99);
b=repmat(-19,1,100);
c=repmat(7,1,99);
f1=repmat(1.1,1,98);
f=[0 f1 1];
[times,wucha]=zhuiganfa(a,b,c,f)
结果:
times =
297
wucha =
2.599344850768740e-14

程序:function [count,wucha] = zhouqisanduijaiozhuiganfa(a,b,c,f)
%x为所求解,count为所有乘除运算次数
n=length(f);
x=zeros(n,1);
y=zeros(n,1);
count=0;
l=zeros(1,n-2);
s=zeros(1,n-1);
u=zeros(1,n);
t=zeros(1,n-1);
u(1)=b(1);t(1)=1;
s(1)=1/u(1);y(1)=f(1);
for i=2:n-1
l(i-1)=a(i-1)/u(i-1);
u(i)=b(i)-l(i-1)*c(i-1);
t(i)=-l(i-1)*t(i-1);
s(i)=-s(i-1)*c(i-1)/u(i);
y(i)=f(i)-l(i-1)*y(i-1);
count=count+4;
end
st=0;
for k=1:n-1
st=st+s(k)*t(k);
count=count+1;
end
sy=0;
for k=1:n-2
sy=sy+s(k)*y(k);
count=count+1;
end
u(n)=b(n)-st-s(n-1)*(c(n-1)+t(n-1));
y(n)=f(n)-sy;
x(n)=y(n)/u(n);
for i=n-1:-1:1
x(i)=(y(i)-c(i)*x(i+1)-t(i)*x(n))/u(i);
count=count+1;
end
A=zeros(n,n);
A=diag(b,0)+diag(a,-1)+diag(c,1);
A(n,1)=1;
A(1,n)=1;
wucha=norm((A*x-f'),2);
命令行:
n=10;
a=repmat(11,1,n-1);b=repmat(-19,1,n);
c=repmat(7,1,n-1);f1=repmat(1.1,1,n-2);f=[0 f1 1];
[count,wucha]= zhouqisanduijaiozhuiganfa(a,b,c,f)
运行结果:
count =
58
wucha =
4.525439045433075
n=30
count =
198
wucha =
5.951269557941316
n=100
count =
688
wucha =
5.993271932634396
高斯消去、追赶法 matlab的更多相关文章
- 高斯混合模型(GMM)及MATLAB代码
之前在学习中遇到高斯混合模型,卡了很长一段时间,在这里记下学习中的一些问题以及解决的方法.希望看到这篇文章的同学们对高斯混合模型能有一些基本的概念.全文不废话,直接上重点. 本文将从以下三个问题详解高 ...
- matlab 求解线性方程组之LU分解
线性代数中的一个核心思想就是矩阵分解,既将一个复杂的矩阵分解为更简单的矩阵的乘积.常见的有如下分解: LU分解:A=LU,A是m×n矩阵,L是m×m下三角矩阵,U是m×n阶梯形矩阵 QR分解: 秩分解 ...
- [zz] 混合高斯模型 Gaussian Mixture Model
聚类(1)——混合高斯模型 Gaussian Mixture Model http://blog.csdn.net/jwh_bupt/article/details/7663885 聚类系列: 聚类( ...
- matlab中fft快速傅里叶变换
视频来源:https://www.bilibili.com/video/av51932171?t=628. 博文来源:https://ww2.mathworks.cn/help/matlab/ref/ ...
- 【原创】开源Math.NET基础数学类库使用(16)C#计算矩阵秩
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 上个月 ...
- C++线性方程求解
介绍 程序SolveLinearEquations解决联立方程.该方案需要一个文本文件,其中包含输入和输出方程解决.这个项目是几年前我写在C#中http://www.codeproject.com/A ...
- Libsvm学习
本篇博客转自 http://www.cppblog.com/guijie/archive/2013/09/05/169034.html 在电脑文件夹E:\other\matlab 20 ...
- 开源Math.NET基础数学类库使用(16)C#计算矩阵秩
原文:[原创]开源Math.NET基础数学类库使用(16)C#计算矩阵秩 本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4 ...
- minimize.m:共轭梯度法更新BP算法权值
minimize.m:共轭梯度法更新BP算法权值 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ Carl Edward Rasmussen在高斯机器学 ...
随机推荐
- 初入Java后端之Servlet
初入Java后端之Servlet 后端 Servlet 什么是Servlet? Servlet实际上是一个按照Servlet规范写的Java类.是运行在Web服务端的Java应用程序.与Java程序 ...
- .Net Core vs .Net Framework 如何为一个应用程序选择一个运行时(翻译)
.Net Core是下一件大事吗?我已经使用了一段时间了,我倾向认为它是.事实上,我们推测,在2018年,对这项技术熟练的开发人员将会有巨大的需求.但是它和.Net Framework的区别是什么?你 ...
- js闭包应用
先来看一个例子: function foo() { var a = 10; function bar() { a *= 2; return a; } return bar; } var baz = f ...
- [NOI 2015]寿司晚宴
Description 题库链接 给定 \(2\sim n\) 一共 \(n-1\) 个数字,第一个人选择一些数字,第二个人选择一些数字,要求第一个人选的任意一个数字和第二个人选择的任意一个数字都互质 ...
- smtp的host地址
SMTP是SIMPLE MAIL TRANSFER PROTOCOL的缩写,一般的发信软件,如Outlook Express.FoxMail.Eudora都是使用这个协议进行发信的.SMTP Host ...
- net 自定义泛型那点事
泛型概述 泛型是程序设计语言的一种特性.允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明.各种程序设计语言和其编译器.运行环境对泛型的支持均不一样.将类型参数化 ...
- java设计模式-----20、模板方法模式
概念: Template Method模式也叫模板方法模式,是行为模式之一,它把具有特定步骤算法中的某些必要的处理委让给抽象方法,通过子类继承对抽象方法的不同实现改变整个算法的行为. 模板方法模式的应 ...
- Three.js开发指南---使用three.js的材质(第四章)
材质就像物体的皮肤,决定了几何体的外表,例如是否像草地/金属,是否透明,是否显示线框等 一 材质 THREE.js的材质分为多种,Three.js提供了一个材质基类THREE.Material, 该基 ...
- python实现贪婪算法解决01背包问题
一.背包问题 01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2至Wn,与之相对应的价值为P1,P2至Pn.01背包是背包问题中最简单的问题.01背包的约束条件是给定几种物 ...
- .net4.0多进程间共享内存实现通信(VB.Net)
.net4.0新增内存共享功能,从而很方便的实现了多进程间通信. 源码下载