Tải bản đầy đủ (.docx) (15 trang)

CHƯƠNG TRÌNH GIẢI GẦN ĐÚNG PHƯƠNG TRÌNH MỘT ẨN BẰNG PHƯƠNG PHÁP NỘI SUY NEWTON (có code c++)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (342.3 KB, 15 trang )

TRƯỜNG ĐẠI HỌC ĐỒNG THÁP
KHOA KỸ THUẬT – CÔNG NGHỆ

NHÓM: Dương Tấn Thành, Lê Hồ Hoàng Huy,
Nguyễn Thị Thiện Vy, Hồ Ngọc Vinh Quang

BÁO CÁO TỔNG KẾT NGHIÊN CỨU CHUYÊN ĐỀ

CHƯƠNG TRÌNH GIẢI GẦN ĐÚNG PHƯƠNG TRÌNH
MỘT ẨN BẰNG PHƯƠNG PHÁP NỘI SUY NEWTON

NGÀNH: KHOA HỌC MÁY TÍNH
LỚP: ĐHCNTT18a

GIẢNG VIÊN HƯỚNG DẪN: Ths. NGUYỄN THỊ THÙY LINH

Đồng Tháp, 26 tháng 11 năm 2019


DANH SÁNH SINH VIÊN NHÓM
ST
T
1

MSSV

HỌ TÊN

0018413051

Dương Tấn Thành



2
3

0018410639
0018410683

4

0018413050

Lê Hồ Hoàng Huy
Nguyễn Thị Thiện
Vy
Hồ Ngọc Vinh
Quang

GHI CHÚ
Nhóm trưởng
ĐT:039 919 8294
E-mail:

Bảng phân công công việc:
STT
1
2
3
4

CÔNG VIỆC

Lập trình viên, sưu tầm thuật toán
Trình bài nội dung pp Newton, cho bài
tập ví dụ
Trình bài nội dung pp Newton
Lập trình viên

GHI CHÚ
Làm Demo bằng C++

Làm Demo bằng C++

1


MỤC LỤC
1. Mở đầu…………………………………………………..trang 3
2. Nội dung đề tài…………………………………………..trang 3
2.1 Kiến thức tổng quan……………………………………trang 3
2.1.1 Khái niệm và công thức phương pháp Newton………trang 3
2.1.2 Bài tập ví dụ…………………………………………..trang 5
2.2 Chương trình ứng dụng…………………………………trang 6
2.2.1 Đặt vấn đề……………………………………………..trang 6
2.2.2 Phương pháp giải quyết vấn đề………………………..trang 6
2.2.3 Thiết kế và cài đặt thuật toán………………………….trang 8
2.2.4 Demo chương trình C++…………………….…………….trang 8
3. Kết luận…………………………………………………...trang 12
3.1 Kết quả đạt được…………………………………………trang 12
3.2 Hạn chế…………………………………………………..trang 12
3.3 Hướng phát triển…………………………………………trang 12
Tài liệu tham khảo………………………………………..…trang 13

Phụ lục……………………………………………………….trang 14

1

MỞ ĐẦU
2


Trong khoa học và công nghệ có rất nhiều bài toán được chuyển thành bài toán giải hệ phương
trình, đặc biệt là việc ứng dụng giải hệ phương trình trong chuyên nghành khoa học máy tính.
Tuy nhiên, có một vấn đề là các phương trình đại số dạng phức tạp thì phần lớn ta không thể
tìm được nghiệm đúng. Vì vậy, cần phải có những phương pháp tìm nghiệm gần đúng, đồng
thời ước lượng được sai số của chúng là rất cần thiết. Có nhiều phương pháp xác định nghiệm
gần đúng dựa trên mức sai số cho phép. Nhìn chung, các phương pháp này thường sẽ trải qua
ba nhiệm vụ chính đó là vây nghiệm, tách nghiệm và thu hẹp khoảng chứa nghiệm. Chúng ta sẽ
đi tìm hiểu về phương pháp lặp Newton hay còn được gọi là phương pháp tiếp tuyến và đi vào
xây dựng chương trình tìm nghiệm gần đúng của phương trình một ẩn ở dạng cụ thể. Phương
pháp này có ưu điểm lớn khi so sánh với các phương pháp khác. Ưu điểm là nó cho ta được tốc
độ hội tụ nhanh giúp giảm số lần lặp đáng kể, nhanh chống cho ta kết quả nghiệm tương đối
chính xác, còn nhược điểm là biết

