Giáo trình Matlab cơ bản - Chương 5: Các phương trình phi tuyến

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.

pdf70 trang | Chuyên mục: MATLAB | Chia sẻ: tuando | Lượt xem: 570 | Lượt tải: 0download
Tóm tắt nội dung Giáo trình Matlab cơ bản - Chương 5: 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 "TẢI VỀ" ở trên
i) 
với   Xi = { ri, si}T và   Xi+1 = { ri+1, si+1}T 
  ⎡ ⎤= ⎢ ⎥⎣ ⎦
i i
i
i i
f(r ,s )
F(X )
g(r ,s )
  i
f f
r sJ(X )
g g
r s
∂ ∂⎛ ⎞⎜ ⎟∂ ∂= ⎜ ⎟∂ ∂⎜ ⎟⎜ ⎟∂ ∂⎝ ⎠
Quan hệ  :  J(Xi)∆X  =  ‐F(Xi) với ∆X  =  {ri+1  ‐  ri,si+1  ‐  si}T  tương  ứng với một hệ 
phương trình tuyến tính hai ẩn số ∆r = ri+1 ‐ ri  và  ∆s = si+1 ‐ si : 
i i
i i
f fr s f(r ,s )
r s
g gr s g(r ,s )
r s
∂ ∂⎧ ∆ + ∆ = −⎪⎪∂ ∂⎨∂ ∂⎪ ∆ + ∆ = −⎪ ∂ ∂⎩
Theo công thức Cramer ta có : 
302
g ff g
s sr
∂ ∂− +∂ ∂∆ = δ  
gfg f
r rs
∂∂− +∂ ∂∆ = δ  
  g gf f
r s s r
∂ ∂∂ ∂δ= −∂ ∂ ∂ ∂  
Để dùng  được  công  thức này  ta cần  tính  được các  đạo hàm  f
r
∂
∂ ,
f
s
∂
∂ ,
g
r
∂
∂ ,
g
s
∂
∂ . 
Các đạo hàm này được tính theo công thức truy hồi. 
Do b1 = a1 nên  
  1 1b a 0
r r
∂ ∂= =∂ ∂      
1 1b a 0
s s
∂ ∂= =∂ ∂       
b2 = a2 + rb1  nên   
2 1
1 1
b br b b
r r
∂ ∂= + =∂ ∂    
2 2 1b a br 0
s s s
∂ ∂ ∂= + =∂ ∂ ∂    
b3 = a3 + rb2 + sb1 nên      
3 3 2 1b a (rb ) (sb )
r r r r
∂ ∂ ∂ ∂= + +∂ ∂ ∂ ∂  
Mặt khác :   
3a 0
r
∂ =∂  
2 2
2
(rb ) (b )r b
r r
∂ ∂= +∂ ∂     
1(rb ) 0
r
∂ =∂        
nên:   3 2 1
b b rb
r
∂ = +∂      
3 2 1
1 1
b b br s b b
s s s
∂ ∂ ∂= + + =∂ ∂ ∂      
b4 = a4 + rb3 + sb2 nên:   
4 3 2
3
b b bb r s
r r r
∂ ∂ ∂= + +∂ ∂ ∂    
4 3 2
2
b b br s b
s s s
∂ ∂ ∂= + +∂ ∂ ∂  
. . . . .  
n n 1 n 2
n 1
b b br s b
r r r
− −
−
∂ ∂ ∂= + +∂ ∂ ∂  
n n 1 n 2
n 2
b b br s b
s r r
− −
−
∂ ∂ ∂= + +∂ ∂ ∂  
Nếu chúng ta đặt: 
  k k 1
b c
r −
∂ =∂        
thì :   
c1 = b1                    (2) 
  c2 = b2 + rc1 
  c3 = b3 + rc2 + sc1 
303
  . . . . . . . . . .  
  cn = bn + rcn‐1 + scn‐2 
Như vậy ta có: 
n n 1 n 1 n 2
2
n 1 n n 2
b c b cr
c c c
− + −
− −
− +∆ = −                 (3) 
n 1 n 1 n n
2
n 1 n n 2
b c b cs
c c c
+ −
− −
− +∆ = −                 (4) 
  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ị b1,..,bn+1 theo (1) 
  ‐ Tính các giá trị c1,...,cn theo (2) 
  ‐ Tính ∆ro và ∆so theo (3) và (4) 
  ‐ Tính s1 = r0 + ∆ro và s1 = so+ ∆so 
  ‐ Lặp lại bước 1 cho đến khi ri+1 = ri = r và si+1 = si = s 
  ‐ Giải phương trình x2 ‐ rx ‐ s để tìm 2 nghiệm của đa thức 
