找回密码
 注册
关于网站域名变更的通知
查看: 1860|回复: 1
打印 上一主题 下一主题

Matlab求解线性方程组、非线性方程组

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-10-24 13:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
求解线性方程组
0 z6 ^4 E, H# H5 _+ w7 rsolve,linsolve* O8 P8 D. n  u' @% Q
例:. f5 |! a, K" S) l, p& i) I4 V* e5 t: |
A=[5 0 4 2;1 -1 2 1;4 1 2 0;1 1 1 1];$ w! d0 C4 J5 I" l8 W( k
%矩阵的行之间用分号隔开,元素之间用逗号或空格/ f, B2 M( }( T2 Z2 \. a8 f
B=[3;1;1;0]
5 r. N$ Q2 ]  S3 ?+ ?( AX=zeros(4,1);%建立一个4元列向量
4 @! J  i  C5 ?' p  x% j  ~! {6 ?X=linsolve(A,B)
% f( G0 z+ e9 c8 N2 o  Y) ^& L0 W6 ndiff(fun,var,n):对表达式fun中的变量var求n阶导数。
% Q& a  [1 I" O$ [( I8 {" t3 I2 i) m
例如:F=sym('u(x,y)*v(x,y)'); %sym()用来定义一个符号表达式
" ^, k0 u/ u, T% ^, r% D0 C0 l0 kdiff(F); %matlab区分大小写
" c, H1 f1 d; ?$ G4 R0 zpretty(ans) %pretty():用习惯书写方式显示变量;ans是答案表达式$ J, X' y% L" P1 [! L3 X

6 z' w% G, u4 c" Z$ }& N* Y
& S+ q: R4 v! J* [+ D非线性方程求解 + y0 g. c$ `$ a( C
fsolve(fun,x0,options)
. }- f: J- {7 q% D( M- c其中fun为待解方程或方程组的文件名;
6 |) z4 a* v, {4 }: q" kx0位求解方程的初始向量或矩阵;
; {2 u2 I6 c' l3 d( s$ \6 ^9 @, T3 uoption为设置命令参数' c* U! @; R/ a3 `" v, y
建立文件fun.m:
. S- ]8 e: u4 j! `2 lfunction y=fun(x)
, O- F' D7 Q" H$ F9 w! b/ g) \* Qy=[x(1)-0.5*sin(x(1))-0.3*cos(x(2)), ...
2 ~5 }6 p" n! Q! ^5 }0 K( z  sx(2) - 0.5*cos(x(1))+0.3*sin(x(2))];4 q2 V6 e2 _0 p" o; a7 ~/ E- X

: ^- D" s9 ^7 }) M# Y! G# k' M& `>>clear;x0=[0.1,0.1];fsolve(@fun,x0,optimset('fsolve'))
% [2 I5 E( n- _" Z* Z; J; Y注:
& i# B" I& U$ u: I# ^...为续行符
* Q6 l  u7 _. T; s/ Am文件必须以function为文件头,调用符为@;文件名必须与定义的函数名相同;fsolve()主要求解复杂非线性方程和方程组,求解过程是一个逼近过程
( \' I( `; [6 j# E' e! {$ O9 e. @
. {/ S& v: K8 f: R! N( Z9 ?
4 X( g: R4 F9 R# r. g' m1 z" CMatlab求解线性方程组
6 q: e5 w: G# R  @1 m" ]AX=B或XA=B
- c" z: y: b  A9 B6 N; s在MATLAB中,求解线性方程组时,主要采用前面章节介绍的除法运算符“/”和“\”。如: 3 i$ P7 D5 p& P  q
X=A\B表示求矩阵方程AX=B的解;
5 s: \$ k$ L  g  CX=B/A表示矩阵方程XA=B的解。 % H. `2 g/ n: `. S; Z" h8 V
对方程组X=A\B,要求A和B用相同的行数,X和B有相同的列数,它的行数等于矩阵A的列数,方程X=B/A同理。 2 H$ e* y/ w& w6 S% E) D- x% d

) h$ J/ M, l; `4 X如果矩阵A不是方阵,其维数是m×n,则有:
6 B; D$ `+ l2 t3 ^! k. Q8 I* ?; X0 Um=n 恰定方程,求解精确解; 0 r) f: ]" a% k* r, y
m>n 超定方程,寻求最小二乘解; & b$ m7 M" @' }( Y( u+ V% y
m<n 不定方程,寻求基本解,其中至多有m个非零元素。 6 B* F3 @$ ], A- R6 I* i- k
针对不同的情况,MATLAB将采用不同的算法来求解。 + d0 f5 O4 `1 m$ s, Y7 L
) x$ @, ~7 d* w0 H$ k. n

, `( J( v+ w, j$ c& o) s1 Y一.恰定方程组 ( q( A3 t9 t, O, R
恰定方程组由n个未知数的n个方程构成,方程有唯一的一组解,其一般形式可用矩阵,向量写成如下形式:
- d! x5 \+ O6 S( W9 }- rAx=b 其中A是方阵,b是一个列向量;   E: k* O) J2 I6 f% u7 w+ s
在线性代数教科书中,最常用的方程组解法有:
* C2 X% ]9 u& |2 A+ i+ L+ I: e(1)利用cramer公式来求解法;
* D( e0 [* H# E) z- w4 q(2)利用矩阵求逆解法,即x=A-1b;
2 l" u+ N4 J4 M" Z- O/ m2 f$ U. H(3)利用gaussian消去法; 7 V8 f" g6 i; C. s/ c  U# f1 H. F! D
(4)利用lu法求解。
5 G; ?$ d- e+ ~6 {: B% `一般来说,对维数不高,条件数不大的矩阵,上面四种解法所得的结果差别不大。前三种解法的真正意义是在其理论上,而不是实际的数值计算。MATLAB中,出于对算法稳定性的考虑,行列式及逆的计算大都在lu分解的基础上进行。
4 k3 {  h4 j) X; v在MATLAB中,求解这类方程组的命令十分简单,直接采用表达式:x=A\b。 " g1 ?* _/ J* n/ X/ a& ?
在MATLAB的指令解释器在确认变量A非奇异后,就对它进行lu分解,并最终给出解x;若矩阵A的条件数很大,MATLAB会提醒用户注意所得解的可靠性。
" J7 k* D6 i8 R如果矩阵A是奇异的,则Ax=b的解不存在,或者存在但不唯一;如果矩阵A接近奇异时,MATLAB将给出警告信息;如果发现A是奇异的,则计算结果为inf,并且给出警告信息;如果矩阵A是病态矩阵,也会给出警告信息。
9 z* b. j4 r4 u注意:在求解方程时,尽量不要用inv(A)*b命令,而应采用A\b的解法。因为后者的计算速度比前者快、精度高,尤其当矩阵A的维数比较大时。另外,除法命令的适用行较强,对于非方阵A,也能给出最小二乘解。 - k; O- i4 g; H5 ^

' o5 u( r6 H- z) s& `, ]二.超定方程组
+ p8 K; q' ^4 r# I. w- ]# O) ~1 s对于方程组Ax=b,A为n×m矩阵,如果A列满秩,且n>m。则方程组没有精确解,此时称方程组为超定方程组。线性超定方程组经常遇到的问题是数据的曲线拟合。对于超定方程,在MATLAB中,利用左除命令(x=A\b)来寻求它的最小二乘解;还可以用广义逆来求,即x=pinv(A),所得的解不一定满足Ax=b,x只是最小二乘意义上的解。左除的方法是建立在奇异值分解基础之上,由此获得的解最可靠;广义逆法是建立在对原超定方程直接进行householder变换的基础上,其算法可靠性稍逊与奇异值求解,但速度较快;   y% R; p. [# ~1 I0 O8 h+ P. W- r
【例7】 4 d; ~7 x/ \  m; S
求解超定方程组
% ?7 q; ?2 Z: L3 F1 K4 TA=[2 -1 3;3 1 -5;4 -1 1;1 3 -13] , n* g) H, D1 a* Z  `' U
A= 9 A/ C- J# {4 r5 a. z
2 -1 3 ! P. F  z' @6 L! i$ y9 J8 p
3 1 -5
- k5 z6 d& ~3 l1 n: R: j3 u- {4 -1 1
! s! R& f& l% ~1 3 -13 4 x/ c+ g+ I' T4 H
b=[3 0 3 -6]’;
) F" r9 F  u& R1 z( @/ A, S( Qrank(A) 7 g5 V; F0 A! J7 X( T
ans=
5 W# V0 B3 y8 e* y! V3
1 [" i2 ?- J, K+ d" V8 }  ux1=A\b
8 o% @# l* S6 }/ Qx1=
& c. H0 B2 s4 P* Q- y! B1.0000 ' {- e+ h! r4 H8 F
2.0000
1 A1 l+ ^6 ]8 H' ?/ H2 @( x1.0000
/ A0 K  Y1 b7 jx2=pinv(A)*b: k0 k9 u* ~$ b, s, d5 n
x2=
! U' _, e/ d5 D$ h# i4 A8 G" Y1.0000 # c/ v) \1 G( b- f3 `, Q  k, W, y% X7 x7 b
2.0000
7 H' b) L7 t# Y1 Y: }/ I1.0000
3 T4 H! C, b3 p4 V# c5 OA*x1-b
; g! C% U8 }- _" F- L8 lans= - |3 r4 [- q2 |; z
1.0e-014 , R/ ~! U1 }5 u! h
-0.0888
* H! J8 u  C: ?" _% ^% C4 f9 a-0.0888
: M) Z9 W9 N- s; f0 E4 C9 F-0.1332
1 c' a8 Y7 q( v0 `0 5 d7 Y* @3 o( `- t% ?
可见x1并不是方程Ax=b的精确解,用x2=pinv(A)*b所得的解与x1相同。   Z' [. E& M+ `/ n( q8 V
+ x7 R0 Y9 N( j$ y' d  N: R
三.欠定方程组
6 e1 Z4 G' N' K+ {' w欠定方程组未知量个数多于方程个数,但理论上有无穷个解。MATLAB将寻求一个基本解,其中最多只能有m个非零元素。特解由列主元qr分解求得。 9 ]. Q0 f- Q9 @0 h/ G& u4 @2 T
【例8】 1 h& O# q# D, [3 K5 l8 J+ }
解欠定方程组
2 m" ^' \/ |, n9 ]' H4 p! c5 VA=[1 -2 1 1;1 -2 1 -1;1 -2 1 5]
% w7 t% Y9 C5 R  X2 K8 @2 M  BA=
* j6 {- H, ?8 B* d3 c% M# V. o1 -2 1 1 4 ^4 n! q! j) a( A
1 -2 1 -1
% b! l2 N& @6 A1 -2 1 -1 - J5 s- _! ?4 [2 Q4 I
1 -2 1 5 6 Z& K* q" h) J
b=[1 -1 5]’ : [* G$ L/ L) C
x1=A\b 0 P" G3 y0 s) o1 A$ t$ b/ {+ t
Warning:Rank deficient,rank=2 tol=4.6151e-015
0 I6 J! x/ S2 |/ E( P6 s( mx1= : ~* u& L' ?! l# o, K" B
0 . N% Z3 A5 A; ^6 b
-0.0000
& y3 R7 E% i2 |3 [0 & J7 S. y) d! x$ f# {+ ]/ X
1.0000
. X. l! i9 ?; xx2=pinv(A)*b
% N& d9 ~: j1 K& ox2= : J9 k( f: }( U& [
0
* M8 i8 ?' O) h2 @  J2 l-0.0000
7 @& O; C2 x. o, ^* D. D8 k0.0000 ) g3 c$ o% B7 q& {
1.0000
8 o# F4 B0 p# K* {% o. _% y7 }; I  ~! m8 E/ C
四.方程组的非负最小二乘解
2 s( k$ J7 b& u+ J1 V9 `) Q5 ~在某些条件下,所求的线性方程组的解出现负数是没有意义的。虽然方程组可以得到精确解,但却不能取负值解。在这种情况下,其非负最小二乘解比方程的精确解更有意义。在MATLAB中,求非负最小二乘解常用函数nnls,其调用格式为: 2 I0 y# ]* u" F1 I8 Q
(1)X=nnls(A,b)返回方程Ax=b的最小二乘解,方程的求解过程被限制在x 的条件下;   w# Z+ w1 n$ {# l& h' u
(2)X=nnls(A,b,TOL)指定误差TOL来求解,TOL的默认值为TOL=max(size(A))*norm(A,1)*eps,矩阵的-1范数越大,求解的误差越大; 5 p: K9 K2 @( I# L  }
(3)[X,W]=nnls(A,b) 当x(i)=0时,w(i)<0;当下x(i)>0时,w(i)0,同时返回一个双向量w。 . @5 v( N% L  n
【例9】求方程组的非负最小二乘解
( s8 z- X% W) A# o& p. gA=[3.4336 -0.5238 0.6710 - j1 {- }. V: j3 O. Q3 Q
-0.5238 3.2833 -0.7302 / c& C; o/ k5 o( A" h) s
0.6710 -0.7302 4.0261];
, a3 W1 @8 ~+ I& d+ Pb=[-1.000 1.5000 2.5000]; : j+ D3 S5 k& L
[X,W]=nnls(A,b) 6 v) i7 A* _2 n# A7 b/ F. E
X=
& _$ V! E. t8 G: A0 R. d; @" n0 8 O& g$ j% V" _& M- L
0.6563
( U. S# q1 _5 J9 k0.6998
( V( s& b0 B! B( ZW= ' t* q) S# L0 q
-3.6820
; A! Z4 q! h! {6 {* J! `-0.0000 5 ~: C* p: [: a
-0.0000   P) p7 S5 U* t: K1 D! U7 ?8 {/ K
x1=A\b
6 b- N$ u7 }* R) Ix1=
5 o& Q; Y+ ?5 A8 A, t-0.3569 4 p$ g+ U( o- A4 D
0.5744
7 O: `; f7 E' X8 I/ O0 ~: G0.7846
' Z  F+ F% ?( l. ]6 e8 S  x" wA*X-b 8 `7 u. _  |) |" `/ d+ m
ans=   c/ h7 {, W" N9 c5 Y, K6 j- a& r
1.1258
3 x5 \  e7 K# c/ ?3 Y0.1437 # n# N- Q, W1 b& x) K( n2 C
-0.1616
! S( A2 L/ a! g$ A. ~: B. FA*x1-b
! j# v' H: e5 y: S$ p: bans= - [& B5 ~5 ^% D# R; ^; ~; A2 ~! |
1.0e-0.15 8 E8 j, M* l! K. V4 K$ ?
-0.2220
& \% ]! w* y. \: t1 a! u8 _6 C% O0.4441 : V2 ?. r% N' @4 f7 v& ^1 m4 m( _
0
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-14 22:17 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表