xn  1

, để tính

xn

ta phải tính giá trị của hàm f và giá trị của

x

hàm f  tại điểm n  1
2

NỘI DUNG ĐỀ TÀI

2.1 Kiến thức tổng quan
2.1.1 Khái niệm và công thức phương pháp Newton[1]
Cho phương trình f (x ) = 0, x ∈ (a, b)
Gọi x* là nghiệm gần đúng,

x

là nghiệm chính xác.

Áp dụng công thức Taylor:

f ( x)  f ( x* )  f ( x* )( x  x* )  o( x  x * )
 0  f ( x)  f ( x * )  f ( x * )( x  x * )
f ( x* )
 x x 
f ( x* )
*

xn  xn  1 
Xây dựng dãy lặp Newton:

f ( xn  1 )
f ( xn  1 )
3



Từ công thức Newton suy ra:

0  f ( xn  1 )  f ( xn  1 )( xn  xn  1 )
Từ đây ta có thể suy ra cách xác định

xn từ xn  1 như sau: từ điểm ( xn  1 , f ( xn  1 ))

đồ thị, ta vẽ tiếp tuyến với đồ thị tại điểm này,
hoành.

xn

trên

là giao điểm của tiếp tuyến này với trục

Phương pháp Newton còn gọi là phương pháp tiếp tuyến. Phương pháp Newton sử dụng công
thức sai số
tổng quát sau:

xn  xn  x 

f ( xn )
m

Với m =

Nếu xem phương pháp Newton như lặp đơn, khi đó:
f ( x)

f ( x) f ( x)
 g ( x) 
f ( x)
[ f ( x)]2
Nhận thấy

min

f ( x)

x[ a ,b ]

g ( x) x 

g (x) = 0, nếu chọn x0 thích hợp thì phương pháp Newton sẽ hội tụ nhanh (nhờ hệ

số co nhỏ), nhưng nếu chọn

( g ( x)  1)

x0

không phù hợp phương pháp Newton có thể không hội tụ

Định lý



Giả sử f(x) có đạo hàm liên tục đến cấp 2 và các đạo hàm f ( x ), f ( x ) không đổi dấu trên
đoạn [a, b]. khi đó nếu chọn


x0

thỏa

f ( x0 ) f ( x0 )  0 thì phương pháp lặp Newton hội tụ

Chú ý:
Điều kiện Fourier chỉ là điều kiện cần không đủ

f ( x) 0

là điều kiện tiên quyết

4



Nếu f ( a ) f ( a )  0, chọn

x0 a


Nếu f ( a ) f ( a )  0, chọn

x0 b



Nếu f ( a ) 0, xét f (b) f (b)

+ Ưu điểm của phương pháp tiếp tuyến là tốc độ hội tụ nhanh.
+ Nhược điểm của phương pháp tiếp tuyến là biết
f và giá trị của đạo hàm

xn  1 , để tính xn ta phải tính giá trị của hàm

f  tại điểm xn  1

2.1.2 Ví dụ giải phương trình một ẩn bằng phương pháp Newton (Giải BT kèm theo)

Ta có f(0)>0, f(0.5)<0,

f ( x ) 3x 2  3  0, x  [0,0.5] và f ( x) 6 x 0, f (0.5) f (0.5)  0 nên chọn

x0 0

Ta xây dựng dãy ( xn ) theo công thức

f ( xn  1 )
x 3  3x  1
 xn  1  n  1 3 n  1
f ( xn  1 )
3 xn  1  3

xn  x n  1 
2 xn3 1  1
 2
3 xn  1  3

9

f ( x) min{ f (0.5) }  m
4
Ta có
Do đó nghiệm gần đúng xn được đánh giá sai số so với nghiệm chính xác x như sau

x  xn 