‐ Bắt đầu quá trình trên cho đa thức Pn‐2(x) 
Ta xây dựng hàm bairstow() để thực hiện thuật toán tìm r, s 
function [r,s] = bairstow(p, r0, s0, maxiter) 
% tim da thuc bac 2 dang x^2 ‐ rx ‐ s 
%vao ‐p la da thuc can tim nghiem 
%    ‐r0, s0 gia tri ban dau 
%    ‐maxiter so lan lap max 
%ra  ‐r, s 
%cu phap [r,s] = bairstow(p, r0, s0 ,maxiter) 
n = length(p) ‐ 1; 
c = zeros(n); 
b = zeros(n); 
j = 0; 
while j < maxiter 
    b(1) = p(1); 
    b(2) = p(2) + r0*b(1); 
    for k = 3:(n+1) 
304
        b(k) = p(k) + r0*b(k‐1) + s0*b(k‐2); 
    end 
    c(1) = b(1); 
    c(2) = b(2) + r0*c(1); 
    for k = 3:(n) 
        c(k) = b(k) + r0*c(k‐1) + s0*c(k‐2); 
    end 
    d0 = det([c(n‐1), c(n‐2); c(n), c(n‐1)]); 
    d1 = det([‐b(n), c(n‐2); ‐b(n+1), c(n‐1)]); 
    d2 = det([c(n‐1), ‐b(n); c(n) ‐b(n+1)]); 
    r = r0 + d1/d0; 
    s = s0 + d2/d0; 
    if ((abs(d1/d0))&(abs(d2/d0)))<eps 
        break; 
    end 
    r0 = r; 
    s0 = s; 
    j = j + 1; 
end 
Để tìm nghiệm của đa thức P4(x) = x4 ‐ 1.1x3 + 2.3x2 ‐ 0.5x + 3.3 ta dùng chương 
trình ctbairstow.m 
 clear all, clc 
 p = [1  ‐1.1  2.3  0.5  3.3]; 
 m = length(p); 
 s0 = ‐1,; 
 r0 = ‐1; 
 fprintf(ʹNghiem cua da thuc:\nʹ); 
 while m > 3 
    [r, s] = bairstow(p,r0,s0,50); 
    m = m ‐ 2; 
    x1 = (r + sqrt(r^2+4*s))/2; 
    x2 = (r ‐ sqrt(r^2+4*s))/2; 
    fprintf(ʹ%s\nʹ,num2str(x1)); 
    fprintf(ʹ%s\nʹ,num2str(x2)); 
305
    p = deconv(p,[1 ‐r ‐s]); 
 end 
 if length(p) == 3 
    x1 = (‐p(2) + sqrt(p(2)^2‐4*p(3)))/2; 
    x2 = (‐p(2) ‐ sqrt(p(2)^2‐4*p(3)))/2; 
    fprintf(ʹ%s\nʹ,num2str(x1));; 
    fprintf(ʹ%s\nʹ,num2str(x2));;  
 else 
    x1 = ‐p(2)/p(1); 
    fprintf(ʹ%f\nʹ,x1);; 
 end 
§19. PHƯƠNG PHÁP LOBACHEVSKY ‐ GRAEFFE 
  Phương  pháp  này  đã  được  Karl  Heinrich  Gräffe,  Germinal  Pierre 
Dandelin và Nikolai Ivanovich Lobachevsky đưa ra. Nó có một nhược điểm 
là các kết quả trung gian có trị số rất lớn. 
Xét phương trình : 
     P(x) = a0xn + a1xn‐1 + ⋅ ⋅ ⋅ + an = 0          (1) 
chỉ có nghiệm thực với giá trị tuyệt đối khác nhau. Ta đánh số các nghiệm đó 
theo thứ tự giá trị tuyệt đối giảm : 
    |x1| > |x2| > ⋅ ⋅ ⋅ > |xn|              (2) 
Dựa vào (1) ta xây dựng một phương trình mới : 
    Q(x) = c0xn + c1xn‐1 + ⋅ ⋅ ⋅ + cn = 0  ( c0 ≠ 0)      (3) 
có nghiệm là   m m m1 2 nx , x ,..., x− − − . Sau đó ta viết lại phương trình trên: 
            m m m0 1 2 nQ(x) c (x x )(x x ) (x x )= + + ⋅ ⋅ ⋅ +          (4) 
