ình phi tuyến tuy ến Phương pháp cát tuyến để giải phươn phươngg tr tr ình 1. Kiến thức thức cơ bản bản a) Nghiệm và khoả khoảng phân ly nghiệ nghi ệm - Cho f(x) là hàm số xác định tục trên miề miền D củ của trụ trục số số định và liên tụ thực. thực. Xét phương tr ình ( ) = 0 (1-1) - ∗ ∈ là nghiệ nghiệm củ của PT (1-1) nế nếu ( ∗ ) = 0 khoảng ( , ) ch chỉỉ ch chứứa 1 nghiệ nghiệm ∗ của PT Định ngh ĩa 1.1: Nếu khoả Định (1-1) thì ta gọ g ọi khoả khoảng ( , ) là kho khoảảng phân ly củ của nghiệ nghiệm ∗ tại nghiệ nghiệm Định lý 1.1: Về sự tồn tạ Địn Giả Giả sử (x) là hàm số số liên tụ tục trên đoạn nhận giá trị trị đoạn kín ( , ) và nhậ trái dấ dấu tại tại các điểm tại ít điểm mút , hay (a). (b) < 0. Khi đó, tồn tạ nhất nh kho ảng ( , ) sao cho ( ∗ ) = 0. ất 1 điểm điểm ∗ trong khoả Về sự tồn tạ tại duy nhấ nhất nghiệ nghiệm Định lý 1.2: Về Định Nếu hàm (x) liên tụ tục và đơn điệu (tăng/giảm) khoảng (tăng/giảm) trong khoả khoảảng phân ly củ của một ( , ) và (a). (b) < 0 thì ( , ) là kho nghiệệm của phương tr ình (x) = 0. nghi Do 1 PT có thể thể có nhiề nhiều nghiệ nghiệm số số thự thực nên ta cần cần xác định định rõ khoả khoảng phân ly nghiệ nghi ệm! Có thể thể dùng cách khả kh ảo sát sự sự biế biến thiên củ của hàm hoặc hoặc dùng đồ thị thị để tìm ra khoả khoảng phân ly nghiệ nghiệm. b) Phương pháp chia đôi … c) Phương pháp lặp đơn … d) Phương pháp tiếp tuyến (Newton) tiếp tuyế
Không có việc gì khó Chỉ sợ bạn ko làm =))
i.
Mô tả Ý tưở ng của phương pháp tiếp tuyến là “Tuyến tính hóa” PT f(x) = 0, tức là thay PT này bở i 1 PT tuyến tính gần đúng trong lân cận nghiệm!
Gọi nghiệm cần tìm là = .Khi đó có thể lấy một bất kỳ gần vớ i .Kẻ tiếp tuyến của đồ thị tại ( ).Như h ình vẽ tiếp tuyến giao vớ i tại . PT tiếp tuyến tại điểm ( , ( )): (d.1) = ( )( − ) + ( ) Ta thấy x2 dần đến r. Dễ dàng, ta có: =
−
(
)
(
)
(d.2)
Lặp lại vớ i ta thu đượ c và cứ thế ra đc , tiệm cận vs nghiệm cần tìm. Tổng quát, ta có: =
−
(
)
(
)
e) Phương pháp cát tuyến i. Mô tả Không có việc gì khó Chỉ sợ bạn ko làm =))
,
(d.3)
,…
) ở Ở phương pháp tiếp tuyến (Newton), việc tính giá trị ( công thức (d.3) có thể sẽ gặp khó khăn nếu ( ) là hàm phức tạp ( ) = tỷ phân Ngườ i ta thay (
)
(
)
(e.1)
Phương pháp lặp bây h là: =
Trong đó:
ii.
−
(
)
(
)
. (
)
(e.2)
= 2,3,… , là các giá trị cho trướ c, thườ ng lấy là 2 đầu mút của khoảng phân ly nghiệm ( , )
Thuật toán B1: Thiết lập hàm ( ) cần tính, chọn khoảng phân ly ( , ), sai số ! B2: = , = Tính giá trị của hàm tại các điểm mút. B3: Tính các giá trị cho đến khi | − |<
2. CODE a) Phương pháp chia đôi … b) Phương pháp lặp đơn … c) Phương pháp tiếp tuyến (Newton) … d) Phương pháp cát tuyến function [] = secantgr() %-------------------------------------------------------------------------%Secant Gi?i PT phi tuy?n tính = PP cát tuy?n % Input: % f: Hàm c?n tìm nghi?m % a: ?i?m mút d??i kho?ng phân ly nghi?m % b: ?i?m mút trên kho?ng phân ly nghi?m % e: sai s? epsilon % % Output: % Vector x ch?a giá tr? t? x1 ??n xn % Vector p ch?a các giá tr? c?a hàm f(x) t? f(x1) ??n f(xn)
Không có việc gì khó Chỉ sợ bạn ko làm =))
% Vector ev ch?a hi?u s? x(i) - x(i-1) % % Hàm s? d?ng: % A= zeros(n): ma tr?n A là ma tr?n 0. N?u n = 1 => Có th? là vector :D % B = feval(f,x1): tr? v? k?t qu? là giá tr? hàm f t?i x = x1 % abs(A): tr? tuy?t ??i c?a A % isreal(A): ki?m tra xem x có là s? th?c ko! %-------------------------------------------------------------------------% Nhap cac gia tri khoi tao f = input('Nhap ham: '); a = input('Nhap gioi han duoi khoang phan ly nghiem: ' ); b = input('Nhap gioi han tren khoang phan ly nghiem: ' ); e = input('Nhap sai so: '); x = zeros(1); %Gán giá tr? cho x(1), x(2), p(1), p(2) x(1) = a; x(2) = b; p = zeros(1); p(1) = feval(f,x(1)); p(2) = feval(f,x(2)); i = 2; ev(i) = x(i) - x(i-1); %Trong khi tr? tuy?t ??i c?a |x(i) - x(i-1)| > e thì %T?ng i lên 1, tính giá tr? c?a x(i), giá tr? hàm f t?i x(i) và ev(i) while (abs(ev(i)) > e) i = i + 1; x(i) = x(i-1) - (x(i-1) - x(i-2)).*p(i-1)./(p(i-1) - p(i-2)); p(i) = feval(f,x(i)); ev(i) = x(i) - x(i-1); end %---------------------------------------------------------------------%In ket qua thoai :)) fprintf('\nKet qua tinh toan:\n'); fprintf('So thu tu i \t \t Gia tri x(i) \t \t x(i) - x(i-1) \t\t\t\t f(x(i))'); fprintf('\n'); for i=1:length(x) fprintf('\t%d \t\t\t\t %f \t\t\t %f \t\t\t \t\t %f', i, x(i), ev(i), p(i)); fprintf('\n'); end end
Thử phát nhé :D - À, có 1 chút tớ cần nói qua nếu các bạn muốn nhập hàm vào MATLAB 2012b! Thông thường, chúng ta thườ ng cho khoảng của x trước sau đó mớ i viết f(x) = gì đó :-? Nhưng nếu chưa cho khoảng của x thì làm thế nào :D Thử viết phát nó sẽ báo lỗi ngay ;) - Ngoài ra, nếu bạn định sử dụng syms thì cũng ko đc đâu =)) B ản cũ th ì dùng đc (bản trên p máy ý) nhưng vs 2012b th ì ko đc th ế :D Không có việc gì khó Chỉ sợ bạn ko làm =))
Vậy phải làm sao =)) Trả lờ i: bạn có thể viết thế này
= @( , , … , ) ( , , … , ) Trong đó @( , , … , ) là khai báo các biến sẽ dùng, ( , , … , ) là biểu thức của hàm.
VD: muốn viết hàm f(x) = x^2 – 3*x + 2, ta phải gõ như sau! = @( ) (
−3∗
+ 2)
OK, h chúng ta thử nhập thôi :D Hàm tớ muốn tìm nghiệm là (0.3,10) , sai số là = 1. 10
=
− log( ) − 3 có trên khoảng phân ly
>> secantgr(); Nhap ham: @(x)(x.^2 - log10(x) - 3); Nhap gioi han duoi khoang phan ly nghiem: 0.3 Nhap gioi han tren khoang phan ly nghiem: 10 Nhap sai so: 1*10^(-5);
Ket qua tinh toan: So thu tu i
Gia tri x(i)
x(i) - x(i-1)
f(x(i))
1
0.300000
0.000000
-2.387121
2
10.000000
9.700000
96.000000
3
0.535347
-9.464653
-2.442039
4
0.770135
0.234788
-2.293459
5
4.394290
3.624155
15.666899
6
1.232924
-3.161367
-1.570835
7
1.521012
0.288088
-0.868655
8
1.877401
0.356389
0.251078
Không có việc gì khó Chỉ sợ bạn ko làm =))
9
1.797488
-0.079913
-0.023703
10
1.804381
0.006893
-0.000536
11
1.804541
0.000160
0.000001
12
1.804541
-0.000000
-0.000000
>>
Các bạn có thể dùng máy tính để tính lại kết quả nhé :D Bài viết còn nhiều thiếu sót, phần vì mình chỉ tìm hiểu đến mức này, phần vì ko có thờ i gian! Mấy chỗ chú thích, quen tay, gõ tiếng Việt có dấu hết nên đến lúc lên, bị mất :”) Lườ i quá, ko muốn sửa nữa :”) Mong các bạn đóng góp thêm vào nhé :D
Green
Không có việc gì khó Chỉ sợ bạn ko làm =))