241 CHƯƠNG 5: CÁC PHƯƠNG TRÌNH PHI TUYẾN §1.KHÁINIỆMCHUNG Nếuphươngtrìnhđạisốhaysiêuviệtkháphứctạpthìítkhitìmđược nghiệmđúng.Bởivậyviệctìmnghiệmgầnđúngvàướclượngsaisốlàrất c ầnthiết. Taxétphươngtrình: f(x)=0(1) vớif(x)làhàmchotrướccủabiếnx.Chúngtacầntìmgiátrịgầnđúngcủa nghiệmcủaphươngtrìnhnày. Quátrìnhgi ảithườngchialàmhaibước:bướcsơbộvàbướckiệntoàn nghiệm. Bước giải sơ bộ có 3 nhiệm vụ: vây nghiệm,tách nghiệmvàthuhẹp khoảngchứanghiệm. Vây nghiệmlàtìmxemcácnghiệmcủaphươngtrìnhcóthểnằmtrên nhữngđoạnnàocủatrụcx.Táchnghiệmlàtìmcáckhoảngchứanghiệmsao cho trong mỗi khoảng chỉ cóđúng m ột nghiệm. Thu hẹp khoảng chứa nghiệmlà làmchokhoảngchứanghiệmcàngnhỏcàngtốt.Saubướcsơbộta cókhoảngchứanghiệmđủnhỏ.Đểxácđịnhkhoảngchứanghiệmta cóthể dùngphươngphápđồthị.Ngoàiratacũngcóthểtìmnghiệmbằngphương pháptìmtăngdần.Ýtưởngcủaphươngphápnàylànếyf 1(x).f2(x)<0thìcóít nhấtmộtnghiệmcủaphươngtrìnhtrongđoạn[x 1,x2].Nếuđoạn[x1,x2]đủ nhỏthìtrongđạonđósẽcómộtnghiệmduynhất.Nhưv ậytacóthểphát hiệnranghiệmbằngcáchtínhtrịcủahàmtrêncácđoạn∆xvàxemchúngcó đổidấukhông. Taxây dựnghàmrootsearch()đểtìmkhoảngchứanghiệm. function[x1,x2]=rootsearch(func,a,b,dx) %Timdoanchuanghiemcuahamf(x). %Cuphap:[x1,x2]=rootsearch(func,a,d,dx) %func=hamf(x). %a,b=daontim. %dx=khoangtang %x1,x2=doanchunghiem (a,b); %datlaNaNneukhongthaynghiem 242 x1=a;f1=feval(func,x1); x2=a+dx;f2=feval(func,x2); whilef1*f2>0.0 ifx1>=b x1=NaN;x2=NaN; return end x1=x2;f1=f2; x2=x1+dx;f2=feval(func,x2); end Khipháthi ệnthấykhoảng chứanghiệm,hàm trảvềgiátrịbiên củađoạn. Nếukhôngcónghiệm,x1=x2=NaN.Tagọirootsearch()nhiềulầnđểphát hiệnhếtcácđoạnchứanghiệm. Vớivídụtìmkhoảngchứanghiệmcủahàm f(x)=x 3 ‐10x 2 +5tadùngchươngtrìnhctrootsearch.m clearall,clc f=inline(ʹx^3‐10*x^2+5ʹ); [x1,x2]=rootsearch(f,2,10,.2) Bướckiệntoànnghiệmtìmcácnghiệmgầnđúngtheoyêucầuđặtra. Córấtnhiềuph ươngphápxácđịnhnghiệmcủa(1).Sauđâychúngta xéttừngphươngpháp. §2.PHƯƠNGPHÁPLẶPĐƠN Giảsửphươngtrình(1)đượcđưavềdạngtươngđương: x=g(x)(2) từgiátrịx onàođógọilàgiátrịlặpđầutiêntalậpdãyxấpxỉbằngcôngthức: x n=g(xn‐1)(3) vớin=1,2, Hàmg(x)đượcgọilàhàmlặp.Nếudãyx n→αkhin→∝thìtanóiphéplặp (3)hộitụ. Tacóđịnhlí:Xétphươngpháplặp(3),giảsử: ‐[a,b]làkhoảngchứanghiệmαcủaphươngtrình(1)tứclàc ủa(2) ‐mọix ntínhtheo(3)đềuthuộc[a,b] ‐g(x)cóđạohàmthoảmãn: 243 g(x) q 1 a x b ′ ≤< <<(4) trongđóqlàmộthằngsốthìphươngpháplặp(3)hộitụ Tacóthểminhhoạphéplặptrênbằnghìnhvẽsau. Taxâydựnghàm simpiter()đểlặp function[x,err,xx]=simpiter(g,x0,tolx,maxiter) %giaiptx=g(x)tux0bangcahlap %vao:g,x0=hamvagiatridau %tolx=saisomongmuon %maxiter=solanlapmax %ra:x=nghiem %err= saiso|x(k)‐x(k‐1)| %xx=cacgiatritrunggian ifnargin<4 maxiter=100; end ifnargin<3 tolx=1e‐6; end xx(1)=x0; fork=2:maxiter xx(k)=feval(g,xx(k‐1)); err=abs(xx(k)‐xx(k‐1)); if err<tolx break; end x1 xo x1 xo 244 end x=xx(k); ifk==maxiter fprintf(ʹKhonghoitusau%dlanlap\nʹ,maxiter) else fprintf(ʹHoitusau%dlanlap\nʹ,k) end Đểtínhlạivídụtrêntadùngchươngtrình ctsimpiter4_2.m clearall,clc f=inline(ʹ‐0.5*((x‐1).^2‐3)ʹ); [x,ss,xx]=simpiter(f,0.5,.00001,200) §3.PHƯƠNGPHÁPCHIAĐÔICUNG Giả sử cho phương trình f(x) = 0 với f(x)liêntụctrênđoạn[a,b]vàf(a).f(b)<0. Chiađoạn [a, b]thành 2 phần bởi chính điểmchia(a+b)/2. 1.Nếuf((a+b)/2)=0thì ξ=(a+b)/2 2. Nếu f((a + b)/2) ≠ 0 thì chọn [a,(a+b)/2]hay[(a+ b)/2,b]màgiátrịhàm haiđầutráidấuvàkíhiệulà[a 1,b1].Đốivới [a 1,b1]talạitiếnhànhnhư[a,b]. Taxâydựnghàm bisection()thựchiệnthuậttoántrên function[x,err,xx]=bisection(f,a,b,tolx,maxiter) %bisection.mdegiaiptf(x)=0bangphuongphapchiadoicung %vao:f=hamcantimnghiem %a/b=biencuadoancantimnghiem %tolx=saisomongmuon %maxiterlanlapmax %ra:x =nghiem %err=saiso %xx=cacgiatritrunggian y x a b ξ b 1 245 tol=eps; fa=feval(f,a); fb=feval(f,b); iffa*fb>0 error(ʹNghiemkhongotrongdoannayʹ); end fork=1:maxiter xx(k)=(a+b)/2; fx=feval(f,xx(k)); err=(b‐a)/2; ifabs(fx)<tol|abs(err)< tolx break; elseiffx*fa>0 a=xx(k); fa=fx; elseb=xx(k); end end x=xx(k); ifk==maxiter fprintf(ʹKhonghoitusau%dlanlap\nʹ,maxiter), else fprintf(ʹHoitusau%dlanlap\nʹ,k), end Đểtìmnghiệmcủahàmf(x)=tg(π‐)‐xtadùngchươngtrình ctbisection.m clearall,clc f=inline(ʹtan(pi‐x)‐xʹ); [x,ss,xx]=bisection(f,1.6,3,1e‐4,50) §4.PHƯƠNGPHÁPDÂYCUNG Giảsửf(x)liêntụctrêntrênđoạn[a,b]vàf(a).f(b)<0.Cầntìmnghiệm củaf(x)= 0.Đểxácđịnhtaxemf(a)<0vàf(b)>0.Khiđóthayvìchiađôi đoạn[a,b]tachia[a,b] theotỉlệ‐f(a)/f(b).Điềuđóchotanghiệmgầnđúng: x 1=a+h1 246 Trongđó 1 f(a) (b a) h f(a) f(b) = − − −+ Tiếptheodùngcáchđóvớiđoạn[a,x 1] hay[x 1,b]màhaiđầuhàmnhậngiátrịtrái dấutađượcnghiệmgầnđúngx 2v.v. Vềmặthìnhhọc,phươngphápnàycó nghĩalàkẻdâycungcủađườngcongf(x) quahaiđiểmA[a,f(a)]vàB[b,f(b)]haynóicáchkháclàtuyếntínhhoáhàm f(x)trongđoạn[a,b]. Thật vậyphươngtrìnhdâycungABcódạng: f(a) f(b) af(b) bf(a) yx ab ab −− =+ −− Chox=x 1,y=0tacó 1 af(b) bf(a) x f( b) f(a) − = − (1) Taxâydựnghàm chord()đểthựchiệnthuậttoántrên function[x,err,xx]=chord(f,a,b,tolx,maxiter) %giaiptf(x)=0bgphuongphapdaycung. %vao:f‐hamcantimnghiem %a/b‐khoangtimnghiem %tolx‐saisomongmuoncuanghiem %maxiterlanlapmax %ra:x‐nghiem %err‐sai so %xx‐cacgiatritrunggian tolfun=eps; fa=feval(f,a); fb=feval(f,b); iffa*fb>0 error(ʹNghiemkhongotrongdoannay!ʹ); end fork=1:maxiter xx(k)=(a*fb‐b*fa)/(fb‐fa);%pt.(1) fx=feval(f,xx(k)); err=min(abs(xx(k)‐a),abs(b‐xx(k))); a b x y x1 ξ 247 ifabs(fx)<tolfun|err<tolx break; elseiffx*fa>0 a=xx(k); fa=fx; else b=xx(k); fb=fx; end end x=xx(k); ifk==maxiter fprintf(ʹKhonghoitusau%dlanlap\nʹ,maxiter) else fprintf(ʹ Hoitusau%dlanlap\nʹ,k) end Đểtìmnghiệmcủahàmf(x)=tg(π‐x)‐xtadùngchươngtrình ctchord.m clearall,clc f=inline(ʹtan(pi‐x)‐xʹ); [x,ss,xx]=falsp(f,1.7,3,1e‐4,50) §5.PHƯƠNGPHÁPNEWTON‐RAPHSON Phương pháp lặp Newton(còn gọi là ph ương pháp tiếp tuyến)được dùngnhiềuvìnóhộitụnhanh.Tuynhiênphươngphápnàyđòihỏitínhfʹ(x). CôngthứcNewton‐RaphsonđượcsuytừkhaitriểnTaylorc ủaf(x)lâncậnx: 2 i1 i i i1 i i1 i f(x ) f(x) f(x)(x x) O(x x) +++ ′ =+ −+ −(1) Nếux i+1lànghiệmcủaphươngtrìnhf(x)=0thì(1)trởthành: 2 iii1i i1i 0 f(x ) f (x )(x x ) O(x x ) ++ ′ =+ −+ −(2) Giảsửrằngx igầnvớixi+1,tacóthểbỏquasốhạngcuốitrong(2)vàcócông thứcNewton‐Raphson: i i1 i i f(x ) xx f(x) + =− ′ (3) Nếux i+1lànghiệmđúngcủaphươngtrìnhthìsaisốlàei=x‐xi.Khinghiệm đượctínhtheo(3)thìsaisốlà: 248 2 i i1 i i f(x) ee 2f (x ) + ′′ =− ′ Minh hoạ hình học của thuật toán Newton‐Raphsonnhưhìnhbên. Thuậttoánđượctómlượcnhưsau: ‐chox o ‐tính f(x) x fʹ(x) ∆=− ‐chox=x+∆x ‐lặplạibước2và3chođếnkhi|∆x|≤ε Taxâydựnghàm newtonraphson()đểthựchiệnthuậttoántrên. function[x,fx,xx]=newtonraphson(f,df,x0,tolx,maxiter) %giaiptf(x)=0bangppNewton‐Raphson. %vao:f=ftntobegivenasastring’f’ifdefinedinanM‐file %df=df(x)/dx(neukhongchosedungdaohamso.) %x0 =giatribandau %tolx=saisomongmuon %maxiter=solanlapmax %ra:x=nghiem %fx=f(x(last)),xx=cacgiatritrunggian h=1e‐4; h2=2*h; tolf=eps; ifnargin==4&isnumeric(df) maxiter=tolx; tolx=x0; x0=df; end xx(1)=x0; fx=feval(f,x0); fork=1:maxiter if~isnumeric(df) dfdx=feval(df,xx(k));%daohamcuaham else dfdx=(feval(f,xx(k)+h)‐feval(f,xx(k)‐h))/h2;%daohamso a b =xo x1 y x 249 end dx=‐fx/dfdx; xx(k+1)=xx(k)+dx;%pt.(3) fx=feval(f,xx(k+1)); ifabs(fx)<tolf|abs(dx)<tolx, break; end end x=xx(k+1); ifk==maxiter fprintf(ʹKhonghoitusau%dlanlap\nʹ,maxiter) else fprintf(ʹ Hoitusau%dlanlap\nʹ,k) end Để tính lại nghiệm của hàm cho trong ví dụ trên ta dùng chương trình ctnewraph.m clearall,clc f=inline(ʹx.^3‐10*x.^2+5ʹ); [x,ss,xx]=newtonraphson(f,0.7,1e‐4,50) §6.PHƯƠNGPHÁPCÁTTUYẾN Phươngphápcáttuy ếncóthểcoilàbiếnthểcủaphươngphápNewton ‐Raphsontheonghĩađạohàmđượcthaybằngxấpxỉ: kk1 kk1 f( x ) f(x ) f(x) xx − − − ′ ≈ − (1) vàtốnítthờigiantínhhơnkhidùngđạohàmgiảitíchhayđạohàmsố. Bằngcáchxấpxỉ,biểuthức: k k1 k k f(x ) xx f(x ) + =− ′ trởthành: − + − ⎡⎤ − =− =− ⎢⎥ − ⎣⎦ kk1 k k1 k k k kk1 k xx f(x) xxf(x) x f(x ) f(x ) dfdx (2) với kk1 k kk1 f( x ) f(x ) dfdx xx − − − = − 250 Phươngtrình(2)chínhlàbiểuthứctổngquátcủaphéplặp.Haigiátrịđầu tiênx 1vàx2cầnđểkhởiđộngphépl ặp.Quátrìnhlặpđượcminhhoạbằng hìnha Phéplặpcóthểkhônghộitụ(hìnhb).Tuynhiênkhihộitụ,nóhộirấtnhanh. Taxâydựnghàm secant()đểthựchiệnthuậttoántrên. function[x,fx,xx]=secant(f,x0,x1,tolx,maxiter) %giaiptf(x)=0bgphuongphapdaycung %vao:f‐hamcantimnghiem %x0,x1‐giatrikhoidongpheplap %tolx‐saisomongmuon %maxiter‐solanlapmax %ra:x =nghiem %fx=f(x(last)),xx=cacgiatritrunggian h=(x1‐x0)/100; h2=2*h; tolfun=eps; xx(1)=x0; fx=feval(f,x0); fork=1:maxiter ifk<=1 dfdx=(feval(f,xx(k)+h)‐feval(f,xx(k)‐h))/h2; else dfdx =(fx‐fx0)/dx; x0 x1 x2 f(x) x y a x0 x1 f(x) x y b [...]... (p(1)^2 + 2*p(2)^2 ‐ p(3) ‐ 6 (p(1) ‐3*p(2 )^2 + p(3)^2 + 2)]; Để giải hệ phương trình ta dùng chương trình ctnew4sys2.m: clear all, clc format long p = [1 1 1 ]; r = new4sys2(@t, p, 50) §13. PHƯƠNG PHÁP BROYDEN DÙNG CHO HỆ PHI TUYẾN 1. Phương pháp Broyden: Để giải hệ phương trình phi tuyến tính F([X]) = [0] bằng phương pháp lặp Newton ta cho vec tơ nghiệm ban đầu [P0] và tạo ra dãy [Pk] hội tụ về nghiệm [P], nghĩa là F([P]) = [0]. Khi này ta cần tính ma trận ... if abs(fx) . 241 CHƯƠNG 5: CÁC PHƯƠNG TRÌNH PHI TUYẾN §1.KHÁINIỆMCHUNG Nếu phương trình đạisốhaysiêuviệtkháphứctạpthìítkhitìmđược nghiệmđúng.Bởivậyviệctìmnghiệmgầnđúngvàướclượngsaisốlàrất c ầnthiết. . trình ctsecant.m clearall,clc f=inline(ʹx.^3‐10*x.^2+5ʹ); [x,ss,xx]=secant(f,0.5,1,1e‐4,50) §7.PHƯƠNGPHÁPBRENT Phương pháp Brent kêt hợp phương pháp chiađôi cung và phương phápnộisuybậchaiđểtạo ra một phương pháptìmnghiệm của phương trình f(x)