So sánh (3) và (4) ta có: 
m m m 1
1 2 n
0
m m m m m m 2
1 2 2 3 n 1 n
0
m m m m n
1 2 n 1 n
0
cx x x
c
cx x x x x x
c
cx x x x
c
−
−
⎧ + + ⋅ ⋅ ⋅ + =⎪⎪⎪ + + ⋅ ⋅ ⋅ + =⎪⎨⎪⋅ ⋅ ⋅⎪⎪ ⋅ ⋅ ⋅ =⎪⎩
          (5) 
Vì có giả thiết (2) nên khi m tăng thì ở vế trái của các đẳng thức (5) số hạng 
đầu trội lên, lấn át các số hạng sau và với m đủ lớn ta có : 
306
m 1
1
0
m m 2
1 2
0
m m m m n
1 2 n 1 n
0
cx
c
cx x
c
cx x x x
c−
⎧ ≈⎪⎪⎪ ≈⎪⎨⎪⋅ ⋅ ⋅⎪⎪ ⋅ ⋅ ⋅ ≈⎪⎩
              (6) 
Từ (6) ta có : 
m 1
1
0
m 2
2
1
m n
n
n 1
cx
c
cx
c
cx
c −
⎧ ≈⎪⎪⎪ ≈⎪⎨⎪⋅ ⋅ ⋅⎪⎪ ≈⎪⎩
                  (7) 
Ta suy ra trị tuyệt đối của các nghiệm là : 
1m1
0
2m2
1
nmn
n 1
cx
c
cx
c
cx
c −
⎧⎪ ≈⎪⎪⎪ ≈⎪⎨⎪⋅ ⋅ ⋅⎪⎪⎪ ≈⎪⎩
                (8) 
Sau đó ta thay ±|xi| vào (1) và tìm được nghiệm. Như vậy vấn đề là phải tìm 
được phương trình (3) dựa vào phương trình (1). Quá trình biến đổi (1) thành 
(3) được tiến hành như sau:  
Đầu tiên từ (1) ta xây dựng phương trình mới có nghiệm là  21x−  và quá 
trình này được gọi là bình phương nghiệm. Vì  P(x) có các nghiệm là xi nên nó 
có dạng: 
    P(x) = a0(x ‐ x1) (x ‐ x2)⋅⋅⋅( x ‐ xn) 
Do đó : 
    (‐1)nP(‐x) = a0(x + x1) (x + x2)⋅⋅⋅( x + xn) 
Ta suy ra : 
307
n 2 2 2 2 2 2 2
0 1 2 n( 1) P(x)P( x) a (x x )(x x ) (x x )− − = − − ⋅ ⋅ ⋅ −  
Thay x2 = ‐y ta có : 
2 2 2 2
1 0 1 2 nP (y) P(x)P( x) a (y x )(y x ) (y x )= − = + + ⋅ ⋅ ⋅ +  
Đa thức P1(y) có nghiệm là  2i 1y x= − . Đa thức này có dạng : 
(1) n (1) n 1 (1) n 2 (1)
1 0 1 2 nP (y) a y a y a y a
− −= + + + ⋅ ⋅ ⋅ +         (9) 
Do     P(x) = a0xn + a1xn‐1 + ⋅ ⋅ ⋅ + an = 0 
nên    P(‐x) = (‐1)n[a0xn ‐ a1xn‐1 + ⋅ ⋅ ⋅ + (‐1)nan] 
    (‐1)n P(‐x) = a0xn ‐ a1xn‐1 + ⋅ ⋅ ⋅ + (‐1)nan 
và            
n 2 2n 2 2n 2 2 2n 4
0 1 0 2 2 1 3 0 4
n 2
n
( 1) P(x)P( x) a x (a 2a a )x (a 2a a 2a a )x
( 1) a
− −− − = − − + − +
+ ⋅ ⋅ ⋅ + −  
Thay x2 = ‐y ta có : 
     2 n 2 n 1 2 n 2 n 21 0 1 0 2 2 1 3 0 4 nP (y) a y (a 2a a )y (a 2a a 2a a )y ( 1) a
