Tải bản đầy đủ (.pdf) (21 trang)

đồ án java - giải gần đúng phương trình , tìm hệ số hồi quy bằng phương pháp bình phương cực tiểu

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 (313.64 KB, 21 trang )

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN TOÁN ỨNG DỤNG & TIN HỌC
——————— * ———————
LẬP TRÌNH TÍNH TOÁN
ĐỒ ÁN I
Chuyên ngành: TOÁN TIN ỨNG DỤNG
Giảng viên hướng dẫn: Th.S NGUYỄN THÁI BÌNH
Sinh viên thực hiện: NGUYỄN TUẤN ANH
Lớp: Toán Tin 2 - K55
HÀ NỘI 4 - 2014
NHẬN XÉT CỦA THẦY HƯỚNG DẪN
1. Mục đích và nội dung của đồ án:
2. Kết quả đạt được:
3. Ý thức làm việc của sinh viên:
Hà Nội, ngày tháng năm 2014
Thầy hướng dẫn
(Kí và ghi rõ họ tên)
NGUYỄN THÁI BÌNH
Mục lục
LỜI MỞ ĐẦU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1 Phần Mở Đầu 5
1.1 Đối tượng nghiên cứu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2 Mục đích nghiên cứu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3 Phương pháp nghiên cứu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.4 Ý nghĩa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2 Ước lượng hệ số hồi quy dạng: Y = aX + b, sử dụng phương pháp bình phương cực tiểu 7
2.1 Bài toán . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Giải thuật giải bài toán . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3 Source code Java giải bài toán . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.4 Màn hình kết quả chạy chương trình . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3 Tính nghiệm gần đúng 11


3.1 Bài toán: Viết chương trình tìm nghiệm gần đúng của chương tr ình. . . . . . . . . . . . . . . . . . . . 11
3.2 Giải thuật giải bài toán . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.3 Điều kiện hội tụ và sai số . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.4 Source code Java giải bài toán
( áp dụng cho hàm f(x) = x
5
− x − 1) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.5 Màn hình kết quả chạy chương trình . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.5.1 So sánh kết quả 2 phương pháp và rút ra nhận xét . . . . . . . . . . . . . . . . . . . . . . . . 19
Kết luận 20
Tài liệu tham khảo 21
3
LỜI NÓI ĐẦU
Ngày này cùng với sự phát triển vượt bậc của khoa học kỹ thuật thì công nghệ
thông tin là một trong những lĩnh vực có nhiều đóng góp thiết thực nhất, công
nghệ thông tin có mặt trong hầu hết các lĩnh vực của cuộc sống đặc biệt công nghệ
thông tin là một công cụ hỗ trợ rất đắc lực trong việc giải các bài toán. Chúng ta
dễ dàng thấy được việc đưa tin học vào trong các bài toàn giúp ta có thể giải bài
toán một cách nhanh chóng và chính xác.
Java là một nền tảng phát triển các ứng dụng phần mềm có vị trí rất lớn trong
những năm cuối thế kỉ 20, đầu thế kỉ 21. Đánh dấu sự trưởng thành của mô hình
lập trình hướng đối tượng, nó được coi là một nền tảng mang tính cách mạng trong
ngành phần mềm. Mô hình máy ảo Virtual Machine đã cho phép các ứng dụng
viết bằng Java có thể chạy trên nhiều hệ điều hành khác nhau
Trong đồ án này,em dùng ngôn ngữ lập trình Java trên công cụ hỗ trợ Eclipse
để ứng dụng vào môn học giải tích số,cụ thể là áp dụng vào những bài toán sau:
“1.Ước lượng hệ số hồi quy dạng Y =aX + b, sử dụng phương pháp bình phương
cực tiểu” và “Viết chương trình tính nghiệm gần đúng của phương trình bằng
phương pháp chia đôi và phương pháp tiếp tuyến”
Do thời gian gấp rút, chưa có nhiều kinh nghiệm nên bài báo cáo khộng thể

