|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
求解线性方程组! n+ l [7 N1 M8 [& R
solve,linsolve2 v. H% {0 \/ a* @2 Y. R
例:
7 \- E5 x1 \, s$ y& [. yA=[5 0 4 2;1 -1 2 1;4 1 2 0;1 1 1 1];
' m: X" h6 u8 \%矩阵的行之间用分号隔开,元素之间用逗号或空格- O( @' N# F7 C3 i# h9 C m
B=[3;1;1;0]$ |& ?: W) o* p& P; K: c5 z
X=zeros(4,1);%建立一个4元列向量; a4 R6 [4 G/ l# v( B( _
X=linsolve(A,B)
$ B- u! K6 m, Z: hdiff(fun,var,n):对表达式fun中的变量var求n阶导数。' Z5 n2 `9 {" B# L
# ~; R6 V; |0 Z1 E# Y/ s! ~, v例如:F=sym('u(x,y)*v(x,y)'); %sym()用来定义一个符号表达式0 Y7 |) `! U! @% e/ C
diff(F); %matlab区分大小写
4 b7 m: j$ U1 P2 J. ~0 L5 Gpretty(ans) %pretty():用习惯书写方式显示变量;ans是答案表达式6 |1 V8 j' ^; I8 A- A' U
. o3 N* j$ f/ \ E! Z/ R4 a
+ B. n& Y1 g Q" L5 P8 r非线性方程求解
1 V' z$ i5 a9 B) J3 O- c+ O( c; hfsolve(fun,x0,options)" i# @% l, H6 @, _% f3 `
其中fun为待解方程或方程组的文件名;
0 T% h0 \, m6 B7 `x0位求解方程的初始向量或矩阵;& \8 V% h$ p& T( _
option为设置命令参数
& B& r8 V7 T/ p1 p1 s建立文件fun.m:- \# A8 l" F0 r- J% s! l3 L
function y=fun(x)
, E+ @7 Y- ]; ]# z! K# Ey=[x(1)-0.5*sin(x(1))-0.3*cos(x(2)), ..." R4 P; e3 Y7 b
x(2) - 0.5*cos(x(1))+0.3*sin(x(2))];
7 F* f/ n: V3 M# {9 B1 |9 m' q* V7 u/ B8 D+ z% i3 t
>>clear;x0=[0.1,0.1];fsolve(@fun,x0,optimset('fsolve')). r% P* \5 h* O6 R
注:1 k7 q; v) D0 _/ F* z ~0 i& M
...为续行符
! e* u# J# F- O% @m文件必须以function为文件头,调用符为@;文件名必须与定义的函数名相同;fsolve()主要求解复杂非线性方程和方程组,求解过程是一个逼近过程。1 d& ^7 E, z+ N5 p# c
. I, n6 w: o% r' W* g5 X
+ Y6 }( e. n+ \Matlab求解线性方程组0 a2 F% V {+ V
AX=B或XA=B 6 r: q% r+ ^) Y) p/ `; x
在MATLAB中,求解线性方程组时,主要采用前面章节介绍的除法运算符“/”和“\”。如: 7 H% h( B6 n& c" C4 } N) K
X=A\B表示求矩阵方程AX=B的解;
4 `& Y/ e2 g/ k/ G( cX=B/A表示矩阵方程XA=B的解。 & w6 l4 x. q' d" l& l; o, i
对方程组X=A\B,要求A和B用相同的行数,X和B有相同的列数,它的行数等于矩阵A的列数,方程X=B/A同理。
) c- C: D; |) ]' u
3 n: }8 g0 F# V, e6 D* M5 c: R( R3 D- P如果矩阵A不是方阵,其维数是m×n,则有:
$ v! Q8 W& [" G0 Z5 h# bm=n 恰定方程,求解精确解; 8 E, [1 B D' w9 p/ s, z) b
m>n 超定方程,寻求最小二乘解;
! A2 a- c1 ^* A3 D+ ^m<n 不定方程,寻求基本解,其中至多有m个非零元素。
& _1 G3 I& [6 b针对不同的情况,MATLAB将采用不同的算法来求解。 ! F2 S4 O9 x( @3 n( G
( X( a0 }; i$ ^( A( S5 z6 Y. j( Y6 \! t/ p+ Q' V6 O6 H
一.恰定方程组
3 @; M2 P) B" W: X恰定方程组由n个未知数的n个方程构成,方程有唯一的一组解,其一般形式可用矩阵,向量写成如下形式: ! }! U- F' s* U9 O! @
Ax=b 其中A是方阵,b是一个列向量;
: d0 ?7 U1 Z3 q+ s' N3 p6 v在线性代数教科书中,最常用的方程组解法有: + X0 s Q) r- t0 X/ }4 }
(1)利用cramer公式来求解法; * C# \7 P' c& y8 M+ H
(2)利用矩阵求逆解法,即x=A-1b; 3 V6 j3 w9 k; y/ o* n( ]
(3)利用gaussian消去法; 4 ]. }9 g1 s, P
(4)利用lu法求解。 5 j p; o# n. a
一般来说,对维数不高,条件数不大的矩阵,上面四种解法所得的结果差别不大。前三种解法的真正意义是在其理论上,而不是实际的数值计算。MATLAB中,出于对算法稳定性的考虑,行列式及逆的计算大都在lu分解的基础上进行。 $ O5 Q1 L9 i p
在MATLAB中,求解这类方程组的命令十分简单,直接采用表达式:x=A\b。 # I# z1 c; C! z5 a) m6 v9 `
在MATLAB的指令解释器在确认变量A非奇异后,就对它进行lu分解,并最终给出解x;若矩阵A的条件数很大,MATLAB会提醒用户注意所得解的可靠性。
* {5 s& n; U# C如果矩阵A是奇异的,则Ax=b的解不存在,或者存在但不唯一;如果矩阵A接近奇异时,MATLAB将给出警告信息;如果发现A是奇异的,则计算结果为inf,并且给出警告信息;如果矩阵A是病态矩阵,也会给出警告信息。
% a; g3 u" ?" L$ |: C注意:在求解方程时,尽量不要用inv(A)*b命令,而应采用A\b的解法。因为后者的计算速度比前者快、精度高,尤其当矩阵A的维数比较大时。另外,除法命令的适用行较强,对于非方阵A,也能给出最小二乘解。 ' a: ~+ R A" K
( O( m! g: u8 Z* _5 P' I
二.超定方程组
! R* t0 o' @7 n7 J; p对于方程组Ax=b,A为n×m矩阵,如果A列满秩,且n>m。则方程组没有精确解,此时称方程组为超定方程组。线性超定方程组经常遇到的问题是数据的曲线拟合。对于超定方程,在MATLAB中,利用左除命令(x=A\b)来寻求它的最小二乘解;还可以用广义逆来求,即x=pinv(A),所得的解不一定满足Ax=b,x只是最小二乘意义上的解。左除的方法是建立在奇异值分解基础之上,由此获得的解最可靠;广义逆法是建立在对原超定方程直接进行householder变换的基础上,其算法可靠性稍逊与奇异值求解,但速度较快;
, z8 j- t5 _' |9 f: F% b【例7】
9 Z' p: y5 \3 r$ H% y3 F求解超定方程组
, ~' X) U) Y# ]6 o. \A=[2 -1 3;3 1 -5;4 -1 1;1 3 -13] 0 ^* ` s# Y, ?# L8 H* u
A= - T# R% A8 d, V& X- N
2 -1 3 ; J, d- `( L; M
3 1 -5 $ V |& u& Z' [
4 -1 1
" C: U6 R- A! c1 3 -13
5 ^: ~( v+ q& {. g8 ob=[3 0 3 -6]’; * V* T" U* b) R4 h
rank(A) 0 \2 ~) y) Z' X% B& E/ H
ans= ; {# ~# ]8 x2 |/ y
3
6 L9 U# ^1 p0 F( q9 sx1=A\b 0 y+ a8 @; n, f% L. x
x1=
. [% i& p1 x7 B9 g1.0000 ) V# L6 N: Z" M: M. ^, F, y
2.0000 3 R+ l1 R; U/ O5 O/ l& W
1.0000
. K) C4 W {2 r/ i4 N, Nx2=pinv(A)*b
# X4 y, d6 G( E4 n: h. G% bx2= 2 {; p: d/ ] i; h7 E0 }7 V. z
1.0000
4 N& X% J u! s: u5 m$ e2.0000 - G* T$ W& _ u8 ~; c
1.0000
: l8 g" {, d# b& nA*x1-b
h7 _) b- x$ A2 Y7 a7 O! [# U3 Yans= & }% T0 F* p b2 |
1.0e-014 * H" x5 T, |' |
-0.0888 " ]( r; Z& E9 ?& ~, U- _* E
-0.0888 * r8 @1 L/ B) D5 q, j: z z9 g
-0.1332 5 } ~9 M& u; d/ u% q+ Q
0
% y" X, m, w" z4 w可见x1并不是方程Ax=b的精确解,用x2=pinv(A)*b所得的解与x1相同。
, b' r4 W8 m! W- ~$ t) L
?+ y s# | }! O8 T' Q三.欠定方程组 ! \# ~) \7 g+ {) L! [" m
欠定方程组未知量个数多于方程个数,但理论上有无穷个解。MATLAB将寻求一个基本解,其中最多只能有m个非零元素。特解由列主元qr分解求得。
! U+ H: r- L7 h1 q/ @【例8】 : B* Z! A2 \3 W; ]$ D5 B+ H6 ?
解欠定方程组
& B9 ~- k$ ^) T" @. o! F6 \. eA=[1 -2 1 1;1 -2 1 -1;1 -2 1 5] $ e, ^8 Y) X5 r. s: R" C
A=
2 Y; M I+ v* ?( U; _- [( }; i! H1 -2 1 1 1 I$ O9 w# f9 _: Z% a Z. ~7 G
1 -2 1 -1 ; k* \3 e* q# _8 }% Q2 h
1 -2 1 -1 ) |, n8 N1 o V' f( P6 P; `% ~
1 -2 1 5
0 { W8 C+ ], K" ]1 i0 S ~6 \+ vb=[1 -1 5]’
4 @. h0 m& }6 px1=A\b 9 e' T6 l' @4 p P; X. v& v* J1 S
Warning:Rank deficient,rank=2 tol=4.6151e-015
% S/ s* j' i/ gx1=
& U0 s; v/ ~- }- G6 }0
( n& e6 n/ i) p6 @1 S/ f-0.0000
: W1 m% J2 C6 }) t0
, k0 \0 M' W( [. X" f5 i1.0000
; n6 e+ N: k) @x2=pinv(A)*b
3 [( s J+ S$ C7 c/ Ux2=
( h, ]! K* x9 G* G" Z+ \; u# u0
: ~* N! X1 E+ p- K2 J5 r-0.0000 % k4 g# |" ]# y" ^( }
0.0000
: s# ?1 O, F- Y( C2 _' z1.0000 7 r( o5 z5 a T2 L1 R3 R0 f" [
& `" e9 c' s, v, q+ Z' ]6 a
四.方程组的非负最小二乘解
, M, C5 i# n& I$ x/ w( a$ T& \在某些条件下,所求的线性方程组的解出现负数是没有意义的。虽然方程组可以得到精确解,但却不能取负值解。在这种情况下,其非负最小二乘解比方程的精确解更有意义。在MATLAB中,求非负最小二乘解常用函数nnls,其调用格式为: & o; x! R6 [8 a: T! o8 x
(1)X=nnls(A,b)返回方程Ax=b的最小二乘解,方程的求解过程被限制在x 的条件下; * n# _% K6 u4 }, s6 g2 _
(2)X=nnls(A,b,TOL)指定误差TOL来求解,TOL的默认值为TOL=max(size(A))*norm(A,1)*eps,矩阵的-1范数越大,求解的误差越大; * ?4 n# _9 U/ P
(3)[X,W]=nnls(A,b) 当x(i)=0时,w(i)<0;当下x(i)>0时,w(i)0,同时返回一个双向量w。
) e: V1 B5 G- c【例9】求方程组的非负最小二乘解 2 N7 z' j1 {8 M1 F, Z
A=[3.4336 -0.5238 0.6710 3 \; j" d1 @ r6 {4 U
-0.5238 3.2833 -0.7302
' T* Z& s( z! z& c& q7 [0.6710 -0.7302 4.0261];
; L' T5 {% t1 y {0 Qb=[-1.000 1.5000 2.5000];
9 S9 T( Z' \5 V! }! w[X,W]=nnls(A,b)
- z6 _, s5 A8 rX= ; ]! e7 {5 r( e9 U/ j% ^0 e) E
0
) |! o; q6 s$ ?, A1 `0.6563 9 C4 F K0 l7 S. h& K, \
0.6998 ! y; [6 w( {" I) N
W=
5 A9 x7 q* i8 r+ ^6 {0 ]-3.6820 8 h' |7 |0 H: H2 v
-0.0000 ]: b1 S0 D% A2 H& Z1 e
-0.0000 9 G7 k# K* L' Q
x1=A\b
5 p0 H9 \0 q' y; q! W4 r9 p; _' ox1= 0 G2 z- q" r* a5 r
-0.3569
; l- A5 R: M/ ~: h& e% F2 r0.5744 ) K8 d4 m" P7 K: P+ W: p$ d
0.7846
' z: G2 c5 X2 Q) }4 {( m+ r% P6 w$ x4 bA*X-b , G3 m/ m/ H7 {: Q8 f0 d+ h
ans= . G7 I& f# [; C7 [+ Y$ e
1.1258
- M+ m: X1 _; m# K, D! ?0.1437
% ]9 v) l: l3 M-0.1616
5 ]. I0 A: a+ o( z {2 H1 KA*x1-b
! u$ _6 }; Q- d6 ~+ v9 J, S" }ans=
4 a) \' X* c8 k( e( z1.0e-0.15 . V6 g8 i* R4 ~# p( m' R! j
-0.2220
. M& u9 k* L% H8 O: ^( W. r0.4441
. X+ s5 E+ i; ^4 P4 Z0 ?0 |
|