− −= − − + − + + ⋅ ⋅ ⋅ + −       (10) 
So sánh (9) và (10) ta có công thức tính các hệ số của P1(y) từ các ak là : 
(1) 2
0 0
(1) 2
1 1 0 2
(1) 2
2 2 1 3 0 4
k
(1) 2 i
k k k i k i
i 1
(1) 2
n 1 n 1 n 2 n
(1) 2
n n
a a
a a 2a a
a a 2a a 2a a
a a 2 ( 1) a a
a a 2a a
a a
− +
=
− − −
⎧ =⎪ = −⎪⎪ = − +⎪⋅ ⋅ ⋅⎪⎪⎨ = + −⎪⎪⋅ ⋅ ⋅⎪⎪ = −⎪⎪ =⎩
∑             (11) 
Tiếp tục quá trình bình phương nghiệm đa thức P1(y) ta được P2(y) có 
nghiệm là  2 2k 1y ( x )= −  với các hệ số  (2)ka được tính theo  (1)ka  tương tự như (11) 
khi tính  (1)ka theo ak. Tiến hành bình phương nghiệm (s + 1)  lần ta có (3). Lúc 
đó các hệ số được xác định bằng: 
308
2(s 1) (s)
0 0
k2(s 1) (s) i (s) (s)
k k k i k i
i 1
2(s 1) (s) (s) (s)
n 1 n 1 n 2 n
2(s 1) (s)
n n
a a
a a 2 ( 1) a a
a a 2a a
a a
+
+
− +
=
+
− − −
+
⎧ ⎡ ⎤= ⎣ ⎦⎪⋅ ⋅ ⋅⎪⎪⎪ ⎡ ⎤= + − −⎣ ⎦⎪⎨⋅ ⋅ ⋅⎪⎪ ⎡ ⎤= −⎪ ⎣ ⎦⎪⎪ ⎡ ⎤= ⎣ ⎦⎩
∑
Vậy khi s đủ lớn ta có : 
s
(s)
2 m i
i i (s)
i 1
ax x
a −
− = − ≈  
Ta có m = 26 = 64. Dùng logarit ta tính ra các nghiệm : x1  = ‐4, x2 = 2, x3 = 1 
Ta xây dựng hàm  lobachevskygraeffe() để thực hiện thuật toán trên 
function y = lobachevskygraeffe(a, maxiter) 
% giai pt bang pp Lochevsky ‐ Graeffe 
% a la da thuc can tim nghiem 
% maxiter la so lan lap max 
c = a; 
n = length(a); 
m = 1; 
while m < maxiter 
    b = a; 
    for k = 2:n‐1; 
        s = 0; 
        i = 1; 
        while (((k ‐ i) >= 1)&((k + i) <= n))   
            s = s + (‐1)^i*b(k ‐ i)*b(k + i); 
            i = i + 1; 
        end 
        a(k) = b(k)^2 + 2*s; 
    end 
    a(1) = a(1)^2; 
    a(n) = a(n)^2; 
    j = 2^m; 
309
    for i = 1:n‐1 
        err = 1; 
        x(i) = a(i + 1)/a(i); 
        if x(i) == 1 
            x(i) = 1; 
        else 
            x(i) = exp((1/j)*log(x(i))); 
        end 
        err = abs(horner(c, x(i))); 
    end 
    if err < eps 
        break; 
    end 
    m = m + 1; 
end 
for i = 1:n‐1 
    if round(polyval(c, x(i))) ~= 0 
        x(i) = ‐x(i); 
    end 
end 
y = x; 
Để tìm nghiệm của đa thức P4(x) = x4 + 2x3 ‐ 25x2 ‐ 26x2 + 120 ta dùng chương 
trình ctlobachevskygraeffe.m: 
clc, clear all 
a = [1 2 ‐25 ‐26 120]; 
x = lobachevskygraeffe(a, 50) 
§20. PHƯƠNG PHÁP SCHRODER 
  Phương pháp lặp Schroder dùng để tìm nghiệm bội, có dạng tương tự 
như công thức lặp Newton: 
  + = − ′
k
k 1 k
k
mf(x )x x
f (x )
Trong đó m  là bội của nghiêm. Ban đầu  ta có  thể chưa biết m nên cần phải 
thử. Ta xây dựng hàm schroder() để thực hiện thuật toán trên: 
310
function [r, iter] = schroder(f1, df1, m, x0, tol) 
%Ham tim nghiem boi bang thuat toan Schroder 
iter = 0; 
d = feval(f1, x0)/feval(df1, x0); 
while abs(d) > tol 
    x1 = x0 ‐ m*d; 
    iter = iter + 1; 
    x0 = x1; 
    d = feval(f1, x0)/feval(df1, x0); 
end 
r = x0; 
Để giải phương trình  
  − − =x 2(e x) 0  
Ta dùng chương trình ctschroder.m với m = 2: 
clear all, clc 
[x, iter] = schroder(ʹf1ʹ, ʹdf1ʹ, 2, ‐2, 1e‐4) 
Trong đó: 
  function y = f1(x) 
y = (exp(‐x) ‐ x).^2; 
function y = df1(x) 
y = 2.0*(exp(‐x) ‐ x).*(‐exp(‐x) ‐ 1); 

File đính kèm:

  • pdfgiao_trinh_matlab_co_ban_chuong_5_cac_phuong_trinh_phi_tuyen.pdf