|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
求解线性方程组0 B6 a) s2 r6 E8 Y$ l% x
solve,linsolve" ], P5 n# n( t1 \8 P7 z
例:- b! e( m/ z6 N: T
A=[5 0 4 2;1 -1 2 1;4 1 2 0;1 1 1 1];
1 O5 g$ o, Q; j5 W" u%矩阵的行之间用分号隔开,元素之间用逗号或空格
# t2 F2 W$ F9 a8 m! ?+ Y+ d2 OB=[3;1;1;0]
1 L1 v6 ]8 e1 M# c GX=zeros(4,1);%建立一个4元列向量- c j# h, F/ Q5 L+ l% X
X=linsolve(A,B)
- D# A! ]8 _- hdiff(fun,var,n):对表达式fun中的变量var求n阶导数。* m- i9 e) Q$ p# O9 f; G9 z6 Y
- x# i" l- e4 ?) `5 V& }4 s' g例如:F=sym('u(x,y)*v(x,y)'); %sym()用来定义一个符号表达式
& p/ Q' `; L. n, b' Vdiff(F); %matlab区分大小写
N: U& M( \* m1 j2 w! c0 Upretty(ans) %pretty():用习惯书写方式显示变量;ans是答案表达式
# |0 J5 M$ t6 _- m: B! t" B$ `, y8 K3 S3 @6 d4 p$ b" A2 d
6 s# r7 ^0 p/ h" i7 k* W- E非线性方程求解
( [" D' X5 M5 f/ M, @fsolve(fun,x0,options) d: R% F6 i+ C' `* b. h5 v
其中fun为待解方程或方程组的文件名;! f$ W" w' Q s3 b6 s+ k# b( C
x0位求解方程的初始向量或矩阵;
" X' j# `. y# l7 z$ \option为设置命令参数
( I7 g$ u; N! f6 V5 u建立文件fun.m:/ R2 P: h k2 U, u5 \: g y2 {
function y=fun(x)" Y9 J4 w6 V" D b/ E
y=[x(1)-0.5*sin(x(1))-0.3*cos(x(2)), ...# o2 |' n2 F R) ]" W9 Z& ~
x(2) - 0.5*cos(x(1))+0.3*sin(x(2))];
4 W! p! x' p$ c
% |7 u/ X" W/ \% C4 b! D1 o>>clear;x0=[0.1,0.1];fsolve(@fun,x0,optimset('fsolve'))
% d* k# \; `+ n* V注:; \6 a) @) [6 f' C4 b
...为续行符
! m9 a7 O- ]: ?m文件必须以function为文件头,调用符为@;文件名必须与定义的函数名相同;fsolve()主要求解复杂非线性方程和方程组,求解过程是一个逼近过程。
! f: n0 ~, V1 t
9 x, O% M' {8 l
% i5 O1 A, e. T8 E8 ~Matlab求解线性方程组( Q1 K+ \5 p% A: G- `
AX=B或XA=B
9 H& E V g3 M3 P" h在MATLAB中,求解线性方程组时,主要采用前面章节介绍的除法运算符“/”和“\”。如:
! K+ }4 i6 |# T7 _X=A\B表示求矩阵方程AX=B的解;
( ~* {% U ?$ ~8 N% ZX=B/A表示矩阵方程XA=B的解。
; I2 g6 V3 H- J: m9 Z, d! l对方程组X=A\B,要求A和B用相同的行数,X和B有相同的列数,它的行数等于矩阵A的列数,方程X=B/A同理。
9 _8 [' }0 \1 b9 F! R; @- ^* F2 F ?1 G1 ?# N) f0 Y
如果矩阵A不是方阵,其维数是m×n,则有:
# F+ j- {7 `4 J* am=n 恰定方程,求解精确解;
/ z% ^7 K" f* xm>n 超定方程,寻求最小二乘解; $ w7 u. G1 V/ k! y( g. }/ I
m<n 不定方程,寻求基本解,其中至多有m个非零元素。 # k7 F2 e: n2 o7 n
针对不同的情况,MATLAB将采用不同的算法来求解。
$ f9 O( A- ]9 [8 |! y0 }1 K d1 r- ~
% a C0 B" w! Q3 h: u+ _0 Q1 E. ?+ H# O
一.恰定方程组 ! C; d" [3 z3 W& H" O! P; A' [
恰定方程组由n个未知数的n个方程构成,方程有唯一的一组解,其一般形式可用矩阵,向量写成如下形式: 5 R4 J* Q* b$ D4 X. D. C7 f
Ax=b 其中A是方阵,b是一个列向量; - v* d1 X1 U& R& @- b
在线性代数教科书中,最常用的方程组解法有:
P# b$ S3 `9 ] h(1)利用cramer公式来求解法;
. B. b- ?7 G; A+ a* y* q(2)利用矩阵求逆解法,即x=A-1b;
$ R$ t6 Z8 w N: I9 q(3)利用gaussian消去法;
+ v' \4 U# k" n7 }' M5 T( P(4)利用lu法求解。 9 `1 w4 Q4 ]& J$ w, \; Z. ~
一般来说,对维数不高,条件数不大的矩阵,上面四种解法所得的结果差别不大。前三种解法的真正意义是在其理论上,而不是实际的数值计算。MATLAB中,出于对算法稳定性的考虑,行列式及逆的计算大都在lu分解的基础上进行。 % V7 X/ v; O4 h
在MATLAB中,求解这类方程组的命令十分简单,直接采用表达式:x=A\b。
) _3 q% e: x+ w3 b7 Q0 l在MATLAB的指令解释器在确认变量A非奇异后,就对它进行lu分解,并最终给出解x;若矩阵A的条件数很大,MATLAB会提醒用户注意所得解的可靠性。
+ D: r: Y+ z+ ^4 \6 l' K如果矩阵A是奇异的,则Ax=b的解不存在,或者存在但不唯一;如果矩阵A接近奇异时,MATLAB将给出警告信息;如果发现A是奇异的,则计算结果为inf,并且给出警告信息;如果矩阵A是病态矩阵,也会给出警告信息。
# Y% n [" E0 b; {注意:在求解方程时,尽量不要用inv(A)*b命令,而应采用A\b的解法。因为后者的计算速度比前者快、精度高,尤其当矩阵A的维数比较大时。另外,除法命令的适用行较强,对于非方阵A,也能给出最小二乘解。 - m1 P5 c8 X4 `
! g5 U& b2 ?5 H+ F二.超定方程组
- f7 i- ?" S; o8 i对于方程组Ax=b,A为n×m矩阵,如果A列满秩,且n>m。则方程组没有精确解,此时称方程组为超定方程组。线性超定方程组经常遇到的问题是数据的曲线拟合。对于超定方程,在MATLAB中,利用左除命令(x=A\b)来寻求它的最小二乘解;还可以用广义逆来求,即x=pinv(A),所得的解不一定满足Ax=b,x只是最小二乘意义上的解。左除的方法是建立在奇异值分解基础之上,由此获得的解最可靠;广义逆法是建立在对原超定方程直接进行householder变换的基础上,其算法可靠性稍逊与奇异值求解,但速度较快; 1 M; Y: g" i3 D) o* M
【例7】 5 H* u; M' e- a% e( V3 H9 i
求解超定方程组 2 q, D* W/ C! r* a, M
A=[2 -1 3;3 1 -5;4 -1 1;1 3 -13] ' B" I7 g. F; B" P1 A. s8 ~" C
A= 0 k& W u, K ?; n
2 -1 3
+ ~* T( P( C% M% g. C3 1 -5 - S' A1 N2 Z$ v8 P4 V& d2 E1 P# Y
4 -1 1 ; p: X5 p: _6 F* [. O% \' Z. f
1 3 -13 " I4 G* ?& Z3 X
b=[3 0 3 -6]’; # }0 n, K4 |4 a2 T
rank(A) ( G/ j8 k$ b6 t
ans=
2 G$ H& E1 ?- Y! L0 z" d3
7 f3 ~' S* _7 P2 {1 I0 m; F- ?x1=A\b ; v7 ]! h1 I9 {3 F" @ k
x1= & J/ k. [' l/ e B5 y+ g4 Z) D# W
1.0000 ) B7 D5 @' E M2 @5 n
2.0000 7 c4 F) d( W) @& t. \' k0 j
1.0000 2 {' t5 U/ W/ N
x2=pinv(A)*b
# u0 T" Q1 H3 ?$ ^% xx2=
4 Z- o+ E% l9 |* @, R1.0000 ! H x1 W: ?) b/ d6 p: U
2.0000 . H, y9 A5 c* q( A3 G0 `$ c
1.0000
8 J6 R) J, W% {; mA*x1-b 4 U1 `! i( s# [+ |5 C
ans= 8 ]0 I8 U4 v) ^
1.0e-014 & m8 y( Z5 f# K2 i: p% R
-0.0888
9 y. [' \2 Z- F. g! @. y2 @-0.0888
' j/ X8 L8 E3 b; W-0.1332
7 y# t& I* G6 e0 ~4 B7 h, z( y0
/ g% F2 x( Y6 w2 Z8 ~5 |9 l可见x1并不是方程Ax=b的精确解,用x2=pinv(A)*b所得的解与x1相同。 ; M' ?( s% Y' ~3 A
7 I, A- T5 s9 P0 l
三.欠定方程组 ) z9 U& x( E" u# W" a ^9 I
欠定方程组未知量个数多于方程个数,但理论上有无穷个解。MATLAB将寻求一个基本解,其中最多只能有m个非零元素。特解由列主元qr分解求得。 6 Q6 v: }" I' j6 F& u
【例8】 / Z* K2 C2 o" l+ }- e- z
解欠定方程组 : ^5 @; k* d$ v% f* P) S7 F1 x. K
A=[1 -2 1 1;1 -2 1 -1;1 -2 1 5]
5 x) H: {) L4 G5 d0 aA=
# y( `9 U. F6 K% p: }1 k, C4 k1 -2 1 1
( x+ ]+ f& G. Z1 -2 1 -1 5 x( c( Y8 N4 d' d
1 -2 1 -1 / ~# U; I' s. [4 w3 t
1 -2 1 5
8 J6 _: c$ \. Sb=[1 -1 5]’
4 i% K2 z+ p L. s- Hx1=A\b 5 B0 g6 k4 q+ F/ H! Z7 R% X
Warning:Rank deficient,rank=2 tol=4.6151e-015 9 X5 }& p& N# k1 g
x1= / P8 F# z0 z) L- _6 j0 I7 q
0
& z0 _2 e% e* p7 N5 [-0.0000
! c; l* @* j+ U4 j0 8 q# U6 n# v* [! v" S$ F0 ]
1.0000 + A9 |1 {% `) l% `
x2=pinv(A)*b * @, b! U/ a5 ]* U* C* R
x2=
2 R* R q8 R9 T5 }( r# E0 _0
% D [$ o( W4 t-0.0000
9 v" R! b# M5 I) i2 t* I- j0.0000
- @2 b. G5 j4 ]: T( q' Z1.0000 ' h. C( b8 E9 k/ Z& z3 J2 s1 G' U
* {( U6 Z5 r# I# F3 n- q! H+ U
四.方程组的非负最小二乘解 ; H5 K6 l) |: y
在某些条件下,所求的线性方程组的解出现负数是没有意义的。虽然方程组可以得到精确解,但却不能取负值解。在这种情况下,其非负最小二乘解比方程的精确解更有意义。在MATLAB中,求非负最小二乘解常用函数nnls,其调用格式为: ! [# P0 M; S( a1 _/ b2 @ R4 |
(1)X=nnls(A,b)返回方程Ax=b的最小二乘解,方程的求解过程被限制在x 的条件下;
& J1 h9 s Y% c2 _9 a$ c(2)X=nnls(A,b,TOL)指定误差TOL来求解,TOL的默认值为TOL=max(size(A))*norm(A,1)*eps,矩阵的-1范数越大,求解的误差越大; * J1 G+ i& G/ q7 b
(3)[X,W]=nnls(A,b) 当x(i)=0时,w(i)<0;当下x(i)>0时,w(i)0,同时返回一个双向量w。
: a: I2 _9 n: F& M* Y. s5 z【例9】求方程组的非负最小二乘解 7 {, T+ M8 q+ Q4 ?
A=[3.4336 -0.5238 0.6710
& P: [) q* c" a, Y-0.5238 3.2833 -0.7302
1 v, p6 b9 ^' q0.6710 -0.7302 4.0261]; * j( v b( u6 F
b=[-1.000 1.5000 2.5000]; 6 J% Z7 \5 }1 Q' y; r8 W) R, E# Z
[X,W]=nnls(A,b) 4 r( D/ }- h% y! S; l: Q
X= & M$ B- L! \& I! H. w
0
: B; G; W* W/ K& L |! {0 l/ R _: I0.6563 ' d- U1 N5 p8 |. ?" \7 w
0.6998 ) o* u# i# B& S6 [% C4 v
W= 5 d6 z% x$ t) p% Y' X% r) g
-3.6820 - r6 f' Z* \7 [# ~: t& P
-0.0000 % t: O/ |" x" M9 N1 d1 T$ a8 U% w- W
-0.0000 ' ]: a* E1 G3 ^ c- `5 b
x1=A\b , f, F T+ C1 `: D9 M3 i- m6 v/ }7 K
x1= . N. c' l- Z6 [7 l
-0.3569
: @# {8 f2 S, I+ x0.5744
8 \( o6 T4 D1 _7 Q0 m2 v( q0.7846
2 l. m4 q# A6 bA*X-b
; r6 S; {1 ~' N3 F+ f( h& X3 Eans=
: s" ]4 |% A; P9 q- F% T% r" P1.1258 % N3 a1 l' i8 A; @
0.1437
7 g% u) }3 S$ `! X l1 |-0.1616 3 R3 |) k1 Y" q
A*x1-b
8 j4 y( i9 _! c( Y) s& j# ?ans=
2 Y( p; _) P' j- h; Z j e1.0e-0.15 0 U9 f. B- p8 I0 f3 s) ~* |
-0.2220
7 K J1 e* G5 K) B0.4441 ' j# T$ y& l; S: v7 p
0 |
|