Thông tin tài liệu
CHƯƠNG2:GIẢIGẦNĐÚNGPHƯƠNGTRÌNH ĐẠISỐVÀSIÊUVIỆT §1.KHÁINIỆMCHUNG Nếu phương trìnhđại số hay siêuviệt khá phứctạp thìít khi tìm đượcnghiệmđúng.Bởivậyviệctìmnghiệmgầnđúngvàướclượngsaisố làr ấtcầ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ướcgiảisơbộcó3nhiệmvụ:vâynghiệm,táchnghiệmvàthuhẹp khoảngchứanghiệm. Vâynghiệmlàtìmxem cácnghiệmcủaph ươngtrìnhcóthểnằmtrên nhữngđoạnnàocủatrụcx.Táchnghiệmlàtìmcáckhoảngchứanghiệm soachotrongmỗi khoảngchỉcó đúngmộtnghiệm.Thuhẹpkhoảngchứa nghiệmlàlàmchokhoảngchứanghiệmcàngnhỏcàngtốt.Saubướcsơbộ tacókhoảngchứanghiệmđủnhỏ. Bướckiệntoànnghiệm tì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ịxonàođógọilàgiátrịlặpđầutiêntalậpdãyxấpxỉbằngcông thức: x n=g(x+‐1)(3) vớin=1,2, Hàmg(x)đượcgọilàhàmlặp.Nếudãyx n→αkhin→∝thìtanói phéplặp(3)hộitụ. x 1xoxox1 13 Tacóđịnhlí:Xétphươngpháplặp(3),giảsử: ‐[a,b]làkhoảngphânlinghiệ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: b xa,1 q )x(g < << ≤ ′ (4) trongđóqlàmộthằngsốthìphươngpháplặp(3)hộitụ Tacóthểminhhoạphéplặptrênbằnghìnhvẽtrên. Cáchđưaphươngtrìnhf(x)=0vềdạngx=g(x)đượcthự chiệnnhư sau:tathấyf(x) =0cóthểbiếnđổithànhx=x+ λf(x)vớiλ≠0.Sauđóđặt x+λf(x)=g(x)saochođiềukiện(4)đượcthoảmãn. Vídụ:xétphươngtrình x 3 +x‐1000=0 Saubướcgiảisơbộtacónghiệmx 1∈(9,10) Nếuđưaphươngtrìnhvềdạng: x=1000‐x 3 =g(x) thìdễthấy|g ʹ (x)|>1trongkhoảng(9,10)nênkhôngthoảmãnđiềukiện (4) Chúngtađưaphươngtrìnhvềdạng 3 x1000x −= thìtathấyđiềukiện(4)đượcthoảmãn.Xâydựngdãyxấpxỉ 3 n 1n x1000 x − = + vớix ochọnbấtkìtrong(9,10) Trêncơsởphươngphápnàychúngtacócácchươngtrìnhtínhtoán sau: Chương trình giải phương trình exp((1/3)*ln(1000‐x)) với số lần lặp cho trước Chươngtrình2‐1 //lapdon #include<conio.h> #include<stdio.h> #include<math.h> voidmain() { inti,n; floatx,x0; floatf(float); 14 clrscr(); printf(ʺChosolanlapn=ʺ); scanf(ʺ%dʺ,&n); printf(ʺChogiatribandaucuanghiemx0=ʺ); scanf(ʺ%fʺ,&x0); x=x0; for(i=1;i<=n;i++) x=f(x); printf(ʺNghiemcuaphuongtrinhla:%.4fʺ,x); getch(); } floatf(floatx) { floata=exp((1./3.)*log(1000‐x)); return(a); } vàchươngtrìnhgiảibàitoánbằngphươngpháplặpvớisaisốchotrước Chươngtrình2‐2 //lapdon #include<conio.h> #include<stdio.h> #include<math.h> voidmain() { inti; floatepsi,x,x0,y; floatf(float); clrscr(); printf(ʺChosaisoepsilon=ʺ); scanf(ʺ%fʺ,&epsi); printf(ʺChogiatribandaucuanghiemx0=ʺ); scanf(ʺ%fʺ,&x0); x=x0; y=f(x); if(abs(y‐x)>epsi) 15 { x=y; y=f(x); } printf(ʺNghiemcuaphuongtrinhla%.6fʺ,y); getch(); } floatf(floatx) { floata=exp((1./3.)*log(1000‐x)); return(a); } Chogiátrịđầuxo=1.Kếtquảtínhtoánx=9.966555 §3.PHƯƠNGPHÁPCHIAĐÔICUNG Giảsửchophươngtrìnhf(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. b 1 ξ b a x y 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ái dấuvà kíhiệu là[a 1,b1].Đối với[a 1,b1]talạitiếnhànhnhư[a,b] Cách làm trênđược mô tả trong chương trình sau dùngđểtìm nghiệmcủaphươngtrình: x 4 +2x 3 ‐x‐1=0 trênđoạn[0,1] Chươngtrình2‐3 //chiadoicung #include<conio.h> #include<stdio.h> #include<math.h> #defineepsi0.00001 voidmain() { 16 floatx0,x1,x2; floaty0,y1,y2; floatf(float); intmaxlap,demlap; clrscr(); printf(ʺTimnghiemcuaphuongtrinhphituyenʺ); printf(ʺ\nbangcachchiadoicung\nʺ); printf(ʺChocacgiatrix0,x1,maxlap\nʺ); printf(ʺChogiatrix0=ʺ); scanf(ʺ%fʺ,&x0); printf(ʺChogia trix1=ʺ); scanf(ʺ%fʺ,&x1); printf(ʺChosolanlapmaxlap=ʺ); scanf(ʺ%dʺ,&maxlap); y0=f(x0); y1=f(x1); if((y0*y1)>0) { printf(ʺNghiemkhongnamtrongdoanx0‐x1\nʺ); printf(ʺx0=%.2f\nʺ,x0); printf(ʺx1=%.2f\nʺ,x1); printf(ʺf(x0)= %.2f\nʺ,y0); printf(ʺf(x1)=%.2f\nʺ,y1); } demlap=0; do { x2=(x0+x1)/2; y2=f(x2); y0=f(x0); if(y0*y2>0) x0=x2; else x1=x2; demlap=demlap+1; } while(((abs((y2‐y0))>epsi)||(demlap<maxlap))); if(demlap>maxlap) { 17 printf(ʺPheplapkhonghoitusau%dlanlapʺ,maxlap); printf(ʺx0=%.2f\nʺ,x0); printf(ʺx1=%.2f\nʺ,x1); printf(ʺf(x2)=%.2f\nʺ,y2); } else { printf(ʺPheplaphoitusau%dlanlap\nʺ,demlap); printf(ʺNghiemx=%.2fʺ,x2); } getch(); } floatf(floatx) { floata=x*x*x*x+2*x*x*x‐x‐1; return(a); } Kếtquảtínhchonghiệm:x=0.87 §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 Trongđó )ab( )b(f)a(f )a( f h 1 − +− − = Tiếptheodùng cáchđóvớiđoạn[a,x 1]hay[x1,b]màhaiđầuhàm nhậngiátrịtráidấutađượcnghiệmgầnđúngx 2v.v. Vềmặthìnhhọc,phươngphápnàycónghĩalàkẻdâycungcủađườngcong f(x)quahaiđiểmA[a,f(a)]vàB[b,f(b)].ThậtvậyphươngtrìnhdâycungAB códạng: 18 )a(f)b(f )a( f y ab ax − − = − − ax 1ξb Chox=x 1y=0tacó )ab( )a(f)b(f )a( f ax 1 − − −= Trên cơ sở của phương pháp ta có chươngtrìnhtínhnghiệmcủaphương trình x 4 +2x 3 ‐x‐1=0 trênđoạn[0,1] Chươngtrình2‐4 //phuongphapdaycung #include<conio.h> #include<stdio.h> #include<math.h> #defineepsi0.00001 voidmain() { floata,b,fa,fb,dx,x; floatf(float); clrscr(); printf(ʺTimnghiemcuaphuongtrinhphituyen\nʺ); printf(ʺbangphuongphapdaycung\nʺ); printf(ʺChocacgiatria,b\nʺ); printf(ʺCho giatricuaa=ʺ); scanf(ʺ%fʺ,&a); printf(ʺChogiatricuab=ʺ); scanf(ʺ%fʺ,&b); fa=f(a); fb=f(b); dx=fa*(b‐a)/(fa‐fb); while(fabs(dx)>epsi) { x=a+dx; fa=f(x); 19 if((fa*fb)<=0) a=x; else b=x; fa=f(a); fb=f(b); dx=fa*(b‐a)/(fa‐fb); } printf(ʺNghiemx=%.3fʺ,x); getch(); } floatf(floatx) { floate=x*x*x*x+2*x*x*x‐x‐1; return(e); } Kếtquảtínhchonghiệm:x=0.876 §5.PHƯƠNGPHÁPLẶPNEWTON PhươngpháplặpNewton(còngọilàphươngpháptiếptuyến)được dùngnhiềuvìnóhộitụnhanh.Giảsửf(x) cónghiệmlàξđãđượctáchtrênđoạn[a, b]đồng thời fʹ(x) và fʺ (x) liên tục và giữ nguyên dấu trênđoạn [a, b]. Khiđã tìm được xấp xỉ nàođó xn ∈ [a, b] ta có thể kiện toàn nó theo phương phápNewton. TừmútBtavẽtiếptuyếnvớiđườ ngcong. Phươngtrìnhđườngtiếptuyếnlà x1 b =xo a )xx)( b ( f )x( f y 00 − ′ =− Tiếptuyếnnàycắttrụchoànhtạiđiểmcó y=0,nghĩalà: )xx)( b ( f )x( f 010 − ′ =− hay: )x(f )x( f xx 0 0 01 ′ −= Từx 1talạitiếptụcvẽtiếptuyếnvớiđườngcongthìgiaođiểmxisẽtiếntới nghiệmcủaphươngtrình. 20 Việcchọnđiểmbanđầuxorấtquantrọng.Trênhìnhvẽtrêntathấy nếuchọnđiểmbanđầux o=athìtiếptuyếnsẽcắttrụctạimộtđiểmnằm ngoàiđoạn[a,b].Chọnx o=bsẽthuậnlợichoviệctínhtoán.Chúngtacó địnhlí: Nếuf(a).f(b)<0;f(x)vàfʺ(x)kháckhôngvàgiữnguyêndấuxácđịnhkhix ∈ [a,b]thìxuấtpháttừxo ∈ [a,b]thoảmãnđiềukiệnf(xo).f ″ (xo)>0cóthểtính theophươngphápNewtonnghiệm ξ duynhấtvớiđộchínhxáctuỳý. KhidùngphươngphápNewtoncầnlấyxolàđầumútcủađoạn[a,b] đểtạiđóf(xo).fʺ(xo)>0.Ápdụnglíthuyếttrênchúngtaxâydựngchương trìnhtínhsau: Chươngtrình2‐5 //phuongphapNewton #include<conio.h> #include<stdio.h> #include<math.h> #include<stdlib.h> #definen50 #defineepsi1e‐5 voidmain() { floatt,x0; floatx[n]; inti; floatf(float); floatdaoham(float); clrscr(); printf(ʺTimnghiemcuaphuongtrinhphituyen\nʺ); printf(ʺbangphuongphaplap Newton\nʺ); printf(ʺChogiatricuax0=ʺ); scanf(ʺ%fʺ,&x0); i=1; x[i]=x0; do { x[i+1]=x[i]‐f(x[i])/daoham(x[i]); 21 t=fabs(x[i+1]‐x[i]); x[i]=x[i+1]; i=i+1; if(i>100) { printf(ʺBaitoankhonghoitu\nʺ); getch(); exit(1); } else ; } while(t>=epsi); printf(ʺNghiemx=%.5fʺ,x[i]); getch(); } floatf(floatx) { floata=x*x‐x‐2; return(a); } floatdaoham(floatx) { floatd=2*x‐1; return(d); } Chươngtrìnhnàyđượcdùngxácđịnhnghiệmcủahàmđãđượcđịnh nghĩatrongfunction.Trongtrườnghợpnàyphươngtrìnhđólà: x 2 ‐x‐1=0 Kếtquảtínhvớigiátrịđầux o=0chonghiệmx=2. §6.PHƯƠNGPHÁPMULLER Trongphươngphápdâycungkhitìmnghiệmtrongđoạn[a,b]taxấp xỉhàmbằngmộtđườngthẳng.Tuynhiênđểgiảmlượngtínhtoánvàđể nghiệmhộitụnhanhhơntacóthểdùngphương phápMuller.Nộidung củaphươngphápnàylàthayhàmtrongđoạn[a,b]bằngmộtđườngcong bậc2màtahoàntoàncóthểtìmnghiêmchínhxáccủanó.Gọicácđiểmđó 22 [...]... Ví dụ: Tìm nghiệm của hàm f(x) = sin(x) ‐ x /2 trong đoạn [1.8, 2. 2]. Ta chọn x0 = 2 Ta có : x0 = 2 f(x0) = ‐0.0907 h1 = 0 .2 x1 = 2. 2 f(x1) = ‐0 .29 15 h2 = 0 .2 x2 = 1.8 f(x2) = 0.07385 γ = 1 Vậy thì : 1 × ( −0 .29 15) − ( −0.0907 ) × (1 + 1) + 0.07385 a= = −0.453 12 1 × 0 .2 2 × (1 + 1) − 0 .29 15 − ( −0.097 ) − ( −0.453 12) × 0 .2 2 b= = −0.91338 0 .2 c = −0.0907 23 Ta có nghiệm gần x0 nhất là : ... a[1][1]=3*x[1]*x[1]‐3*x [2] *x[4]; a[1] [2] =‐3*x [2] *x [2] ‐3*x[1]*x[4]; a[1][3]=0; a[1][4]=‐3*x[1]*x [2] ; a[1][5]=x[1]*x[1]*x[1]‐x [2] *x [2] *x [2] ‐3*x[1]*x [2] *x[4]‐8; a [2] [1]=1; a [2] [2] =1; a [2] [3]=1; a [2] [4]=1; a [2] [5]=x[1]+x [2] +x[3]+x[4]‐5; a[3][1]=‐x[1]/sqrt (25 ‐x[1]*x[1]); a[3] [2] =0; a[3][3]=8; a[3][4]=0; a[3][5]=sqrt (25 ‐x[1]*x[1])+8*x[3]+4; a[4][1] =2* x [2] *x[3]; a[4] [2] =2* x[1]*x[3]; ... Dưới đây là chương trình giải hệ phương trình phi tuyến 3 ⎧x 1 − x 2 − 3 x 1 x 2 x 4 − 8 = 0 2 ⎪ ⎪x 1 + x 2 + x 3 + x 4 − 5 = 0 ⎨ 2 25 − x 1 + 8 x 3 + 4 = 0 ⎪ 2 x x x − x + 8 = 0 4 ⎩ 1 2 3 41 Ma trận đạo hàm riêng J(Xi) là : 2 ⎛ 3x 1 − 3x 2 x 4 − 3x 2 − 3x 1 x 4 − 3x 1 x 2 ⎞ 0 2 ⎟ ⎜ 1 1 1 1 ⎟ ⎜ x1 ⎜− 0 8 0 ⎟ 2 ⎟ ⎜ 25 − x 1 ⎟ ⎜ 2x 1x 3 2x1x 2 −1 ⎠ ⎝ 2x 2 x 3 Ma trận này được chương trình đọc vào nhờ thủ tục doc.Trong thủ tục ... b2 = a2 + b1x0 = ‐16 + 3.5 *2. 5 = ‐7 .25 P2(3.5) = b0x2 + b1x + b2 = 13.75 31 Pn ( x0 ) 1.375 = 3.5 + = 3.6 ′ Pn ( x0 ) 13.75 Lặp lại bước tính trên cho x1 ta có: Po = ao = 1 P1 = a1 + pox1 = ‐1 + 3.6*1 = 2. 6 P2 = a2 + p1x1 = ‐16 + 3.6 *2. 6 = ‐6.64 P3 = a3 + p2x1 = 24 + 3.6*(‐6.64) = ‐ 0.096 bo = ao = 1 b1 = a1 + box1 = ‐1 + 3.6*1 = 2. 6 b2 = a2 + p1x1 = ‐16 + 3.6 *2. 6 = ‐6.64 P2(3.6) = b0x2 + b1x + b2 = 15.68 ... ta nhận được các nghiệm : x1 = 2. 61903399 x2 = 2. 7 320 5081 x3 = 0.7 320 50755 x4 = 0.381966055 x5 = 0.500011056 + i*1. 322 8881 x6 = 0.500011056 ‐ i*1. 322 8881 40 §11. HỆ PHƯƠNG TRÌNH PHI TUYẾN Phương pháp Newton có thể được tổng quát hoá để giải hệ phương trình phi tuyến dạng : ⎧f1 ( x 1 , x 2 , x 3 , , x n ) = 0 ⎪f ( x , x , x , , x ) = 0 n 2 1 2 3 ⎪ ⎨f3 ( x 1 , x 2 , x 3 , , x... ∂x 2 ∂x 3 ∂f2 ∂f2 ∂f2 ⎟ ⎜ ∂f2 ⋅⋅⋅ ⎜ ∂x ∂x 2 ∂x 3 ∂x n ⎟ J( X i ) = ⎜ ⋅ ⋅ ⋅1 ⎟ ⋅⋅⋅ ⎟ ⎜ ⋅⋅⋅ ⎟ ⎜ ⋅⋅⋅ ⎜ ∂fn ∂fn ∂fn ∂fn ⎟ ⋅⋅⋅ ⎟ ⎜ ∂x n ⎠ ⎝ ∂x 1 ∂x 2 ∂x 3 và ∆X = Xi+1 ‐ Xi Phương pháp Newton tuyến tính hoá hệ và như vậy với mỗi bước lặp cần giải một hệ phương trình tuyến tính (mà biến là ∆xi) xác định bởi công thức lặp cho tới khi vectơ X(x1,x2,x3, ,xn) gần với nghiệm. Dưới đây là chương trình giải hệ phương trình phi tuyến ...có hoành độ lần lượt là a = x2, b = x1 và ta chọn thêm một điểm x0 nằm trong đoạn [x2, x1]. Gọi h1 = x1 ‐ x0 h2 = x0 ‐ x2 v = x ‐ x0 f(x0) = f0 f(x1) = f1 f(x2) = f2 h γ= 2 h1 Qua 3 điểm này ta có một đường parabol: y = av2 + bv + c Ta tìm các hệ số a,b,c từ các giá trị đã biết v: v = 0( x = x 0 ) a(0 )2 + b(0) + c = f0 2 v = h1 ( x = x1 ) ah1 + bh1 + c = f1 v = h 2 ( x = x 2 ) ah 2 + bh 2 + c = f2 2 Từ đó ta có : ... bằng 2 ta dùng các công thức tìm nghiệm của tam thức để tìm các nghiệm còn lại. Ví dụ: Tìm nghiệm của đa thức P3(x) = x3 ‐ x2 ‐16x + 24 a1 = ‐1 a2= ‐16 a3 = 24 ao = 1 Chọn xo = 3.5 ta có : Po = ao = 1 P1 = a1 + pox0 = ‐1 + 3.5*1 = 2. 5 P2 = a2 + p1x0 = ‐16 + 3.5 *2. 5 = ‐7 .25 P3 = a3 + p2x0 = 24 + 3.5*(‐7 .25 ) = ‐ 1.375 b0 = a0 = 1; b1 = a1 + box0 = ‐1 + 3.5*1 = 2. 5 b2 = a2 + b1x0 = ‐16 + 3.5 *2. 5 = ‐7 .25 ... 1.9095 − 0.0907 − 1.9184 × 10 − 4 − ( −0.4 728 ) × 0.10474 2 b= = −0.81 826 0.10474 c = 1.9184 × 10 − 4 Ta có nghiệm gần x0 nhất là : 2 × 1.9184 × 10 −4 n1 = 1.89 526 − = 1.89594 − 0.81 826 − (0.81 826 )2 − 4 × ( −0.4 728 ) × 1.9184 × 10 − 4 Ta có thể lấy n1 = 1.895494 làm nghiệm của bài toán. Chương trình giải bài toán bằng phương pháp Muller như sau: Chương trình 2 6 //phuong phap Muller #include ... 3 ∆s = n −1 n − 2 (3) c n −1c n − 3 − c 2 − 2 n b c − bnc n − 2 ∆p = n −1 n −1 (4) c n −1c n − 3 − c 2 − 2 n Sau khi phân tích xong Pn(x) ta tiếp tục phân tích Pn 2( x) theo phương pháp trên. Các bước tính toán gồm: ‐ Chọn các giá trị ban đầu bất kì s0 và p0 ‐ Tính các giá trị bo, ,bn theo (1) ‐ Tính các giá trị co, ,cn theo (2) ‐ Tính ∆so và ∆po theo (3) và (4) . a3= 24 Chọnx o=3.5tacó: P o=ao=1 P 1=a1+pox0=‐1+3.5*1= 2. 5 P 2 =a2+p1x0=‐16+3.5 *2. 5=‐7 .25 P3=a3+p2x0= 24 +3.5*(‐7 .25 )=‐1.375 b 0=a0=1; b 1=a1+box0=‐1+3.5*1= 2. 5 b 2 =a2+b1x0=‐16+3.5 *2. 5=‐7 .25 P2(3.5)=b0x 2 +b1x+b2=13.75 . f(x0)=‐0.0907h1=0 .2 x 1= 2. 2 f(x1)=‐0 .29 15h2=0 .2 x 2 =1.8 f(x2)=0.07385 γ=1 Vậythì: 453 12. 0 )11 (2. 01 07385.0)11()0907.0( )29 15.0(1 a 2 −= +×× + + × −−−× =. 0907.0c 91338.0 2. 0 2. 0)453 12. 0()097.0 (29 15.0 b 2 −= −= ×−−−−− = 23 Tacónghiệmgầnx0nhấtlà: 89 526 .1 )0907.0()453 12. 0(4)91338.0(91338.0 )0907.0 (2 0.2n 2 1 = −×−×−−−− − × −= Với lầnlặpthứhaitacó: x 0=1.89 526
Ngày đăng: 24/07/2014, 15:21
Xem thêm: Phương pháp tính với C++ - Chương 2 pptx