tránh những sai sót. Mong thầy cô, bạn đọc góp ý để bài báo cáo được trọn vẹn
hơn.
Và cuối cùng em xin chân thành cảm ơn các thầy cô giáo trong viện đã chỉ dạy
em trong thời gian qua, đặc biệt thầy Nguyễn Thái Bình đã trực tiếp chỉ dẫn tận
tình giúp đỡ em hoàn thành báo cáo này.
Hà Nội, Ngày 25 tháng 4 năm 2014
Nguyễn Tuấn Anh
4
Chương 1
Phần Mở Đầu
1.1 Đối tượng nghiên cứu
Đề tài này em tập trung vào các nội dung:
• Tìm hiểu, nghiên cứu ngôn ngữ lập trình Java
• Tìm hiểu các dạng bài toán của môn giải tích số
• Tìm hiểu công cụ xây dựng chương trình
1.2 Mục đích nghiên cứu
Hiểu được cách xây dựng chương trình trong Java, các cấu trúc lớp, đối tượng,
các hàm , các bước xây dựng chương trình giải bài toán thực tế trên máy tính.
Biết cách sử dụng phần mềm Eclipse để ứng dụng giải các bài toán giải tích số
1.3 Phương pháp nghiên cứu
Dựa vào giáo trình giải tích số của thầy Lê Trọng Vinh kết hợp với sự mạnh mẽ
của ngôn ngữ Java, e đã xây dựng được chương trình giải bài toán trên công cụ
Eclipse.
5
1.4 Ý nghĩa
Chương trình sẽ giải được hầu hết các bài toán thông dụng, đồng thời cũng là
tài liệu quý giá cho sinh viên rong việc học tập và nghiên cứu chuyên sâu sau này.
6
Chương 2
Ước lượng hệ số hồi quy dạng: Y = aX + b,