f ( xn )
m



xn3  3 xn  1
9/4

xn

5


2.2 Chương trình ứng dụng
2.2.1 Đặt vấn đề
x

x

Ta sẽ đi xét phương trình một ẩn dạng tổng quát như sau e  a  b cos(x )  c 0 . Ưu thế để sử
dụng phương trình này là ta dễ dàng xác định được x0 với giá trị tương đối đơn giản và nhỏ,
nhằm dễ dàng để xét điểm hội tụ chính xác. Phương trình cũng đủ độ phức tạp khi ta không thể
tìm ra nghiệm chính xác thông qua quá trình tính toán thông thường. Một phần nữa là ta dễ

dàng giải các phương trình có dạng tương tự thông qua việc thay đổi hệ số a, b, c. Vì thế,
phương trình hội tụ đủ các yếu tố để ta áp dụng phương pháp Newton vào xây dựng chương
trình và đáp ứng các yêu cầu mà giảng viên đã đề ra.
2.2.2 Phương pháp giải quyết vấn đề
Để xây dựng chương trình giải gần đúng phương trình một ẩn bằng phương pháp
Newton, trước hết nhóm sẽ nghiên cứu quá trình hội tụ của bài toán trên trục x, y. Tiếp đến sẽ
đi tìm hiểu chi tiết các bước mà một chương trình máy tính thực hiện thông các thuật toán và
lưu đồ thuật toán. Sau cùng, nhóm sẽ xây dựng và trình bày phần Demo Code *.cpp chương
trình và trình diễn chạy thử thông qua các dữ liệu vào được liệt kê và xuất ra màn hình dữ liệu
ra để đối chiếu với kết quả thực tế.
Để giải bài toán tìm nghiệm gần đúng nói chung, ta cần dữ kiện là lời giải tìm nghiệm
xấp xỉ của phương trình. Từ lời giải này ta thực hiện lập đi lập lại để tìm nghiệm gần đúng. Qua
mỗi lần lập như vậy, trả về cho ta độ hội tụ nghiệm nhỏ dần cho tới khi nghiệm này thõa mãn
yêu cầu sai số của bài toán thì dừng lại.
Để giải phương trình tìm nghiệm gần đúng bằng phương pháp Newton ta trải qua ba
bước dưới đây:

Hình 1.1[3]
6


Bước 1: Vẽ đường tiếp tuyến y = f(x) tại p1( x1, y1) và thu được điểm x2 là giao của đường
tiếp tuyến và trục x. Theo hình 1.1
Bước 2: Vẽ đường tiếp tuyến y = f(x) tại p2 (x2, y2) và thu được điểm x3 là giao của đường
tiếp tuyến và trục x. Ở bước này đường tiếp tuyến được thực hiện lặp lại gần với kết quả cần
tìm. Theo hình 1.1
Bước 3: Sự khác nhau giữa các giá trị xấp xỉ gần kề nhau thu được trong bước 2 được so sánh
với độ chính xác của giá trị hội tụ được xác định trước. Thực hiện lặp lại bước 1 và 2 cho tới
khi sự khác nhau này nhỏ hơn giá trị hội tụ được xác định trước
Ghi chú: Đạo hàm của hàm số chính là độ dốc của đường tiếp tuyến có giá trị

tan  

f ( xk )

xk 1  xk 
f ( xk )
Ck . Nên công thức xác định đường tiếp tuyến tổng quá là:

2.2.3 Thiết kế và cài đặt thuật toán
Lưu đồ thuận toán[3]
Bắt đầu
0 K

Số lần lặp lại lớn nhất: Kmax
Giá trị hội tụ: ‫ﻉ‬
Giá trị ban đầu F (x) = 0 : x0

f (xk )x2

xk -

xk
+1

f’ (xk )

xk +1 - xk : ‫ﻉ‬

>


K+1 K

K : Kmax
Đưa ra xk + 1

>
Không hội tụ
Kết thúc

Hình 1.2
7


