《MATLAB语言》课成论文
利用MATLAB求线性方程组
姓名:郭亚兰
学号:12010245331
专业:通信工程
班级:2010级通信工程一班
指导老师:汤全武
学院:物电学院
完成日期:2011年12月17日
利用MATLAB求解线性方程组
(郭亚兰 12010245331 2010 级通信一班)
【摘要】在高等数学及线性代数中涉及许多的数值问题,未知数的求解,微积分,不定积分,线性方程组的求解等对其手工求解都是比较复杂,而MATLAB语言正是处理线性方程组的求解的很好工具。线性代数是数学的一个分支,它的研究对象是向量,向量空间(或称线性空间),线性变换和有限维的线性方程组。因而,线性代数被广泛地应用于抽象代数和泛函分析中;由于科学研究中的非线性模型通常可以被近似为线性模型,使得线性代数被广泛地应用于自然科学和社会科学中。线性代数是数学的一个分支,它的研究对象是向量,向量空间(或称线性空间),线性变换和有限维的线性方程组。因而,线性代数被广泛地应用于抽象代数和泛函分析中;由于科学研究中的非线性模型通常可以被近似为线性模型,使得线性代数被广泛地应用于自然科学和社会科学中。线性代数是讨论矩阵理论、与矩阵结合的有限维向量空间及其线性变换理论的一门学科。
【关键字】线性代数MATLAB语言秩矩阵解
一、基本概念
1、N级行列式A:A等于所有取自不同性不同列的n个元素的积的代数和。
2、矩阵B:矩阵的概念是很直观的,可以说是一张表。
3、线性无关:一向量组(a1,a2,…,an)不线性相关,既没有不全为零的数
k1,k2,………kn使得:k1*a1+k2*a2+………+kn*an=0
4、秩:向量组的极在线性无关组所含向量的个数成为这个向量组的秩。
5、矩阵B的秩:行秩,指矩阵的行向量组的秩;列秩类似。记:R(B)
6、一般线性方程组是指形式:???????=+++=+++=*+++s
sn s s n n n n b a x a x a b x a x a x a b x a x a x n 22112222212111212111x ********a 二、基本理论
三种基本变换:1,用一非零的数乘某一方程;2,把一个方程的倍数加到另一方程;3,互换两个方程的位置。以上称出等变换。
消元法
首先用初等变换化线性方程组为阶梯形方程组:1,如果剩下的方程当中最后的一个等式等于一非零数,那么方程组无解;否则有解;2,如果阶梯形方程组中方程的个数r 等于未知量的个数,那么方程组有唯一的解;3,如果阶梯形方程组中方程的个数r 小于未知量的个数,那么方程组就有无穷个解。
定理1:线性方程组有解的充要条件为:R(A)=R(A,b)
线性方程组解的结构:
1:对齐次线性方程组,a:两个解的和还是方程组的解;b:一个解的倍数还是方程组的解。定义:齐次线性方程组的一组解u1,u2,…ui 称为齐次线性方程组的一个基础解系,如果:齐次线性方程组的任一解都表成u1,u2,…ui 的线性组合,且u1,u2,…ui 线性无关。
2:对非齐次线性方程组
(1)方程组的两个解的差是(2)的解。
(2)方程组的一个解与(2)的一个解之和还是(1)的解。
定理2 如果R0是方程组(1)的一个特解,那么方程组(1)的任一个解R 都可以表成;R=R0+V ….
其中V 是(2)的一个解,因此,对方称(1)的任一特解R0,当v 取遍它的全部解时,(3)就给出了(1)全部解。
三:基本思路
线性方程的求解分为两类:一类是方程求唯一解或求特解;一类是方程组 求无穷解即通解。
(1)判断方程组解的情况。1:当R(A)=R(B)时,有解(R(A)=R(A ,b))>=n
唯一解,R(A)=R(A,b)(n,有无穷解);2:当R(B)+1=R(A ,b)时无解。
(2)求特解;
(3)求通解(无穷解),线性方程组的无穷解=对应齐次方程组的通解+非齐 次方程组的一个特解;
注:以上针对非齐次线性方程组,对齐次线性方程组,主要使用到(1),(2)步!
四、基本方法
基本思路将在解题的过程中得到体现。
1、(求线性方程组的唯一解或特解),这类问题的求法分为两类:一类主要用于解低阶稠密矩阵——直接法;一类是解大型稀疏矩阵——迭代法。
2、利用矩阵除法求线性方程组的特解(或一个解)
方程:AX=b,解法:X=A\b ,(注意此处’\’不是’/’)
(1)求方程组 ???????=+-+=-+-=+-+=+--9
796342264422243214321
43214321x x x x x x x x x x x x x x x x 命令如下:
A=[2,-1,-1,1;1,1,-2,1;4,-6,2,-2;3,6,-9,7];%产生4x4阶系数矩阵 b=[2,4,4,9]'; %对矩阵进行转置
x=A\b %进行左初运算
x =
NaN
Inf
Inf
-3.0000
曾介绍过利用矩阵求逆来解线性方程组,即其结果于使用左除是相同的。
2、利用矩阵的分解求线性方程组
矩阵分解是指根据一定的原理用某种运算将一个矩阵分解成若干个矩阵的乘积。常见矩阵分解如,LU,QR 和Cholesky 分解求方程组的解,这三种分解,再求大型方程组是很有用。其优点是运算速度快,可以节省磁盘空间,节省内存。
(1)LU 分解又称Gauss 消去分解,可把任意方阵分解为下三角矩阵的基本变 换形式(行变换)和上三角矩阵的乘积。即A=LU,L 为下三角阵,U 为上三角 阵。
则:A*X=b 变成L*U*X=b
所以X=U\(L\b) 这样可以大大提高运算速度。
命令 [L,U]=lu(A)
在matlab 中可以编如下通用m 文件;
在MATLAB 建立M 文件如下
% exp1.m
A;b;
[L,U]=lu(A); %产生一个三角矩阵A 和一个变换形式的下三叫矩阵L (交 换行),使之满足A=LU
X=U\(L\b) %L 右乘b 的结果再右乘U 得到x 的值
(2)求方程组 ?????=++-=++-=--+63773235214321
43214321x x x x x x x x x x x x
命令如下:
A=[1,1,-1,-1;2,-5,3,2;7,-7,3,1]; %产生3x4阶系数矩阵
b=[1,3,6]'; %对矩阵进行转置
[L,U]=lu(A); %产生一个三角矩阵A 和一个变换形式的 下三叫矩阵L (交换行),使之满足A=LU x=U\(L\b) %L 右乘b 的结果再右乘U 得到x 的值 x =
0.4286
-0.4286
rank = 2, tol = 6.7642e-015.
采用第二种格式分解,
在MATLAB 建立M 文件如下
%exp1.m
A;b;
[L,U,P]=lu(A);
X=U\(L\P*b)
(3)求方程组 ?????=++-=++-=--+73773235214321
43214321x x x x x x x x x x x x
命令如下:
A=[1,1,-1,-1;2,-5,3,2;7,-7,3,1];%产生3x4阶矩阵
b=[1,3,7]'; %对矩阵进行转置
[L,U,P]=lu(A); %产生一个三角矩阵A 和一个下三角阵L 以 及一个置换矩阵P,使之满足PA=LU
x=U\(L\P*b) %x 的值
x =
0.6667
-0.3333
rank = 2, tol = 6.7642e-015.
(II)Cholesky 分解
若A 为对成正定矩阵,则Cholesky 分解可将矩阵A 分解成上三角矩阵和其 转置的乘积,即:A=R ’*R 其中R 为上三角矩阵。
方程 A*X=b 变成 R ’*R*X=b 所以 X=R\(R ’\b)
在MATLAB 中建立M 文件如下
%exp2.m
A;b;
[R ’,R]=chol(A); %产生一个上三角矩阵R ,使R ’R=A
X=R\(R ’\b) %x 的值
(4)求方程组 ?????=+--=-+-=+--5.0321304321
43214321x x x x x x x x x x x x
命令如下:
A=[1,-1,-1,1;1,-1,1,-3;1,-1,-2,3]; %产生3x4阶的矩阵
b=[0,1,-0.5]'; %对矩阵进行转置
[R'R]=chol(A); %产生一个上三角矩阵R ,使R'R=A x=R\(R'\b) %x 的值
??? Error using ==> chol
Matrix must be square.
命令执行时,此格式将不出现错误信息。当A 为对称正定时,则p=0;
否则p 为一个正整数。如果X 未满秩矩阵,则R 为一个阶数为q=p-1的上三角 阵,且满足R ’R=A(1:q,1:q)。
(3)QR 分解
对于任何长方矩阵A,都可以进行QR 分解,其中Q 为正交矩阵,R 为上三角 矩阵的初等变换形式,即:A=QR
方程 A*X=b 变形成 QRX=b
所以 X=R\(Q\b)
上例中 [Q,R]=qr(A) %产生一个正交矩阵Q 和一个上三角矩阵R ,使之A=QR X=R\(Q\B) %x 的值
在MATLAB 中建立M 文件如下
%exp3.m
A;b;
[Q,R]=qr(A);
X=R\(Q\b)
(5)求方程组 ??
???=+=+-=-+831110x 2322421321321x x x x x x x
命令如下:
A=[4,2,-1;3,-1,2;11,3,0]; %产生3x3阶的矩阵
b=[2,10,8]'; %对矩阵进行转置
[Q,R]=qr(A); %产生一个正交矩阵Q和一个上三角矩阵 R,使之满足A=QR
x=R\(Q\b) %x的值
x =
1.0e+015 *
1.3238
-4.8539
-4.4126
RCOND = 4.594136e-017.
除了用直接方法求解线性方程组的解之外,还可以用迭代法求解。迭代法适合求解大型系数矩阵的方程组。它主要包括Jacobi迭代法,Gauss-Serdel迭代法,超松驰迭代法和两步迭代法。在此只讨论Jacobi与Gauss-Serdel迭代法。1’ Gauseidel迭代法
用迭代法求解下列线性方程组,迭代初值为0,迭代精度为10e-6。Gauseidel.m函数文件:
function[y,n]=gauseidel(A,b,x0,eps)
if nargin==3
eps =1.0e-6 ;
elseif nargin<3
error %错误
return%结束该函数的执行
End
D=diag(diag(A)); %求A的对角矩阵
L=-tril(A,-1); %求A的下三角阵
U=-triu(A,1); %求A的上三角阵
G=(D-L)\U;
f=(D-L)\b;
y=G*x0+f; %y的值
n=1; %迭代次数
while norm(y-x0)>=eps
x0=y;
y=G*x0+f;
n=n+1;
End
(6)求解方程组 ?????=++=-+=++310556312321
321321x x x x x x x x x
在命令中调用该文件gauseidel.m,
程序如下:
A=[1,2,1;3,6,-1;5,10,1]; %产生一个3*3阶系数矩阵 b=[1,5,3]`; %对矩阵进行转置
[x,n]=gauseidel(A,b,[0,0,0]`,1.0e-6)
%调用gauseidel 函数
x =
0/0
0/0
0/0
n =
1391 2'Jacobi 迭代法
Jacobi.m 函数文件:
function [y,n]=jacobi(A,b,x0,eps)
if nargin==3
eps=1.0-6 ; %精确度为10e-6
elseif nargin<3
error %错误
return %结束该函数的执行
end
D=diag(diag(A)); %求A 的对角矩阵
L=-tril(A,-1); %求A 的下三角阵
U=-triu(A,1); % 求A 的上三角阵
B=D\(L+U);
f=D\b;
y=B*x0+f ; %y 的值
n=1; %迭代次数
while norm(y-x0)>=eps
x0=y;
y=B*x0+f;
n=n+1;
end
用Jacobi 迭代法求解下列线性方程组,迭代初值为0,迭代精度为10e-6。
(7)求解方程组 ??
???=+-=-+=-7x 5532632132121x x x x x x
在命令中调用该文件jacobi.m, 程序如下:
A=[3,-1,0;1,2,-3;0,-1,5]; %产生一个3*3阶系数矩阵A
b=[6,5,7]'; %产生矩阵b
[x,n]=jacobi(A,b,[0,0,0]',1.0e-6) %调用jacobi 函数
f=
2.0000
2.5000
1.4000
n=
1
x=
NaN
NaN
NaN
n=
1709
五、总结
Matlab 语言运算以矩阵运算为基础 ,可视化,程序设计有机的融合到一个简单易行的互换式工作环境中,有出色的数值计算功能和强大的图形处理功能,而且简单易学,代码短小高效。线性代数是数学中的一个重要分支,很多理论问题和实际问题都需要借助于线性代数的理论工具来分析解决,而且随着计算机的普及,线性代数被广泛应用于科学,经济,工程和管理等各个领域,同时线性代数也成为高校理工科和经济管理类各专业的一门公共基础课。线性代数课程是由方程Ax=b 发展起来的,主要研究线性方程组和二次型,对线性方程组的研究引入了行列式,矩阵,向量。这三块内容是研究线性方程组的三大工具。学习线性代数有两大难点:一是概念,理论抽象,二是计算量大。不过利用Matlab 语言,就可以轻松快捷的解决很多线性代数问题。比如说求方阵的逆和行列式,线性方程组中论述的求方阵的逆运算和行列式比较复杂,而在Matlab 中,方阵的逆运算只需用函数“inv ”即可…
六、心得体会
通过写本次的论文,我受益匪浅,才发现原来论文的书写格式要求这么严格,以前也没怎么注意格式。由于学的不精,在Matlab 软件中编程时出现了好
多好多问题,格式上的,大小写,还有软件中的一些特殊用法等等。在多次的修改后才勉强完成这次论文。在学习Matlab的时候,我感觉这个语言要比我们在大一时学的C语言更加方便,实用,虽然各有各的特点。比如在求解不等式问题上,C语言需要运用if,else,for等多条语句才能完成不等式的求解,然Matlab 则只需几个简单的语句就可运行出结果。这样就可以是工作量大大减少。在学完该课程后,我发现利用Matlab作为后继课程的解题工具,可以使我们从繁杂的计算中解放出来,同时将计算机与其他课程结合起来,大大提高了学习效率。
[参考文献]
[1] 《高等代数》,北京大学数学系编,1978
[2]吉家峰《Matlab6.0数学手册》,蒲俊,伊良忠编著,2002
[3]刘卫国主编《MATLAB程序设计与应用》第二版 [M].北京:高等教育出版社, 2006.
MatLab解线性方程组一文通 当齐次线性方程AX=0,rank(A)=r 解线性方程组的迭代法 1.rs里查森迭代法求线性方程组Ax=b的解 function[x,n]=rs(A,b,x0,eps,M) if(nargin==3) eps=1.0e-6;%eps表示迭代精度 M=10000;%M表示迭代步数的限制值elseif(nargin==4) M=10000; end I=eye(size(A)); n=0; x=x0; tol=1; %迭代过程 while(tol>eps) x=(I-A)*x0+b; n=n+1;%n为最终求出解时的迭代步数tol=norm(x-x0); x0=x; if(n>=M) disp('Warning:迭代次数太多,可能不收敛!'); return; end end 2.crs里查森参数迭代法求线性方程组Ax=b的解 function[x,n]=crs(A,b,x0,w,eps,M) if(nargin==4) eps=1.0e-6;%eps表示迭代精度 M=10000;%M表示迭代步数的限制值 elseif(nargin==5) M=10000; end I=eye(size(A)); n=0; x=x0; tol=1; %迭代过程 while(tol>eps) x=(I-w*A)*x0+w*b; n=n+1;%n为最终求出解时的迭代步数tol=norm(x-x0); x0=x; if(n>=M) disp('Warning:迭代次数太多,可能不收敛!'); return; end end 3.grs里查森迭代法求线性方程组Ax=b的解 function[x,n]=grs(A,b,x0,W,eps,M) if(nargin==4) eps=1.0e-6;%eps表示迭代精度 M=10000;%M表示迭代步数的限制值 elseif(nargin==5) M=10000; end I=eye(size(A)); n=0; x=x0; tol=1;%前后两次迭代结果误差 %迭代过程 while(tol>eps) x=(I-W*A)*x0+W*b;%迭代公式 n=n+1;%n为最终求出解时的迭代步数tol=norm(x-x0); x0=x; if(n>=M) disp('Warning:迭代次数太多,可能不收敛!'); return; end end 4.jacobi雅可比迭代法求线性方程组Ax=b的解 function[x,n]=jacobi(A,b,x0,eps,varargin) if nargin==3 eps=1.0e-6; M=200; elseif nargin<3 error return elseif nargin==5 M=varargin{1}; end D=diag(diag(A));%求A的对角矩阵 L=-tril(A,-1);%求A的下三角阵 matlab解方程组 lnx表示成log(x) 而lgx表示成log10(x) 1-exp(((log(y))/x^0.5)/(x-1)) 1、解方程 最近有多人问如何用matlab解方程组的问题,其实在matlab中解方程组还是很方便的,例如,对于代数方程组Ax=b(A为系数矩阵,非奇异)的求解,MATLAB 中有两种方法: (1)x=inv(A)*b —采用求逆运算解方程组; (2)x=A\B —采用左除运算解方程组 PS:使用左除的运算效率要比求逆矩阵的效率高很多~ 例: x1+2x2=8 2x1+3x2=13 >>A=[1,2;2,3];b=[8;13]; >>x=inv(A)*b x = 2.00 3.00 >>x=A\B x = 2.00 3.00; 即二元一次方程组的解x1和x2分别是2和3。 对于同学问到的用matlab解多次的方程组,有符号解法,方法是:先解出符号解,然后用vpa(F,n)求出n位有效数字的数值解.具体步骤如下: 第一步:定义变量syms x y z ...; 第二步:求解[x,y,z,...]=solve('eqn1','eqn2',...,'eqnN','var1','var2',...'varN'); 第三步:求出n位有效数字的数值解x=vpa(x,n);y=vpa(y,n);z=vpa(z,n);...。 如:解二(多)元二(高)次方程组: x^2+3*y+1=0 y^2+4*x+1=0 解法如下: >>syms x y; >>[x,y]=solve('x^2+3*y+1=0','y^2+4*x+1=0'); >>x=vpa(x,4); >>y=vpa(y,4); 结果是: 在这章中我们要学习线性方程组的直接法,特别是适合用数学软件在计算机上求解的方法. 3.1 方程组的逆矩阵解法及其MATLAB 程序 3.1.3 线性方程组有解的判定条件及其MATLAB 程序 判定线性方程组A n m ?b X =是否有解的MATLAB 程序 function [RA,RB,n]=jiepb(A,b) B=[A b];n=length(b); RA=rank(A); RB=rank(B);zhica=RB-RA; if zhica>0, disp('请注意:因为RA~=RB ,所以此方程组无解.') return end if RA==RB if RA==n disp('请注意:因为RA=RB=n ,所以此方程组有唯一解.') else disp('请注意:因为RA=RB 《MATLAB语言》课成论文 利用MATLAB求线性方程组 姓名:郭亚兰 学号:12010245331 专业:通信工程 班级:2010级通信工程一班 指导老师:汤全武 学院:物电学院 完成日期:2011年12月17日 利用MATLAB求解线性方程组 (郭亚兰 12010245331 2010 级通信一班) 【摘要】在高等数学及线性代数中涉及许多的数值问题,未知数的求解,微积分,不定积分,线性方程组的求解等对其手工求解都是比较复杂,而MATLAB语言正是处理线性方程组的求解的很好工具。线性代数是数学的一个分支,它的研究对象是向量,向量空间(或称线性空间),线性变换和有限维的线性方程组。因而,线性代数被广泛地应用于抽象代数和泛函分析中;由于科学研究中的非线性模型通常可以被近似为线性模型,使得线性代数被广泛地应用于自然科学和社会科学中。线性代数是数学的一个分支,它的研究对象是向量,向量空间(或称线性空间),线性变换和有限维的线性方程组。因而,线性代数被广泛地应用于抽象代数和泛函分析中;由于科学研究中的非线性模型通常可以被近似为线性模型,使得线性代数被广泛地应用于自然科学和社会科学中。线性代数是讨论矩阵理论、与矩阵结合的有限维向量空间及其线性变换理论的一门学科。 【关键字】线性代数MATLAB语言秩矩阵解 一、基本概念 1、N级行列式A:A等于所有取自不同性不同列的n个元素的积的代数和。 2、矩阵B:矩阵的概念是很直观的,可以说是一张表。 3、线性无关:一向量组(a1,a2,…,an)不线性相关,既没有不全为零的数 k1,k2,………kn使得:k1*a1+k2*a2+………+kn*an=0 4、秩:向量组的极在线性无关组所含向量的个数成为这个向量组的秩。 5、矩阵B的秩:行秩,指矩阵的行向量组的秩;列秩类似。记:R(B) 3.1 方程组的逆矩阵解法及其MATLAB 程序 3.1.3 线性方程组有解的判定条件及其MATLAB 程序 判定线性方程组A n m ?b X =是否有解的MATLAB 程序 function [RA,RB,n]=jiepb(A,b) B=[A b];n=length(b); RA=rank(A); RB=rank(B);zhica=RB-RA; if zhica>0, disp('请注意:因为RA~=RB ,所以此方程组无解.') return end if RA==RB if RA==n disp('请注意:因为RA=RB=n ,所以此方程组有唯一解.') else disp('请注意:因为RA=RB 实验1.1 用matlab 求解线性方程组 第一节 线性方程组的求解 一、齐次方程组的求解 rref (A ) %将矩阵A 化为阶梯形的最简式 null (A ) %求满足AX =0的解空间的一组基,即齐次线性方程组的基 础解系 【例1】 求下列齐次线性方程组的一个基础解系,并写出通解: 我们可以通过两种方法来解: 解法1: >> A=[1 -1 1 -1;1 -1 -1 1;1 -1 -2 2]; >> rref(A) 执行后可得结果: ans= 1 -1 0 0 0 0 -1 1 0 0 0 0 由最简行阶梯型矩阵,得化简后的方程 ??? ??=+--=+--=-+-0 22004321 43214321x x x x x x x x x x x x 取x2,x4为自由未知量,扩充方程组为 即 提取自由未知量系数形成的列向量为基础解系,记 所以齐次方程组的通解为 解法2: clear A=[1 -1 1 -1;1 -1 -1 1;1 -1 -2 2]; B=null(A, 'r') % help null 看看加个‘r’是什么作用, 若去掉r ,是什么结果? 执行后可得结果: B= 1 0 1 0 0 1 0 1 ?? ?=-=-0 04321x x x x ?????? ?====4 4432221x x x x x x x x ??? ??? ??????+????????????=????? ???????1100001142 4321x x x x x x , 00111????? ? ??????=ε, 11002????? ???????=ε2 211εεk k x += Matlab线性方程组求解 1. Gauss消元法: function x=DelGauss(a,b) % Gauss消去法 [n,m]=size(a); nb=length(b); det=1; %存储行列式值 x=zeros(n,1); for k=1:n-1 for i=k+1:n if a(k,k)==0 return end m=a(i,k)/a(k,k); for j=k+1:n a(i,j)=a(i,j)-m*a(k,j); end b(i)=b(i)-m*b(k); end det=det*a(k,k); %计算行列式 end det=det*a(n,n); for k=n:-1:1 %回代求解 for j=k+1:n b(k)=b(k)-a(k,j)*x(j); end x(k)=b(k)/a(k,k); end Example: >> A=[1.0170 -0.0092 0.0095;-0.0092 0.9903 0.0136;0.0095 0.0136 0.9898]; >> b=[1 0 1]'; >> x=DelGauss(A,b) x = 0.9739 -0.0047 1.0010 2. 列主元Gauss消去法: function x=detGauss(a,b) % Gauss列主元消去法 [n,m]=size(a); nb=length(b); det=1; %存储行列式值 x=zeros(n,1); for k=1:n-1 amax=0; %选主元 for i=k:n if abs(a(i,k))>amax amax=abs(a(i,k));r=i; end end if amax<1e-10 return; end if r>k %交换两行 for j=k:n 求解线性方程组 solve,linsolve 例: A=[5 0 4 2;1 -1 2 1;4 1 2 0;1 1 1 1]; %矩阵的行之间用分号隔开,元素之间用逗号或空格 B=[3;1;1;0] X=zeros(4,1);%建立一个4元列向量 X=linsolve(A,B) diff(fun,var,n):对表达式fun中的变量var求n阶导数。 例如:F=sym('u(x,y)*v(x,y)'); %sym()用来定义一个符号表达式 diff(F); %matlab区分大小写 pretty(ans) %pretty():用习惯书写方式显示变量;ans是答案表达式 非线性方程求解 fsolve(fun,x0,options) 为待解方程或方程组的文件名;fun其中 x0位求解方程的初始向量或矩阵; option为设置命令参数 建立文件fun.m: function y=fun(x) y=[x(1)-0.5*sin(x(1))-0.3*cos(x(2)), ... x(2) - 0.5*cos(x(1))+0.3*sin(x(2))]; >>clear;x0=[0.1,0.1];fsolve(@fun,x0,optimset('fsolve')) 注: ...为续行符 m文件必须以function为文件头,调用符为@;文件名必须与定义的函数名相同;fsolve()主要求解复杂非线性方程和方程组,求解过程是一个逼近过程。Matlab求解线性方程组 AX=B或XA=B 在MATLAB中,求解线性方程组时,主要采用前面章节介绍的除法运算符“/”和“\”。如: X=A\B表示求矩阵方程AX=B的解; 的解。XA=B表示矩阵方程B/A=X. 对方程组X=A\B,要求A和B用相同的行数,X和B有相同的列数,它的行数等于矩阵A的列数,方程X=B/A同理。 如果矩阵A不是方阵,其维数是m×n,则有: m=n 恰定方程,求解精确解; m>n 超定方程,寻求最小二乘解; m 线性方程组求解 1.直接法 Gauss消元法: function x=DelGauss(a,b) % Gauss消去法 [n,m]=size(a); nb=length(b); det=1;%存储行列式值 x=zeros(n,1); for k=1:n-1 for i=k+1:n if a(k,k)==0 return end m=a(i,k)/a(k,k); for j=k+1:n a(i,j)=a(i,j)-m*a(k,j); end b(i)=b(i)-m*b(k); end det=det*a(k,k); end det=det*a(n,n); for k=n:-1:1 %回代 for j=k+1:n b(k)=b(k)-a(k,j)*x(j); end x(k)=b(k)/a(k,k); end Example: >> A=[1.0170 -0.0092 0.0095;-0.0092 0.9903 0.0136;0.0095 0.0136 0.9898]; >> b=[1 0 1]'; >> x=DelGauss(A,b) x = 0.9739 -0.0047 1.0010 列主元Gauss消去法: function x=detGauss(a,b) % Gauss列主元消去法 [n,m]=size(a); nb=length(b); det=1;%存储行列式值 x=zeros(n,1); for k=1:n-1 amax=0;% 选主元 for i=k:n if abs(a(i,k))>amax amax=abs(a(i,k));r=i; end end if amax<1e-10 return; end if r>k %交换两行 for j=k:n z=a(k,j);a(k,j)=a(r,j);a(r,j)=z; end z=b(k);b(k)=b(r);b(r)=z;det=-det; end 1. roots 求解多项式的根 r=roots(c) 注意: c 为一维向量,者返回指定多项式的所有根( 包括复根),poly 和roots 是互为反运算,还有就是roots 只能求解多项式的解 还有下面几个函数poly2sym、sym2poly 、eig >>syms x >>y=x A5+3*x A3+3; >>c=sym2poly(y);%求解多项式系数 >>r=roots(c); >>poly(r) 2. residue 求留数 [r, p, k] = residue(b,a) >>b = [ 5 3 -2 7] >>a = [-4 0 8 3] >>[r, p, k] = residue(b,a) 3. solve 符号解方程(组)——使用最多的 g = solve(eq1,eq2,...,eqn,var1,var2,...,varn) 注意:eqn 和varn 可以是符号表达式,也可以是字符串表达式,但是使用符号表达式时不能有“=号”,假如说varn 没有给出,使用findsym 函数找出默认的求解变量。返回的g 是个结构体,以varn 为字段。由于符号求解的局限性,好多情况下可能得到空矩阵,此时只能用数值解法 解方程A=solve('a*xA2 + b*x + c') 解方程组B=solve('a*uA2 + vA2', 'u - v = 1', 'aA2 - 5*a + 6') 4. fzero 数值求零点 [x,fval,exitflag,output]=fzero(fun,x0,options,p1,p2...) fun 是目标函数,可以是句柄(@)、inline 函数或M 文件名 x0 是初值,可以是标量也可以是长度为2 的向量,前者给定一个位置,后者是给定一个范围options 是优化参数,通过optimset 设置,optimget 获取,一般使用默认的就可以了,具体参照帮助 p1,p2...为需要传递的其它参数 假如说(x/1446)A2+p/504.1+(t/330.9)*(log(1-x/1446)+(1-1 /5.3)*x/1446)=0 的根,其中p,t 是已知 用matlab解线性方程组 2008-04-12 17:00 一。高斯消去法 1.顺序高斯消去法 直接编写命令文件 a=[] d=[]' [n,n]=size(a); c=n+1 a(:,c)=d; for k=1:n-1 a(k+1:n, k:c)=a(k+1:n, k:c)-(a(k+1:n,k)/ a(k,k))*a(k, k:c); %消去 end x=[0 0 0 0]' %回带 x(n)=a(n,c)/a(n,n); for g=n-1:-1:1 x(g)=(a(g,c)-a(g,g+1:n)*x(g+1:n))/a(g,g) end 2.列主高斯消去法 *由于“[r,m]=max(abs(a(k:n,k)))”返回的行是“k:n,k”内的第几行,所以要通过修正来把m 改成真正的行的值。该程序只是演示程序,真正机器计算不需要算主元素所在列以下各行应为零的值。 直接编写命令文件 a=[] d=[] ' [n,n]=size(a); c=n+1 a(:,c)=d; %(增广) for k=1:n-1 [r,m]=max(abs(a(k:n,k))); %选主 m=m+k-1; %(修正操作行的值) if(a(m,k)~=0) if(m~=k) a([k m],:)=a([m k],:); %换行 end a(k+1:n, k:c)=a(k+1:n, k:c)-(a(k+1:n,k)/ a(k,k))*a(k, k:c); %消去end end x=[0 0 0 0]' %回带 x(n)=a(n,c)/a(n,n); for g=n-1:-1:1 x(g)=(a(g,c)-a(g,g+1:n)*x(g+1:n))/a(g,g) end 雅可比迭代 使用雅可比迭代法求解线性方程组的步骤 步骤1:输入系数矩阵A和方程组右端向量B; 步骤2:将矩阵A分解为下三角阵L对角阵D和上三角阵U 可分解为(D+L+U)X=B for o=1:n d(o,o)=a(o,o); u(o,o+1:n)=-a(o,o+1:n); end for p=2:n l(p,1:p-1)=-a(p,1:p-1); end; 步骤3:将上式化简为x=B0x+f,其中B0=-D-1(L+U),f=D-1B for i=1:n b0(i,i+1:n)=u(i,i+1:n)/a(i,i); f(i,:)=b(i,:)/a(i,i); end for p=2:n b0(p,1:p-1)=l(p,1:p-1)/a(p,p);; 步骤4:采用迭代公式在允许误差范围e=1e-7内求得解向量x x0=x; x=b0*x+f 雅可比迭代法matlab程序: function [x,k]=jacobi(a,b) n=length(a); e=1e-7; m=100; x0=zeros(n,1); x=x0; k=0; d=zeros(n); l=zeros(n); u=zeros(n); b0=zeros(n); f=zeros(n,1); x0=x+2*e; for o=1:n d(o,o)=a(o,o); u(o,o+1:n)=-a(o,o+1:n); end for p=2:n l(p,1:p-1)=-a(p,1:p-1); end for i=1:n b0(i,i+1:n)=u(i,i+1:n)/a(i,i); f(i,:)=b(i,:)/a(i,i); end for p=2:n b0(p,1:p-1)=l(p,1:p-1)/a(p,p); end while max(abs(x0-x))>e&k 2.1 方程组地逆矩阵解法及其MATLAB 程序 2.1.3 线性方程组有解地判定条件及其MATLAB 程序判定线性方程组A n m ?b X =是否有解地MATLAB 程序 function [RA,RB,n]=jiepb(A,b) B=[A b];n=length(b); RA=rank(A); RB=rank(B);zhica=RB-RA; if zhica>0, disp('请注意:因为RA~=RB ,所以此方程 组无解.') return end if RA==RB if RA==n disp('请注意:因为RA=RB=n ,所以此方 程组有唯一解.') else disp('请注意:因为RA=RB Matlab求解线性方程组、非线性方程组 姓名:罗宝晶学号:15 专业:材料学院高分子系 第一部分数值计算 Matlab求解线性方程组AX=B或XA=B 在MATLAB中,求解线性方程组时,主要采用除法运算符“/”和“\”。如:X=A\B表示求矩阵方程AX=B的解; X=B/A表示矩阵方程XA=B的解。 对方程组X=A\B,要求A和B用相同的行数,X和B有相同的列数,它的行数等于矩阵A的列数,方程X=B/A同理。 如果矩阵A不是方阵,其维数是m×n,则有: m=n 恰定方程,求解精确解; m>n 超定方程,寻求最小二乘解; m matlab常用解方程及方程组函数 1.roots求解多项式的根 r=roots(c) 注意:c为一维向量,者返回指定多项式的所有根(包括复根),poly和roots是互为反运算,还有就是roots只能求解多项式的解 还有下面几个函数poly2sym、sym2poly、eig >>syms x >>y=x^5+3*x^3+3; >>c=sym2poly(y);%求解多项式系数 >>r=roots(c); >>poly(r) 2.residue求留数 [r, p, k] = residue(b,a) >>b = [ 5 3 -2 7] >>a = [-4 0 8 3] >>[r, p, k] = residue(b,a) 3.solve符号解方程(组)——使用最多的 g = solve(eq1,eq2,...,eqn,var1,var2,...,varn) 注意:eqn和varn可以是符号表达式,也可以是字符串表达式,但是使用符号表达式时不能有“=”号,假如说varn没有给出,使用findsym函数找出默认的求解变量。返回的g是一个结构体,以varn为字段。由于符号求解的局限性,好多情况下可能得到空矩阵,此时只能用数值解法 解方程A=solve('a*x^2 + b*x + c') 解方程组B=solve('a*u^2 + v^2', 'u - v = 1', 'a^2 - 5*a + 6') 4.fzero数值求零点 [x,fval,exitflag,output]=fzero(fun,x0,options,p1,p2...) fun是目标函数,可以是句柄(@)、inline函数或M文件名 x0是初值,可以是标量也可以是长度为2的向量,前者给定一个位置,后者是给定一个范围 options是优化参数,通过optimset设置,optimget获取,一般使用默认的就可以了,具体参照帮助 p1,p2...为需要传递的其它参数 假如说(x/1446)^2+p/504.1+(t/330.9)*(log(1-x/1446)+(1-1/5.3)*x/1446)=0的根,其中p,t是已知参数,但是每次都改变 那么目标函数如下三种书写格式,效果完全等效。注意参数列表中,未知数一定放第一位,其他参数放后面 (1)objfun=@(x,p,t)(x/1446).^2+p/504.1+(t/330.9).*(log(1-x/1446)+(1-1/5.3).*x/1446); (2)objfun=inline('(x/1446).^2+p/504.1+(t/330.9).*(log(1-x/1446)+(1-1/5.3).*x/1446)','x','p','t') 此时的调用格式如下 fzero(objfun,x0,options,p,t)%如果options使用的默认的话,那直接使用[],p和t就是我们需要传递的参数 fzero(@(x)objfun(x,p,t),x0,options)%这种格式与上面的等效 区别就是前者,将参数p和t作为fzero的参数进行传递,而后者是将p和t作为objfun的参数进行传递,没有本质区别 (3)function f=objfun(x,p,t)%以M文件格式书写目标函数 f=(x/1446).^2+p/504.1+(t/330.9).*(log(1-x/1446)+(1-1/5.3).*x/1446); 此时有三种调用格式 Matlab之Gauss消元法解线性方程组 1.Gauss消元法 function x=DelGauss(a,b) %Gauss消去法 [n,m]=size(a); nb=length(b); det=1;%存储行列式值 x=zeros(n,1); for k=1:n-1 for i=k+1:n if a(k,k)==0 return end m=a(i,k)/a(k,k); for j=k+1:n a(i,j)=a(i,j)-m*a(k,j); end b(i)=b(i)-m*b(k); end det=det*a(k,k);%计算行列式 end det=det*a(n,n); for k=n:-1:1%回代求解 for j=k+1:n b(k)=b(k)-a(k,j)*x(j); end x(k)=b(k)/a(k,k); end Example: >>A=[1.0170-0.00920.0095;-0.00920.99030.0136;0.00950.0136 0.9898]; >>b=[101]'; >>x=DelGauss(A,b) x= 0.9739 -0.0047 1.0010 2.列主元Gauss消去法: function x=detGauss(a,b) %Gauss列主元消去法 [n,m]=size(a); nb=length(b); det=1;%存储行列式值 x=zeros(n,1); for k=1:n-1 amax=0;%选主元 for i=k:n if abs(a(i,k))>amax amax=abs(a(i,k));r=i; end end if amax<1e-10 return; 求解线性方程组solve ,linsolve 例: A=[5 0 4 2;1 -1 2 1;4 1 2 0;1 1 1 1]; %矩阵的行之间用分号隔开,元素之间用逗号或空格 B=[3;1;1;0] X=zeros(4,1);% 建立一个4 元列向量 X=linsolve(A,B) diff (fun , Var, n):对表达式fun中的变量Var求n阶导数。 例如:F=sym('u(x,y)*v(x,y)' ) ; %sym ()用来定义一个符号表达式diff(F); %matlab 区分大小写 pretty(ans) %pretty ():用习惯书写方式显示变量;ans 是答案表达式非线性方程求解 fsolVe(fun,x0,options) 其中fun 为待解方程或方程组的文件名; x0 位求解方程的初始向量或矩阵; option 为设置命令参数 建立文件fun.m : function y=fun(x) y=[x(1)-0.5*sin(x(1))-0.3*cos(x(2)), ... x(2) - 0.5*cos(x(1))+0.3*sin(x(2))]; >>clear;x0=[0.1,0.1];fsolVe(@fun,x0,optimset('fsolVe')) 注: ...为续行符 m 文件必须以function 为文件头,调用符为@;文件名必须与定义的函数名相同;fsolVe ()主要求解复杂非线性方程和方程组,求解过程是一个逼近过程。 Matlab 求解线性方程组 AX=B 或XA=B 在MATLAB 中,求解线性方程组时,主要采用前面章节介绍的除法运算符“和/ ” “”。如: X=A?B表示求矩阵方程AX = B的解; X= B/A表示矩阵方程XA=B的解。 对方程组X = A?B ,要求A和B用相同的行数,X和B有相同的列数,它的行数等于矩阵A 的列数,方程X= B/A 同理。 如果矩阵A不是方阵,其维数是m× n,则有:m = n 恰定方程,求解精确解;m>n 超定方程,寻求最小二乘解; m 实验 用matlab 求解线性方程组 第一节 线性方程组的求解 一、齐次方程组的求解 rref (A ) %将矩阵A 化为阶梯形的最简式 null (A ) %求满足AX =0的解空间的一组基,即齐次线性方程组的基 础解系 【例1】 求下列齐次线性方程组的一个基础解系,并写出通解: 我们可以通过两种方法来解: 解法1: >> A=[1 -1 1 -1;1 -1 -1 1;1 -1 -2 2]; >> rref(A) 执行后可得结果: ans= 1 -1 0 0 0 0 -1 1 0 0 0 0 由最简行阶梯型矩阵,得化简后的方程 ??? ??=+--=+--=-+-0 22004321 43214321x x x x x x x x x x x x ?? ?=-=-0 04321x x x x 取x2,x4为自由未知量,扩充方程组为 即 提取自由未知量系数形成的列向量为基础解系,记 所以齐次方程组的通解为 解法2: clear A=[1 -1 1 -1;1 -1 -1 1;1 -1 -2 2]; B=null(A, 'r') % help null 看看加个‘r’是什么作用,若去掉 r ,是什么结果 执行后可得结果: B= 1 0 1 0 0 1 0 1 易见,可直接得基础解系 ?????? ?====4 4432221x x x x x x x x ??? ??? ??????+????????????=????? ???????1100001142 4321x x x x x x , 00111????? ? ??????=ε, 11002????? ???????=ε2 211εεk k x +=, 0111? ?????????=ε, 1002? ?????????=ε 线性代数方程组数值解法及MATLAB 实现综述 廖淑芳 20122090 数计学院 12计算机科学与技术1班(职教本科) 一、分析课题 随着科学技术的发展,提出了大量复杂的数值计算问题,在建立电子计算机成为数值计算的主要工具以后,它以数字计算机求解数学问题的理论和方法为研究对象。其数值计算中线性代数方程的求解问题就广泛应用于各种工程技术方面。因此在各种数据处理中,线性代数方程组的求解是最常见的问题之一。关于线性代数方程组的数值解法一般分为两大类:直接法和迭代法。 直接法就是经过有限步算术运算,可求的线性方程组精确解的方法(若计算过程没有舍入误差),但实际犹如舍入误差的存在和影响,这种方法也只能求得近似解,这类方法是解低阶稠密矩阵方程组级某些大型稀疏矩阵方程组的有效方法。直接法包括高斯消元法,矩阵三角分解法、追赶法、平方根法。 迭代法就是利用某种极限过程去逐步逼近线性方程组精确解的方法。迭代法具有需要计算机的存储单元少,程序设计简单,原始系数矩阵在计算过程始终不变等优点,但存在收敛性级收敛速度问题。迭代法是解大型稀疏矩阵方程组(尤其是微分方程离散后得到的大型方程组)的重要方法。迭代法包括Jacobi 法SOR 法、SSOR 法等多种方法。 二、研究课题-线性代数方程组数值解法 一、 直接法 1、 Gauss 消元法 通过一系列的加减消元运算,也就是代数中的加减消去法,以使A 对角线以下的元素化为零,将方程组化为上三角矩阵;然后,再逐一回代求解出x 向量。 1.1消元过程 1. 高斯消元法(加减消元):首先将A 化为上三角阵,再回代求解。 11121121222212n n n n nn n a a a b a a a b a a a b ?? ? ? ? ???L L M M O M M L (1)(1)(1)(1)(1)11121311(2)(2)(2)(2)222322(3)(3)(3)3333()()000000n n n n n nn n a a a a b a a a b a a b a b ?? ? ? ? ? ? ???L L L M M M O M M L 步骤如下:MATLAB代码 解线性方程组的迭代法
matlab解方程组
MATLAB解线性方程组的直接方法
利用MATLAB求线性方程组
线性方程组求解matlab实现
实验一用matlab求解线性方程组
Matlab线性方程组求解(Gauss消去法)
Matlab求解线性方程组非线性方程组
线性方程组求解Matlab程序(精.选)
matlab常用解方程及方程组函数
用matlab解线性方程组
雅可比解线性方程组matlab
解线性方程组直接方法matlab用法
Matlab求解线性方程组、非线性方程组
matlab常用解方程及方程组函数
MATLAB之GAUSS消元法解线性方程组
Matlab求解线性方程组、非线性方程组.docx
实验一用matlab求解线性方程组
线性代数方程组数值解法及MATLAB实现综述