Bài giảng Các phương trình phi tuyến

Vây nghiệm là tìm xem các nghiệm của phương trình có thể nằm trên những đoạn nào của trục x.  Tách nghiệm là tìm các khoảng chứa nghiệm sao cho  trong  mỗi  khoảng  chỉ  có đúng  một  nghiệm.  Thu  hẹp khoảng chứa nghiệm là làm cho khoảng chứa nghiệm càng nhỏ càng tốt. Sau bước sơ bộ ta có khoảng chứa nghiệm đủ nhỏ. Để xác định khoảng chứa nghiệm ta có thể dùng phương pháp đồ thị. Ngoài ra ta cũng có thể tìm nghiệm bằng phương pháp tìm tăng dần. Ý tưởng của phương pháp này là nếy f1(x).f2(x) < 0 thì có ít nhất một nghiệm của phương trình trong đoạn [x1, x2]. Nếu đoạn [x1, x2] đủ nhỏ thì trong đạon đó sẽ có một nghiệm duy nhất. Như vậy ta có thể phát hiện ra nghiệm bằng cách tính trị của hàm trên các đoạn ∆x và xem chúng có đổi dấu không.

pdf70 trang | Chia sẻ: haohao89 | Lượt xem: 3189 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Bài giảng Các phương trình phi tuyến, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
241 CHƯƠNG 5: CÁC PHƯƠNG TRÌNH PHI TUYẾN §1. KHÁI NIỆM CHUNG  Nếu phương trình đại số hay siêu việt khá phức tạp thì ít khi tìm được  nghiệm đúng. Bởi vậy việc  tìm nghiệm gần đúng và ước  lượng sai số  là rất  cần thiết.    Ta xét phương trình :    f(x) = 0                     (1)  với  f(x)  là hàm cho  trước của biến x. Chúng  ta cần  tìm giá  trị gần đúng của  nghiệm của phương trình này.    Quá trình giải thường chia làm hai bước: bước sơ bộ và bước kiện toàn  nghiệm.    Bước giải  sơ bộ  có 3 nhiệm vụ: vây nghiệm,  tách nghiệm và  thu hẹp  khoảng chứa nghiệm.    Vây nghiệm  là  tìm xem các nghiệm của phương  trình có  thể nằm  trên  những đoạn nào của trục x. Tách nghiệm là tìm các khoảng chứa nghiệm sao  cho  trong  mỗi  khoảng  chỉ  có  đúng  một  nghiệm.  Thu  hẹp  khoảng  chứa  nghiệm là làm cho khoảng chứa nghiệm càng nhỏ càng tốt. Sau bước sơ bộ ta  có khoảng chứa nghiệm đủ nhỏ. Để xác định khoảng chứa nghiệm ta có thể  dùng phương pháp đồ thị. Ngoài ra ta cũng có thể tìm nghiệm bằng phương  pháp tìm tăng dần. Ý tưởng của phương pháp này là nếy f1(x).f2(x) < 0 thì có ít  nhất một nghiệm của phương trình trong đoạn [x1, x2]. Nếu đoạn [x1, x2] đủ  nhỏ  thì  trong đạon đó sẽ có một nghiệm duy nhất. Như vậy  ta có  thể phát  hiện ra nghiệm bằng cách tính trị của hàm trên các đoạn ∆x và xem chúng có  đổi dấu không.   Ta xây dựng hàm rootsearch() để tìm khoảng chứa nghiệm.   function [x1,x2] = rootsearch(func,a,b,dx)  % Tim doan chua nghiem cua ham f(x).  % Cu phap: [x1,x2] = rootsearch(func,a,d,dx)  % func = ham f(x).  % a,b = daon tim.  % dx = khoang tang  % x1,x2 = doan chu nghiem (a,b);  % dat la NaN neu khong thay nghiem  242 x1 = a; f1 = feval(func,x1);  x2 = a + dx; f2 = feval(func,x2);  while f1*f2 > 0.0      if x1 >= b          x1 = NaN; x2 = NaN;          return      end      x1 = x2; f1 = f2;      x2 = x1 + dx; f2 = feval(func,x2);  end  Khi phát hiện  thấy khoảng  chứa nghiệm, hàm  trả về giá  trị biên  của  đoạn.  Nếu không có nghiệm, x1 = x2 = NaN. Ta gọi rootsearch() nhiều lần để phát  hiện hết các đoạn chứa nghiệm. Với ví dụ tìm khoảng chứa nghiệm của hàm  f(x) = x3 ‐ 10x2 + 5 ta dùng chương trình ctrootsearch.m  clear all, clc  f = inline(ʹx^3 ‐ 10*x^2 + 5ʹ);  [x1, x2] = rootsearch(f,2,10,.2)    Bước kiện toàn nghiệm tìm các nghiệm gần đúng theo yêu cầu đặt ra.    Có rất nhiều phương pháp xác định nghiệm của (1). Sau đây chúng ta  xét từng phương pháp.  §2. PHƯƠNG PHÁP LẶP ĐƠN  Giả sử phương trình (1) được đưa về dạng tương đương:    x = g(x)                    (2)  từ giá trị xo nào đó gọi là giá trị lặp đầu tiên ta lập dãy xấp xỉ bằng công thức:    xn = g(xn‐1)                     (3)  với n = 1,2,....  Hàm g(x) được gọi là hàm lặp. Nếu dãy xn → α khi n →∝ thì ta nói phép lặp  (3) hội tụ.  Ta có định lí: Xét phương pháp lặp (3), giả sử:  ‐ [a, b] là khoảng  chứa nghiệm α của phương trình (1) tức là của (2)  ‐ mọi xn tính theo (3) đều thuộc [a, b]  ‐ g(x) có đạo hàm thoả mãn :  243      g (x) q 1 a x b′ ≤ < < <           (4)  trong đó q là một hằng số thì phương pháp lặp (3) hội tụ  Ta có thể minh hoạ phép lặp trên bằng hình vẽ sau.  Ta xây dựng hàm simpiter() để lặp  function [x, err, xx] = simpiter(g, x0, tolx, maxiter)  % giai pt x = g(x) tu x0 bang cah lap  %vao : g, x0 = ham va gia tri dau  % tolx = sai so mong muon  % maxiter = so lan lap max  %ra: x = nghiem  % err = sai so |x(k) ‐ x(k ‐ 1)|   % xx = cac gia tri trung gian  if nargin < 4     maxiter = 100;   end  if nargin < 3      tolx = 1e‐6;   end  xx(1) = x0;  for k = 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);  if k == maxiter      fprintf(ʹKhong hoi tu sau %d lan lap\nʹ, maxiter)  else       fprintf(ʹHoi tu sau %d lan lap\nʹ,k)  end  Để tính lại ví dụ trên ta dùng chương trình ctsimpiter4_2.m  clear all, clc  f = inline(ʹ‐0.5*((x ‐ 1).^2 ‐ 3)ʹ);  [x, ss, xx] = simpiter(f, 0.5,.00001,200)  §3. PHƯƠNG PHÁP CHIA ĐÔI CUNG  Giả  sử  cho phương  trình  f(x)  =  0 với  f(x)  liên  tục  trê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ểm chia (a + b)/2.    1.   Nếu f((a+b)/2) = 0 thì ξ = (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 đầu trái dấu và kí hiệu là [a1,b1]. Đối với  [a1, b1] ta lại tiến hành như [a, b].  Ta xây dựng hàm bisection() thực hiện thuật toán trên  function [x,err,xx] = bisection(f, a, b, tolx, maxiter)  %bisection.m de giai pt f(x) = 0 bang phuong phap chia doi cung  %vao: f = ham can tim nghiem  % a/b = bien cua doan can tim nghiem  % tolx = sai so mong muon  % maxiter lan lap max  %ra: x = nghiem  % err = sai so  % xx = cac gia tri trung gian  y x a bξ  b1  245 tol = eps;   fa = feval(f, a);   fb = feval(f, b);  if fa*fb > 0      error(ʹNghiem khong o trong doan nayʹ);   end  for k = 1: maxiter      xx(k) = (a + b)/2;      fx = feval(f, xx(k));   err = (b ‐ a)/2;      if abs(fx) < tol | abs(err) < tolx          break;      elseif fx*fa > 0          a = xx(k);           fa = fx;      else b = xx(k);      end  end  x = xx(k);  if k == maxiter      fprintf(ʹKhong hoi tu sau %d lan lap\nʹ, maxiter),   else       fprintf(ʹHoi tu sau %d lan lap\nʹ,k),   end  Để tìm nghiệm của hàm f(x) = tg(π ‐ ) ‐ x ta dùng chương trình ctbisection.m  clear all, clc  f = inline(ʹtan(pi ‐ x) ‐ xʹ);  [x, ss, xx] = bisection(f, 1.6, 3, 1e‐4, 50)  §4. PHƯƠNG PHÁP DÂY CUNG Giả sử f(x) liên tục trên trên đoạn [a, b] và f(a).f(b) < 0. Cần tìm nghiệm  của  f(x) = 0. Để xác định  ta xem  f(a)  0. Khi đó  thay vì chia đôi  đoạn [a, b] ta chia [a, b] theo tỉ lệ ‐f(a)/f(b). Điều đó cho ta nghiệm gần đúng :          x1 = a + h1  246 Trong đó   1 f(a) (b a)h f(a) f(b)= − −− +   Tiếp theo dùng cách đó với đoạn [ a, x1]  hay  [x1, b] mà hai đầu hàm nhận giá  trị  trái  dấu ta được nghiệm gần đúng x2 v.v.  Về mặt hình học, phương pháp này có  nghĩa  là  kẻ  dây  cung  của  đường  cong f(x)  qua hai điểm A[a, f(a)] và B[b, f(b)] hay nói cách khác là tuyến tính hoá hàm  f(x) trong đoạn [a, b].   Thật vậy phương trình dây cung AB có dạng:            f(a) f(b) af(b) bf(a)y x a b a b − −= +− −   Cho x = x1, y = 0  ta có           1 af(b) bf(a)x f(b) f(a) −= −                   (1)  Ta xây dựng hàm chord() để thực hiện thuật toán trên  function [x, err, xx] = chord(f, a, b, tolx, maxiter)  %giai pt f(x) = 0 bg phuong phap day cung.  %vao : f ‐ ham can tim nghiem  % a/b ‐ khoang tim nghiem  % tolx ‐ sai so mong muon cua nghiem  % maxiter lan lap max  %ra: x ‐  nghiem  % err ‐ sai so  % xx ‐ cac gia tri trung gian  tolfun = eps;   fa = feval(f, a);   fb = feval(f, b);  if fa*fb > 0       error(ʹNghiem khong o trong doan nay !ʹ);   end  for k = 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     if abs(fx) < tolfun | err<tolx          break;      elseif fx*fa > 0          a = xx(k);           fa = fx;      else           b = xx(k);           fb = fx;      end  end  x = xx(k);  if k == maxiter      fprintf(ʹKhong hoi tu sau  %d lan lap\nʹ, maxiter)  else       fprintf(ʹHoi tu sau  %d lan lap\nʹ, k)  end  Để tìm nghiệm của hàm f(x) = tg(π ‐x) ‐ x ta dùng chương trình ctchord.m  clear all, clc  f = inline(ʹtan(pi ‐ x) ‐ xʹ);  [x, ss, xx] = falsp(f, 1.7, 3, 1e‐4, 50)  §5. PHƯƠNG PHÁP NEWTON ‐ RAPHSON  Phương  pháp  lặp Newton(còn  gọi  là  phương  pháp  tiếp  tuyến)được  dùng nhiều vì nó hội tụ nhanh. Tuy nhiên phương pháp này đòi hỏi tính fʹ(x).  Công thức Newton ‐ Raphson được suy từ khai triển Taylor của f(x) lân cận x:  2 i 1 i i i 1 i i 1 if(x ) f(x ) f (x )(x x ) O(x x )+ + +′= + − + −         (1)  Nếu xi+1 là nghiệm của phương trình f(x) = 0 thì (1) trở thành:    2i i i 1 i i 1 i0 f(x ) f (x )(x x ) O(x x )+ +′= + − + −           (2)  Giả sử rằng xi gần với xi+1, ta có thể bỏ qua số hạng cuối trong (2) và có công  thức Newton ‐ Raphson:    ii 1 i i f(x )x x f (x )+ = − ′                   (3)  Nếu xi+1 là nghiệm đúng của phương trình thì sai số là ei = x ‐ xi. Khi nghiệm  được tính theo (3) thì sai số là:  248   2ii 1 i i f (x )e e 2f (x )+ ′′= − ′   Minh  hoạ  hình  học  của  thuật  toán  Newton ‐ Raphson như hình bên.  Thuật toán được tóm lược như sau:    ‐ cho xo    ‐ tính  f(x)x f ʹ(x) ∆ = −     ‐ cho x = x + ∆x    ‐ lặp lại bước 2 và 3 cho đến khi |∆x| ≤ ε  Ta xây dựng hàm newtonraphson() để thực hiện thuật toán trên.  function [x, fx, xx] = newtonraphson(f, df, x0, tolx, maxiter)  %giai pt f(x) = 0 bang pp Newton‐Raphson.  %vao: f = ftn to be given as a string ’f’ if defined in an M‐file  % df = df(x)/dx (neu khong cho se dung dao ham so.)  % x0 = gia tri ban dau  % tolx = sai so mong muon  % maxiter = so lan lap max  %ra: x = nghiem  % fx = f(x(last)), xx = cac gia tri trung gian  h = 1e‐4;   h2 = 2*h;   tolf = eps;  if nargin == 4 & isnumeric(df)      maxiter = tolx;       tolx = x0;       x0 = df;   end  xx(1) = x0;   fx = feval(f,x0);  for k = 1: maxiter      if ~isnumeric(df)          dfdx = feval(df, xx(k)); %dao ham cua ham      else           dfdx = (feval(f, xx(k) + h)‐feval(f, xx(k) ‐ h))/h2; %dao ham so  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));      if abs(fx)<tolf | abs(dx) < tolx,           break;       end  end  x = xx(k + 1);  if k == maxiter       fprintf(ʹKhong hoi tu sau %d lan lap\nʹ, maxiter)  else       fprintf(ʹHoi tu sau %d lan lap\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  clear all, clc  f = inline(ʹx.^3 ‐ 10*x.^2 + 5ʹ);  [x, ss, xx] = newtonraphson(f, 0.7, 1e‐4, 50)  §6. PHƯƠNG PHÁP CÁT TUYẾN    Phương pháp cát tuyến có thể coi là biến thể của phương pháp Newton  ‐ Raphson theo nghĩa đạo hàm được thay bằng xấp xỉ:   k k 1 k k 1 f(x ) f(x )f (x) x x − − −′ ≈ −                 (1)  và tốn ít thời gian tính hơn khi dùng đạo hàm giải tích hay đạo hàm số.    Bằng cách xấp xỉ, biểu thức:    kk 1 k k f(x )x x f (x )+ = − ′   trở thành:    −+ − ⎡ ⎤−= − = −⎢ ⎥−⎣ ⎦ k k 1 k k 1 k k k k k 1 k x x f(x )x x f(x ) x f(x ) f(x ) dfdx          (2)  với  k k 1k k k 1 f(x ) f(x )dfdx x x − − −= −   250 Phương  trình  (2) chính  là biểu  thức  tổng quát của phép  lặp. Hai giá  trị đầu  tiên x1 và x2 cần để khởi động phép  lặp. Quá trình  lặp được minh hoạ bằng  hình a  Phép lặp có thể không hội tụ (hình b). Tuy nhiên khi hội tụ, nó hội rất nhanh.  Ta xây dựng hàm secant() để thực hiện thuật toán trên.  function [x, fx, xx] = secant(f, x0, x1, tolx, maxiter)  % giai pt f(x) = 0 bg phuong phap day cung  %vao : f ‐ ham can tim nghiem  % x0, x1 ‐ gia tri khoi dong phep lap   % tolx ‐ sai so mong muon  % maxiter ‐ so lan lap max  %ra: x = nghiem  % fx = f(x(last)), xx = cac gia tri trung gian  h = (x1 ‐ x0)/100;   h2 = 2*h;   tolfun = eps;  xx(1) = x0;   fx = feval(f, x0);  for k = 1: maxiter      if k <= 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  251     end      dx = ‐fx/dfdx;      xx(k + 1) = xx(k) + dx; %pt.(2)      fx0 = fx;      fx = feval(f, xx(k+1));      if abs(fx) < tolfun | abs(dx) < tolx,           break;       end  end  x = xx(k + 1);  if k == maxiter       fprintf(ʹKhong hoi tu sau %d lan lap\nʹ, maxiter)  else       fprintf(ʹHoi tu sau %d lan lap\nʹ, k)  end    Để  tính  nghiệm  của  hàm  f(x)  =  x3  ‐  10x2  +  5  ta  dùng  chương  trình  ctsecant.m  clear all, clc  f = inline(ʹx.^3 ‐ 10*x.^2 + 5ʹ);  [x, ss, xx] = secant(f, 0.5, 1, 1e‐4, 50)      §7. PHƯƠNG PHÁP BRENT    Phương  pháp  Brent  kêt  hợp  phương  pháp  chia  đôi  cung  và  phương  pháp nội  suy bậc hai  để  tạo  ra một phương pháp  tìm nghiệm  của phương  trình f(x) = 0 rất hiệu quả. Phương pháp này dùng khi đạo hàm của f(x) khó  tính hay không  thể  tính được. Giả sử  ta cần  tìm nghiêm  trong đoạn  [x1, x2].  Quá trình tìm nghiệm bắt đầu bằng việc chia đôi đoạn [x1, x2] bằng điểm x3.  x2  x x3  x x1  x x3  x x2  x1  252 Trong quá trình này ta tính được f(x1), f(x2) và f(x3). Qua 3 điểm này ta có một  đường cong bậc 2 và  tìm được nghiệm x của đường cong bậc 2 này. Nếu x  nằm  trong  đoạn  [x1, x2] như hình  trên  thì giá  trị này  được  chấp nhận. Tiếp  theo ta tìm nghiệm trong đoạn [x1, x3] hay [x3, x2] tuỳ theo vị trí của x.    Đa thức nội suy Lagrange qua 3 điểm là:    2 3 1 3 1 21 2 3 1 2 1 3 2 1 2 3 3 1 3 2 (f f )(f f ) (f f )(f f ) (f f )(f f )x(y) x x x (f f )(f f ) (f f )(f f ) (f f )(f f ) − − − − − −= + +− − − − − −   Cho y = 0 ta có:    2 3 1 2 3 1 3 2 3 1 1 2 3 1 2 1 2 2 3 3 1 f f x (f f ) f f x (f f ) f f x (f f )x (f f )(f f )(f f ) − + − + −= − − − −         (1)  Độ thay đổi của nghiệm là:    3 1 2 2 3 1 2 1 2 3 1 2 3 13 3 1 2 2 3 3 1 x (f f )(f f f ) f x (f f ) f x (f f )x x x f (f f )(f f )(f f ) − − + + − + −∆ = − = − − −   (2)  Ta xây dựng hàm brent() để thực hiện thuật toán trên  function root = brent(f, a, b, tol)  % giai pt f(x) = 0 bang thuat toan Brent.  % Cu phap: root = brent(f, a, b, tol)  % vao: f = ham can tim nghiem  % a, b = doan chua nghiem  % tol = sai so cho truoc  if nargin < 4;       tol = 1.0e6*eps;   end  % lan chia doi dau tien  x1 = a;   f1 = feval(f,x 1);  if f1 == 0;       root = x1;       return;   end  x2 = b;   f2 = feval(f, x2);  if f2 == 0;       root = x2;       return;   253 end  if f1*f2 > 0.0      error(ʹNghiem khong nam trong doan nayʹ)  end  x3 = 0.5*(a + b);  % bat dau lap.  for i = 1:30      f3 = feval(f, x3);      if abs(f3) < tol          root = x3;           return      end  % xac dinh doan chua nghiem.      if f1*f3 < 0.0;           b = x3;      else           a = x3;      end      if (b ‐ a) < tol*max(abs(b),1.0)          root = 0.5*(a + b);        return      end  % noi suy bac 2.      denom = (f2 ‐ f1)*(f3 ‐ f1)*(f2 ‐ f3);      numer = x3*(f1 ‐ f2)*(f2 ‐ f3 + f1)...              + f2*x1*(f2 ‐ f3) + f1*x2*(f3 ‐ f1);      if denom == 0;           dx = b ‐ a;      else          dx = f3*numer/denom;      end      x = x3 + dx;  %neu lap ra ngoai doan (a,b), dung cach chia doi cung      if (b ‐ x)*(x ‐ a) < 0.0          dx = 0.5*(b ‐ a);           x = a + dx;  254     end  % cho x = x3 & chon x1, x2 moi sao cho  x1 < x3 < x2.      if x < x3          x2 = x3;           f2 = f3;      else          x1 = x3;           f1 = f3;      end      x3 = x;  end  root = NaN;  Để  tìm  nghiệm  của  phương  trình    x|cos(x)|  ‐  1  =  0  ta  dùng  chương  trình  ctbrent.m  clear all, clc  f = inline(ʹx.*abs(cos(x)) ‐ 1ʹ);  x = brent(f, 0.0, 4,1e‐4)  §8. PHƯƠNG PHÁP NGOẠI SUY AITKEN  Xét phương pháp lặp:    x = f(x)                    (1)  với f(x) thoả mãn điều kiện hội tụ của phép lặp, nghĩa là với mọi x∈ [a, b] ta  có:  | f’(x) | ≤ q < 1                  (2)  Như vậy :    xn+1 = f(xn)                    (3)    xn = f(xn‐1)                    (4)  Trừ (3) cho (4) và áp dụng định lí Lagrange cho vế phải với c ∈ [a, b] ta có :    xn+1‐ xn = f(xn) ‐ f(xn‐1) = (xn ‐ xn‐1)f’(c)          (5)  Vì phép lặp (1) nên :    | xn+1‐ xn | ≤ q | xn ‐ xn‐1 |              (6)  Do (6) đúng với mọi n  nên cho n = 1 , 2 , 3 , . . . ta có :        | x2 ‐ x1 |  ≤ q | x1 ‐ xo |        | x3 ‐ x2 |  ≤ q | x2 ‐ x1 |  255       . . . . . . . . . . . . . . . . . . .        | xn+1 ‐ xn |  ≤ q | xn ‐ xn‐1 |  Điều này có nghĩa là  dãy xi+1 ‐ xi , một cách gần đúng, là một cấp số nhân. Ta  cũng coi rằng dãy xn ‐ y với y là nghiệm đúng của (1), gần đúng như một cấp  số nhân có công sai q . Như vậy :                   n 1 n x y q 1 x y + − = <−                   (7)  hay :   n 1 nx y q(x y)+ − = −                 (8)  Tương tự ta có :     n 2 n 1x y q(x y)+ +− = −                 (9)  Từ (8) và (9) ta có  :    n 2 n 1 n 1 n x xq x x + + + −= −                           (10)  Thay giá trị của q vừa tính ở (10) vào biểu thức của q ở trên ta có :    ( )2n n 1n n n 1 n 2 x x y x x 2x x + + + −= − − +                        (11)  Công  thức  (11)  được gọi  là  công  thức ngoại  suy Adam. Như vậy  theo  (11)  trước hết ta dùng phương pháp lặp để tính giá trị gần đúng xn+2, xn+1, xn của  nghiệm và sau đó theo (11) tìm được nghiệm với sai số nhỏ hơn.        Khi  phương  pháp  lặp  được  kết  hợp  với  phương  pháp Aitken  ta  có  phương pháp Steffensen. Bắt đầu lặp từ x0, hai bước lặp  được dùng để tính:    x1 = f(x0)     x2 = f(x1)   và sau đó dùng thuật toán Aitken để tinh y0 theo (11). Để tiếp tục lặp ta cho  x0=y0 và lặp lại bước tính trước.  Ta xây dựng hàm aitstef() để thực hiện hai thuật toán trên  function [x, y] = aitstef(g, x0, tolx, maxiter)  % phuong phap Aitken ‐ Steffenson   % giai pt x = g(x)  xstart = x0;   f0 = 0;   f0old = 1.;  count = 0;       while ((count  .0000001))     count = count + 1;    f0old = f0;  256   x1 = feval(g, x0);      x2 = feval(g, x1);    f0 = x0 ‐ (x1 ‐ x0)*(x1 ‐ x0) / (x2 ‐ 2.*x1 + x0);    x0 = x1;   end  x = f0;  fprintf(ʹ\nʹ);  fprintf(ʹPhuong phap Aitken‐Steffensonʹ);  x0 = xstart;   count = 0;   f0 = 0;   x2 = 1.;  while ((count  .0000001))     count = count+1;    x1 = feval(g, x0);      x2 = feval(g, x1);    f0 = x0 ‐ (x1 ‐ x0)*(x1 ‐ x0) / (x2 ‐ 2.*x1 + x0);    x0 = f0;   end  y = f0;  Để tìm nghiệm của phương trình x = (2 ‐ ex + x2)/3 = g(x) ta dùng chương trình  ctaitstef.m  clear all, clc  f = inline(ʹ(2.‐exp(x)+x.^2)/3ʹ);  [x, y] = aitstef(f,0., 1e‐4, 50)  §9. PHƯƠNG PHÁP MUELLER  Trong phương pháp dây cung khi tìm nghiệm trong đoạn [a, b] ta xấp  xỉ  hàm  bằng một  đường  thẳng. Tuy  nhiên  để  giảm  lượng  tính  toán  và  để  nghiệm hội tụ nhanh hơn ta có thể dùng phương pháp Muller. Nội dung của  phương pháp này là thay hàm trong đoạn [a, b] bằng một đường cong bậc 2  mà ta hoàn toàn có thể tìm nghiệm chính xác của nó.   257 Gọi các điểm đó 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  1 2 h h=γ   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:  2 0 0 2 1 1 1 1 1 2 2 2 2 2 2 v 0 (x x ) a(0) b(0) c f v h (x x ) ah bh c f v h (x x ) ah bh c f = = + + = = = + + = = − = − + = Từ đó ta có :  0 1 2 101 2 1 201 fc h ahffb )1(h f)1(ffa = −−= γ+γ +γ+−γ= Sau đó ta tìm nghiệm của phương trình av2 + bv + c = 0 và có :  0 2 2cn x b b 4ac = − ± −   Dấu của mẫu số được chọn sao cho nó có giá trị tuyệt đối lớn nhất, nghĩa là  khi b > 0, ta lấy dấu +, khi b < 0 ta lấy dấu ‐.  Tiếp đó  ta chọn x0  làm một  trong 3 điểm để  tính xấp xỉ mới. Các điểm này  được chọn gần nhau nhất, nghĩa  là nếu nghiệm n ở bên phải x0  thì ba điểm  tính mới  là x0, x1 và n; nếu n nằm bên trái x0 thì 3 điểm tính mới  là x0, x2 và  nghiệm. Tiếp tục quá trình tính đến khi đạt độ chính xác yêu cầu thì dừng lại.  Ta xây dựng hàm muller() để thực hiện thuật toán trên  function p = muller(f, a, b, maxiter)  % giai pt f(x) = 0  h1 h2 f(x)  x0, f0 x1, f1 x2, f2 258 %vao ‐ f la ham can tim nghiem  %  ‐  a, b la doan chua nghiem   %      ‐ maxiter so lan lap max  %ra   ‐ p xap xi Muller cua f   %      ‐ y la gia tri y = f(p)  %      ‐ err sai so thuc cua nghiem.  %khoi gan a,b,x0 va cac gia tri tuong ung cua ham  x0 = (a + b)/2.; 
Tài liệu liên quan