2.2.4 Demo chương trình C++ giải gần đúng phương trình một ẩn xác định[4]
+ Ghi chú: Ta gọi tên x0 ở thuật toán phía trên là x1 trong chương trình chính.
/* * * * * Chương trình chính * * * * */
#include<iostream>
#include<cmath>
#include<conio.h>
#include<iomanip>
#include<windows.h>
using namespace std;
double x, x1, e, fx, fx1;

/*Khai báo các biến toàn cục*/

float a, b, c;
double f(double x);

//Khởi tạo hàm f(x)


double f(double x)

//Cài đặt cấu trúc hàm phương trình e^x+a^(-x)+b*cos(x)-c=0

{
double A=pow(2.718281828, x)+pow(a, -x)+b*cos(x)-c;
return A;
}
double fprime(double x);

//Khởi tạo hàm f '(x)

double fprime(double x)

//Cài đặt hàm tính f'(x)

{
double B=pow(2.718281828, x)-pow(a, -x)*log(a)-b*sin(x);
return B;
}
void Nhap(){

//Khai báo thủ tục nhập vào

cout<<"Giai pt: e^x+a^(-x)+b*cos(x)-c=0\n";
cout<<"Nhap vao hang so a, b, c: ";
cin>>a>>b>>c;
cout<<"pt: e^x+"<//Xuất ra màn hình pt cần tính

cout<<"Nhap vao x1: ";
8


cin>>x1;

//Lưu nghiệm x1

cout<<"Nhap vao do chinh xac mong muon [VD: 0.0001] :";
cin>>e;

//Lưu sai số nhập vào

cout.precision(10);

//Độ chính xác lớn nhất cho phép là 10 chữ số

cout.setf(ios::fixed);
}
void XuatBang(){

//Khai báo thủ tục xuất ra bảng xét nghiệm

int n =-1;
cout<<"\n\t\t\tBANG XET NGHIEM\n\n";
cout<<"Buoc\t"<<" x{i}"<<"\t\t\t "<<"x{i+1}"<<"\t\t\t"<<"|x{i+1}-x{i}|"<<"\n";
//Tại danh mục bảng
do

//Khai báo lệnh vòng lặp do - while


{
n++;
x=x1;

//Số bước thực hiện tăng lên 1 đơn vị
//Gán x tăng lên giá trị gần đúng tiếp theo (Giá trị hội tụ giảm dần)

fx=f(x);

//Xử lý f(x) và gán giá trị vừa tìm được vào fx

fx1=fprime(x);
//Xử lý hàm f '(x) và gán giá trị vừa tìm được vào fx1
x1=x-(fx/fx1);
//Tính giá trị Xn=(Xn-1)-(f(Xn-1)/f '(Xn-1))
cout<//Xuất kết quả ra danh sách
}while (fabs(x1-x)>=e);
//Khi thỏa điều kiện |x{i+1}-x{i}|>=e thì dừng lại. Nếu không, lặp
lại các bước trên
}
void XuatKQ(){

//Khai báo thủ tục xuất kết quả ra màn hình

cout<<"\n=====> NGHIEM TIM DUOC VOI SAI SO TOI THIEU "<//Xuất kết quả cuối cùng
}
int main(){

9


system("color F1");

//Sử dụng màu cho cửa sổ Console

cout<<"====== Giai phuong trinh 1 an dang pt: e^x+a^(-x)+b*cos(x)-c=0 su dung
phuong phap Newton ======\n\n";
cout<<"

*

*

*

*

*

\n";

Nhap();
XuatBang();
XuatKQ();
getch();
return 0;
}
Dữ liệu mẫu Input cho 3 bộ kèm theo đáp án

**
x
x
5
Input: f ( x) e  2  2 cos x  6 . Nhập x1 là 2, sai số là 10

Output:

Hình 2.1

x
x
6
Input: f ( x) e  4,5  3,2 cos(x)  9,78 . Nhập x1 là 7, sai số là 10

10


Output:

Hình 2.2
x
x
7
Input: f ( x) e  19  79 cos(x)  66 . Nhập x1 là 18, sai số 10

Output:

Hình 2.3
3


KẾT LUẬN