sử dụng phương pháp bình phương cực tiểu
2.1 Bài toán
Đề bài: Viết chương trình ước lượng hệ số hồi quy theo mô hình tuyến tính có
dạng Y = aX + b, sử dụng phương pháp bình phương cực tiểu, trong đó X và Y
là các biến ngẫu nhiên. Bộ số liệu quan sát của X và Y được lưu trong file text
data.text theo quy tắc các giá trị của X lưu trên 1 dòng, các giá trị của Y lưu trên
một dòng. Các giá trị ngăn cách nhau bởi dấu cách.
• Input: File data.txt với nội dung:
– Hàng 1: số phần tử n của X(hay của Y)
– Hàng 2: thông tin các giá trị của X
– Hàng 2: thông tin các giá trị của Y
• Output: màn hình Console hiển thị kết quả chương trình.
2.2 Giải thuật giải bài toán
7
2.3 Source code Java giải bài toán
package doan;
import java.io.FileInputStream;
//import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;
public class bai11_doan {
private static Scanner scan;
private static int n;
private static float[] x;
private static float[] y;
public static void main(String[] args) throws IOException {
scan = new Scanner(new
FileInputStream("D:\\data.txt"));
n=scan.nextInt();
x = new float[n];

y = new float[n];
float tongx=0,tongy=0;
float tongtichxy = 0;
float tongxbinhphuong = 0;
for(int i = 0;i<n;i++){
x[i]=scan.nextFloat();
}
for(int i = 0;i<n;i++){
y[i] = scan.nextFloat();
}
for(int i = 0;i<n;i++){
tongx = tongx +x[i];
tongy = tongy +y[i];
//tichxy = x[i]*y[i];
tongtichxy = tongtichxy + x[i]*y[i];
8
tongxbinhphuong = tongxbinhphuong + x[i]*x[i];
}
float tbx = tongx/n;
//for(int i=0;i<n;i++){
// y[i] = scan.nextFloat();
// tongy = tongy +y[i];
//}
float tby = tongy/n;
float a = (tongtichxy - n*tbx*tby)/(tongxbinhphuong
- n*tbx*tbx);
float b = tby - a*tbx;
System.out.println("trung binh cua x[i] = "+tbx);
System.out.println("trungbinh cua y[i] = "+tby);
System.out.println("tong cua cac tich x[i]*y[i] =

"+tongtichxy);
System.out.println("tong cua cac x[i]^2 =
"+tongxbinhphuong);
System.out.println("he so a = "+a);
System.out.println("he so b = "+b);
}
}
9
2.4 Màn hình kết quả chạy chương trình
10
Chương 3
Tính nghiệm gần đúng
3.1 Bài toán: Viết chương trình tìm nghiệm gần đúng
của chương trình.
Bài toán 1: phương pháp chia đôi
Đề bài: Viết chương tr ình tìm nghiệm gần đúng bằng phương pháp chia đôi.
• Input: hàm F(x), đạo hàm F’(x), khoảng phân li nghiệm [a b]
• Output: nghiệm của chương trình.
Bài toán 2: phương pháp tiếp tuyến
Đề bài: Viết chương tr ình tìm nghiệm gần đúng bằng phương pháp tiếp tuyến.
• Input: hàm F(x), đạo hàm F’(x),đạo hàm F”(x), khoảng phân li nghiệm [a b]
• Output: nghiệm của chương trình.
11
3.2 Giải thuật giải bài toán
Ý tưởng
Dựa vào sự hội tụ của khoảng phân li nghiệm [a b] để tìm nghiệm gần đúng.
Giải sơ bộ: Đi tìm một khoảng đủ bé để chứa nghiệm
• Vây nghiệm: Tìm đoạn bé chưa các nghiệm
• Tách nghiệm: Tách các đoạn bé, mỗi đoạn chỉ chứa một nghiệm
Giải kiện toàn: Giải nghiệm với độ chính xác epsilon cần thiết

Giải thuật
Giải thuật phương pháp chia đôi
Giả sử hàm số f(x) liên tục trên đoạn [a, b] và f(a).f(b) < 0. Chia [a b] thành hai
phần bởi điểm giữa c = (a + b)/2
• Nếu f(c) = 0 thì nghiệm là x = c
• Nếu f(c) 0 thì chọn [a c] hoặc [c b] mà giá trị hàm tại hai đâu trái dấu và kí
hiệu [a1 b1]. Đối với [a1 b1] lại tiến hành như [a b]
Giải thuật phương pháp tiếp tuyến
Chọn x
0
∈ khoảng nghiệm [a b]
Tiếp tuyến tại A
0
(x
0
,f(x
0
)) cắt trục x tại hoành độ x
1
Tiếp tuyến tại A
1
(x
1
,f(x
1
)) cắt trục x tại hoành độ x
2
,
Tiếp tuyến tại A
k

(x
k
,f(x
k
)) cắt trục x tại hoành độ x
k
, ,
12
Cứ tiếp tục quá trình trên ta có thểtiến dần đến nghiệm µ của phương trình.
Phương tr ình tiếp tuyến tại A
k
(x
k
,f(x
k
)): y - f(x
k
) = f’(x
k
)*(x - x
k
)
Tiếp tuyến cắt trục x tại điểm có toạ độ (x
k
+ 1, 0)
Do vậy: 0 - f(x
k
) = f’(x
k
)*(x

k
+ 1 - x
k
) => x
k
+ 1 = x
k
-
f(x
k
)
f

(x
k
)
3.3 Điều kiện hội tụ và sai số
Phương pháp chia đôi
Giả sử [a
k
b
k
] là khoảng phân li nghiệm sau k lần lặp. Nếu |a
k
- b
k
| < epsilon
cho trước thì nghiệm gần đúng của phương trình là c = (a
k
+ b

k
)/2
Phương pháp tiếp tuyến
Giả sử [a,b] là khoảng nghiệm của phương trình f(x) = 0. Đạo hàm f ’(x), f”(x)
liên tục, không đổi dấu, không tiêu diệt trên [a,b]. Khi đó ta chọn xấp xỉ nghiệm
ban đầu x
0
∈ [a,b] sao cho f(x
0
))*f”(x
0
) > 0 thì quá trình lặp sẽ hội tụ đến nghiệm.
3.4 Source code Java giải bài toán
( áp dụng cho hàm f(x) = x
5
− x − 1)
Code tìm nghiêm gần đúng bằng phương pháp chia đôi
package doan;
import java.util.*;
public class bai1 {
static float ex=(float) 0.001;
private static float ham(float x){
return x*x*x*x*x - x -1;
13
}
public static float DaoHam1(float x)
{
return 5*x*x*x*x - 1;
}
private static int kiemtra(float x,float y){

if((y-x)>=ex)
return 0;
else
return 1;
}
public static void main(String[] args) {
float a,b;
float c;
Scanner input = new Scanner(System.in);
System.out.println("moi nhap a va b :");
a = input.nextInt();
b = input.nextInt();
if((ham(a)*ham(b) < 0)&(DaoHam1(a)*DaoHam1(b)>0)){
System.out.println(" \n a va b la khoang phan
li nghiem");
c = (a+b)/2;
int stop=0;
int dem= 0;
while(ham(c)!=0&&stop==0){
dem++;
if (ham(c)==0){
stop=1;
}
else if(ham(a)*ham(c)<=0){
if (kiemtra(a,b)==0){
b=c;
c=(a+b)/2;
14
}
else stop=1;

}
else{
if(kiemtra(a,b)==0){
a=c;
c=(a+b)/2;
}
else stop=1;
}
}
System.out.println("nghiem pt la " + c);
System.out.println("\n so lan lap la " + dem);
}
else{
System.out.println("a va b khong phai khoang
phan li nghiem,moi nhap lai");
}
}
}
Code tìm nghiêm gần đúng bằng phương pháp tiếp tuyến
package doan;
import java.util.*;
public class bai1_b {
static float ex=(float) 0.001;
private static float ham(float x){
return x*x*x*x*x - x -1;
}
public static float DaoHam1(float x)
{
return 5*x*x*x*x - 1;
15

}
public static float DaoHam2(float x)
{
return 20*x*x*x;
}
public static void main(String[] args) {
float a,b;
float m1 =0;
float m2 = 0;
float y=0;
float x=0;
Scanner input = new Scanner(System.in);
System.out.println("moi nhap a va b :");
a = input.nextFloat();
b = input.nextFloat();
if((ham(a)*ham(b) < 0)&(DaoHam1(a)*DaoHam1(b)>0)){
System.out.println(" \n a va b la khoang phan
li nghiem");
if((DaoHam1(a)*DaoHam1(b)>0)&(DaoHam2(a)*DaoHam2(b)>0)){
System.out.println("\n Giai PT bang pp
Tiep tuyen :");
float tg;
if(ham(a)*DaoHam2(a)>0){
tg= a;
}
else{
tg =b;
}
if(Math.abs(DaoHam1(a)) <
Math.abs(DaoHam1(b)))

{
m1=Math.abs(DaoHam1(a));
16
}
else{
m1 = Math.abs(DaoHam1(b));
}
if(Math.abs(DaoHam2(a)) >
Math.abs(DaoHam2(b))){
m2= Math.abs(DaoHam2(a));
}
else{
m2 = Math.abs(DaoHam2(b));
}
int i = 0;
do{
i++;
y=tg;
x = y - ham(y) / DaoHam1(y);
System.out.println(x);
tg=x;
}
while((m2 * (x - y)*(x - y) / (2 * m1))
>= ex);
System.out.println("\n nghiem pt
la " +x);
System.out.println("\n so lan lap
la :"+i);
}
else{

System.out.println("\n a va b khong t/m
giai pt = pp Tiep tuyen :");
}
}
else{
17
System.out.println(" \n a va b khong phai la
khoang phan li nghiem,moi nhap lai");
}
}
}
3.5 Màn hình kết quả chạy chương trình
Kết quả phương pháp chia đôi
18
Kết quả phương pháp tiếp tuyến
3.5.1 So sánh kết quả 2 phương pháp và rút ra nhận xét
Phương pháp chia đôi
Ưu điểm của phương pháp chia đôi là thuật toán đơn giản do đó dễ lập trình.
Tuy nhiên do phương pháp chia đôi sử dụng rất ít thông tin về hàm f(x) nên tốc độ
hội tụ khá chậm và chỉ sử dụng để giải sơ bộ phương trình.
Phương pháp tiếp tuyến
Tuy thuật toán phương pháp tiếp tuyến phức tạp hơn so với thuật toán phương
pháp chia đôi, đòi hỏi phải tính đạo hàm f’(x), nhưng lại tỏ ra hiệu quả hơn, vòng
lặp ít hơn do tốc độ hội tụ nghiệm nhanh, hiệu quả trong việc giải các phương trình
phức tạp.
19
3.6 Kết luận
20
Tài liệu tham khảo
[1] Họ và tên tác giả, năm, Tên sách NXB.

[2] Họ và tên tác giả, năm, Tên sách NXB.
[3] Họ và tên tác giả, năm, Tên sách NXB.
[4] Họ và tên tác giả, năm, Tên sách NXB.
[5] Họ và tên tác giả, năm, Tên sách NXB.
21

×