3.1 Kết quả đạt được
Qua việc tìm hiểu nghiên cứu đề tài thông qua các tài liệu tham khảo được tìm thấy. Nhóm xác
định được phương pháp Newton có thể áp dụng để tìm ra nghiệm chính xác và sử dụng ít bộ
nhớ hơn các phương pháp khác nhờ vào số vòng lặp nhỏ, do phương pháp này cho ta tốc độ hội
tụ nhanh. Các yêu cầu công việc và nhiệm vụ về cơ bản đã được hoàn thành tốt. Để xây dựng
hoàn chỉnh chương trình, nhóm đã gặp không ít khó khăn và luôn tìm hướng giải quyết thông
qua các ý kiến của các bạn trong nhóm tích góp xây dựng. Mặc khác, nhóm chúng em đã rút ra
được rất nhiều kinh nghiệm quý báo trong việc xây dựng chương trình ứng dụng giải thuật của
11


bài toán trong thực tế. Mặc dù còn nhiều hạn chế trong chương trình, nhưng chúng em sẽ tiếp
tục tìm tòi để khắc phục chúng nhằm hỗ trợ tốt hơn quá trình tự học tập, tự nghiên cứu sau này.
3.2 Hạn chế
Chương trình chỉ giải được một dạng cấu trúc xác định. Do hạn chế của phương pháp Newton
ta phải xác định x1 thích hợp để xét điểm hội tụ. Trường hợp ít khi xảy ra là nếu ta nhập vào
chỉ số x1 không phù hợp, có thể là quá lớn. Thì chương trình có thể không cho ra kết quả chính
xác.
3.3 Hướng phát triển
Ta sẽ xây dựng thêm thủ tục xét khoảng ly nghiệm cụ thể từ dữ liệu Input đưa vào, tức là xuất
ra màn hình khoảng ly nghiệm của phương trình sau khi người dùng nhập vào hệ số a, b, c.
Giúp thao tác nhập nghiệm x1 được dễ dàng hơn và khắc phục được lỗi không thể tìm ra
nghiệm chính xác.

TÀI LIỆU THAM KHẢO

[1] Nguyễn Hồng Lộc, SỐ GẦN ĐÚNG VÀ SAI SỐ, Khoa khoa học ứng dụng, Trường

Đại học Bách Khoa TP HCM - 2013
[2] Tailieu.vn: tác giả Nguyễn Nhi, ngày đăng 27.7.2011,
ngày
truy cập 17.11.2019

12


[3] Tieuluan.info: Cấu trúc dữ liệu 1, cấu trúc dữ liệu là gì? ngày cập nhật 15.12.2018,
o/cu-trc-d-liu-1-cu-trc-d-liu-l-g-2.html?page=5, ngày truy
cập 18.11.2019

[4] Youtube.com: Phys Whiz, 11.7.2016, NEWTON-RAPHSON METHOD - C++
PROGRAM [EXPLAINED], />ngày truy cập 18.11.2019

PHỤ LỤC
Hướng dẫn cài đặt:
Chương trình Demo được viết trên DEV C++ phiên bản 5.11 Nên chạy tốt trên trình biên dịch
này.
Code xử lý tiêu biểu:
do

//Khai báo lệnh vòng lặp do-while
13


{
n++;
x=x1;
fx=f(x);


//Số bước thực hiện tăng lên 1 đơn vị
//Gán x tăng lên giá trị gần đúng (Độ hội tụ giảm dần)
//Xử lý hàm f(x) và gán giá trị vừa tìm được vào fx

fx1=fprime(x);
//Xử lý hàm f’(x) và gán giá trị vừa tìm được vào fx1
x1=x-(fx/fx1);
x (( xn  1)  ( f ( x  1) / f ( xn  1 ))
//Tính giá trị n
n

cout<//Xuat ket qua ra danh sach
}while (fabs(x1-x)>=e);
//Khi thõa điều kiện |x{i+1}-x{i}|>=e thì dừng lại. Nếu không, lặp
lại các bước trên.
cout<<"\nNGHIEM TIM DUOC VOI SAI SO TOI THIEU "<//Xuất ra màn hình kết quả cuối cùng.
return 0;
}

THE END

14



×