Bảng kết quả thực nghiệm tìm nghiệm của hệ phương trình

Một phần của tài liệu Xây dựng phần mềm hỗ trợ học phương pháp tính (Trang 62)

Ví dụ Phương pháp Gauss Phương pháp lặp đơn

Ví dụ 1 x1 = 1 x2 = 1 x3 = 1 x16=0,99996576 x26=0,99998412 x36=0,99999090 sai số: 0,2975 Ví dụ 2 x1 = 3,923636363636 x2 = -1,25272727272 x3 = 1,976363636363 x114= 3,9266362 x214= -1,2527272 x314= 1,97636363 Sai số: 14*10-6 Ví dụ 3 x1 = 5,5224719101 x2 = 3,6853932584 x3 = -1,073033707 x114= 5,52247190 x214= 3,68539325 x314= -1,0730337 Sai số: 5*10-6 Ví dụ 4 x1 = 0,1418439716 x2 = 1,8226950354 x3 = 0,3900709219 x110= 0,14184397 x210= 1,82269503 x310= 0,39007092 Sai số: 10-5 Ví dụ 5 x1 = 0,9182389937 x2 = -1,704402515 x3 = -0,031446540 x111= 0,91823899 x211= -1,7044025 x311= -0,0314465 Sai số: 18*10-6

56

ĐẠI HỌC HÙNG VƯƠNG

Qua quá trình thử nghiệm phần mềm, em xin đưa ra một số nhận xét, đánh giá như sau:

- Phương pháp Gauss không có sai số và cho ra nghiệm đúng. Còn phương pháp lặp đơn đưa ra sai số và cho ra nghiệm gần đúng.

- Thời gian tìm ra nghiệm của phương pháp lặp đơn nhanh hơn phương pháp Gauss, do số lượng phép tính trong phương pháp Gauss sẽ tăng nhanh khi số lượng ẩn tăng lên.

57

ĐẠI HỌC HÙNG VƯƠNG

C. KẾT LUẬN CHUNG 1. Kết quả đạt được 1. Kết quả đạt được

Xây dựng được thành công phần mềm hỗ trợ học Phương pháp tính chạy được ổn định, hiệu quả.

Phần mềm gồm các chức năng chính như sau:

- Tìm nghiệm gần đúng của phương trình và hệ phương trình đại số tuyến tính.

- Tích hợp bộ đề cương bài giảng, câu hỏi ôn tập và bài tập cuối chương. - Ngoài ra cung cấp một số bài tập ví dụ minh họa cho người dùng tham

khảo.

Phần mềm tìm hỗ trợ học Phương pháp tính có những ưu điểm sau:

 Phần mềm chạy ổn định, hiệu quả.

 Sau khi xây dựng phần mềm và đưa vào thực nghiệm, em có đưa ra những đánh giá để so sánh kết quả giữa các phương pháp.

 Phần bài tập ví dụ minh họa cụ thể, trình bày logic giúp sinh viên đồng rèn luyện kỹ năng giải các bài toán thông thường cũng như rèn luyện khả năng tự học.

 Phần mềm không cần mật khẩu, tài khoản để tất cả người học đều có thể sử dụng. Phần mềm hoạt động không cần kết nối Internet.

 Phần mềm được xây dựng trên tiêu chí khi tải phần mềm về máy tính không mất phí và thời gian sử dụng phần mềm là không giớ hạn.

 Giao diện trong suốt, thân thiện với người dùng.

Phần mềm hỗ trợ học Phương pháp tính còn tồn tại hạn chế sau:

 Chưa xây dựng hết các phương pháp tìm nghiệm.

 Phần mềm chưa hỗ trợ sử dụng trực tuyến.

2. Hướng phát triển đề tài

 Khắc phục nhược điểm còn tồn tại, đưa phần mềm vào thực nghiệm.

 Tiếp tục hoàn thiện và mở rộng phạm vi tìm nghiệm gần đúng cho nhiều phương pháp tính hơn nữa.

58

ĐẠI HỌC HÙNG VƯƠNG

D. TÀI LIỆU THAM KHẢOSách tham khảo: Sách tham khảo:

[1]. Đỗ Thị Tuyết Hoa (2010), Phương pháp tính, Đại học Đà Nẵng.

[2]. Lê Hữu Đạt (Chủ biên) (2006), “Lập trình Windows”.,NXB Lao động xã hội.

[3]. Phạm Hữu Khang, Đoàn Thiện Ngân (2005), “C# - Lập trình FORM

WINDOWS (Tập 2)”, NXB lao động xã hội.

[4]. Tạ Văn Đĩnh (Chủ biên) (2008), Phương pháp tính, NXB Giáo dục.

Website:

[5]. Nguyễn Thế Công (2015). Giới thiệu về môn học tính toán và phần mềm hỗ trợ tính toán, <http://pptinh.blogspot.com/>, xem 05/10/2016.

[6]. Võ Đại Lượng (2011). Phần mềm SCA - Hỗ trợ tính toán trong toán học, https://download.com.vn/phan-mem-sca/download. [7]. https://vi.wikipedia.org/wiki/Ph%C6%B0%C6%A1ng_tr%C3%ACnh [8].https://vi.wikipedia.org/wiki/H%E1%BB%87_ph%C6%B0%C6%A1ng_t r %C3%ACnh_tuy%E1%BA%BFn_t%C3%Adnh [9]. https://vi.wikipedia.org/wiki/Microsoft_Visual_Studio [10]. https://www.devexpress.com/Support/

ĐẠI HỌC HÙNG VƯƠNG

E. PHỤ LỤC

Phụ lục A: Mã code C# tìm nghiệm theo phương pháp chia đôi.

private double[] a = new double[16]; private double[] b = new double[16]; private double[] c = new double[16]; private double[] fc = new double[16]; private double[] eps = new double[16]; private double[] eps1 = new double[16]; double an, bn, lanlap, epsilon;

private void TTlanchiaN() { int i = 0; an = Convert.ToDouble(canduoiA.Text); bn = Convert.ToDouble(cantrenb.Text); if (tinhF(an) * tinhF(bn) < 0) {

lanlap = Convert.ToDouble(calcEdit_n.Text); a[0] = an;

b[0] = bn; do

{

c[i] = (a[i] + b[i]) / 2; if (tinhF(c[i]) == 0)

txtketqua.Text = c[i] + "là nghiệm của phương trình"; else if (tinhF(a[i]) * tinhF(c[i]) < 0)

{

b[i + 1] = c[i]; a[i + 1] = a[i]; c[i + 1] = c[i];

eps[i + 1] = (c[i] - a[i]);

txtketqua.Text = " Nghiệm của phương trình là: x= " + c[i] + " sai số với lần lặp n = " + lanlap + " là: " + eps[i + 1].ToString();

} else { a[i + 1] = c[i]; b[i + 1] = b[i]; c[i + 1] = c[i];

eps[i + 1] = b[i] - c[i];

txtketqua.Text = " Nghiệm của phương trình là: x= " + c[i] + " sai số với lần lặp n = " + lanlap + " là: " + eps[i + 1].ToString();

}

i = i + 1; } while (i < lanlap); }

else

txtketqua.Text = "[" + an + "," + bn + "]" + " Không phai là khoảng phân li cuả phương trình";

}

private void TTEpsilon() {

an = Convert.ToDouble(canduoiA.Text); bn = Convert.ToDouble(cantrenb.Text); if (tinhF(an) * tinhF(bn) < 0)

{

epsilon = Convert.ToDouble(saiso.Text); a[0] = an;

ĐẠI HỌC HÙNG VƯƠNG

int i = 0;

while ((b[i] - a[i]) > epsilon)

{

c[i] = (a[i] + b[i]) / 2; if (tinhF(c[i]) == 0)

txtketqua.Text = c[i] + "là nghiệm của phương trình"; else if (tinhF(a[i]) * tinhF(c[i]) < 0)

{

b[i + 1] = c[i]; a[i + 1] = a[i]; c[i + 1] = c[i];

eps1[i + 1] = (c[i] - a[i]);

txtketqua.Text = " Nghiệm của phương trình x= " + c[i] + " sai số với lần lặp n = " + lanlap + " là: " + eps1[i + 1].ToString();

} else { a[i + 1] = c[i]; b[i + 1] = b[i]; c[i + 1] = c[i];

eps1[i + 1] = (c[i] - a[i]);

txtketqua.Text = " Nghiệm của phương trình x= " + c[i] + " sai số với lần lặp n = " + lanlap + " là: " + eps1[i + 1].ToString(); } i = i + 1; } } else {

txtketqua.Text = "[" + an + "," + bn + "]" + " Không phải là khoảng phân li cuả phương trình";

} }

Phụ lục B: Mã code C# tìm nghiệm theo phương pháp NewTon.

private double[] x0 = new double[16]; private double[] x1 = new double[16]; private double[] a = new double[16]; private double[] b = new double[16]; private double[] fx = new double[16]; private double[] eps = new double[16]; private double[] eps1 = new double[16];

private double[] x00 = new double[16];//mảng dùng để làm tron giá trị x1[]

double an, bn,m, lanlap, epsilon;//,x0,x1;// lanlap=lần lặp

private void thuattoan() {

an = Convert.ToDouble(canduoiA.Text); bn = Convert.ToDouble(cantrenb.Text); int i = 0;

double m;

if (Math.Abs(DaoHamCap1F(an)) < Math.Abs(DaoHamCap1F(bn)))

// m trụy tuyệt đối đạo hàm cấp I của a hoặc b

m = Math.Abs(DaoHamCap1F(bn)); else m = Math.Abs(DaoHamCap1F(an)); if (tinhF(an)*tinhF(bn)<0)

{

lanlap = Convert.ToDouble(calcEdit_n.Text);

if ((tinhF(an) * DaoHamCap2F(an) > 0) && (DaoHamCap1F(an) * DaoHamCap1F(bn) > 0) && (DaoHamCap2F(an) * DaoHamCap2F(bn) > 0))// điều kiện chọn x0=a

ĐẠI HỌC HÙNG VƯƠNG { x1[0] = an; i = 1; do {

x1[i] = x1[i-1] - tinhF(x1[i-1]) / DaoHamCap1F(x1[i-1]); x1[i-1] = x1[i];

fx[i-1] = tinhF(x1[i-1]);

eps[i-1] = Math.Round(Math.Abs(fx[i-1]) / m, 5); i++;

} while (i <= lanlap);

txtketqua.Text = " Nghiệm của phương trình là " + Math.Round(x1[i-1], 9) + " +/- " + eps[i-1].ToString();

}

else if ((tinhF(bn) * DaoHamCap2F(bn) > 0) && (DaoHamCap1F(an) * DaoHamCap1F(bn) > 0) && (DaoHamCap2F(an) * DaoHamCap2F(bn) > 0))

// điều kiện chọn xo=bn

{

x1[0] = bn; i = 1; do {

x1[i] = x1[i - 1] - tinhF(x1[i - 1]) / DaoHamCap1F(x1[i - 1]); x1[i - 1] = x1[i];

fx[i - 1] = tinhF(x1[i - 1]);

eps[i - 1] = Math.Round(Math.Abs(fx[i - 1]) / m, 5); i++;

} while (i <= lanlap);

txtketqua.Text = " Nghiệm của phương trình là " + Math.Round(x1[i - 1], 9) + " +/- " + eps[i - 1].ToString();

}

else

txtketqua.Text = "Không thỏa mãn"; }

else

txtketqua.Text = "[" + an + "," + bn + "]" + " Không phải là khoảng phân li cuả phương trình";

}

private void TTEpsilon() {

an = Convert.ToDouble(canduoiA.Text); bn = Convert.ToDouble(cantrenb.Text); if (tinhF(an) * tinhF(bn) < 0)

{

epsilon = Convert.ToDouble(saiso.Text); a[0] = an;

b[0] = bn; int i = 0;

// tìm khoảng phân li nghiệm [a,b] trong đó f' và f" không đổi dấu

if (tinhF(a[i]) * DaoHamCap2F(a[i]) > 0 && (DaoHamCap1F(a[i]) * DaoHamCap1F(bn)) > 0 && (DaoHamCap2F(an) * DaoHamCap2F(bn)) > 0)

//điều kiện chọn x0=an là f(x)* f"(x)>0 khi đó f' và f" không đổi dấu

{

x0[i] = a[i];

x1[i] = x0[i] - (tinhF(x0[i]) / DaoHamCap1F(x0[i])); x1[i + 1] = x1[i]; while (x1[i]-x0[i]>epsilon) { if (DaoHamCap1F(x0[i])<DaoHamCap1F(x1[i])) { m = DaoHamCap1F(x0[i]);

ĐẠI HỌC HÙNG VƯƠNG

txtketqua.Text = " Nghiệm của phương trình là: " + x1[i] + " Sai số: " + (Math.Abs(eps[i+1])).ToString(); } else { m = DaoHamCap1F(x1[i]);

txtketqua.Text = " Nghiệm của phương trình là: " + x1[i] + " Sai số: " + (Math.Abs(eps[i+1])).ToString();

}

x0[i+1] = x1[i]; } }

else if (tinhF(b[i]) * DaoHamCap2F(b[i]) > 0 && (DaoHamCap1F(a[i]) * DaoHamCap1F(b[i])) > 0 && (DaoHamCap2F(a[i]) * DaoHamCap2F(b[i])) > 0)

// điều kiện chọn x0=bn;

{

x0[i] = b[i];

x1[i] = x0[i] - (tinhF(x0[i]) / DaoHamCap1F(x0[i])); x1[i+1]=x1[i];

while (x1[i]-x0[i] > epsilon) {

if (DaoHamCap1F(x0[i]) < DaoHamCap1F(x1[i])) {

m = DaoHamCap1F(x0[i]);

eps[i + 1] = tinhF(x1[i]) / DaoHamCap1F(x0[i]);

txtketqua.Text = " Nghiệm của phương trình là: " + x1[i] + " Sai số: " + (Math.Abs(eps[i+1])).ToString();

} else {

m = DaoHamCap1F(x1[i]);

txtketqua.Text = " Nghiệm của phương trình là: " + x1[i] + " Sai số: " + (Math.Abs(eps[i+1])).ToString();

}

x0[i+1] = x1[i]; }

} else

txtketqua.Text = " Không thỏa mãn"; }

else

txtketqua.Text = "[" + an + "," + bn + "]" + " Không phải là khoảng phân li cuả phương trình";

}

Phụ lục C: Mã code C# tìm nghiệm theo phương pháp dây cung.

private double[] x1 = new double[16]; private double[] a = new double[16]; private double[] b = new double[16]; private double[] fx = new double[16]; private double[] eps = new double[16]; private double[] eps1 = new double[16];

private double[] x0 = new double[16];//mảng dùng để làm tròn giá trị x[]

double an, bn, m, lanlap, epsilon;// lanlap=lần lặp

private void ttEpsilon() {

ĐẠI HỌC HÙNG VƯƠNG

double m;

an = Convert.ToDouble(canduoiA.Text); bn = Convert.ToDouble(cantrenb.Text);

if (Math.Abs(DaoHamCap1F(an)) < Math.Abs(DaoHamCap1F(bn))) m = Math.Abs(DaoHamCap1F(bn));

else m = Math.Abs(DaoHamCap1F(an)); if (tinhF(an) * tinhF(bn) < 0) {

epsilon = Convert.ToDouble(saiso.Text); a[0] = an;

b[0] = bn; x1[0] = an; i = 1;

while ((b[i] - a[i]) > epsilon) {

// Công thức tính nghiệm theo pp dây cung

x1[i] = (a[i-1] * tinhF(b[i-1]) - b[i-1] * tinhF(a[i-1])) / (tinhF(b[i-1]) - tinhF(a[i-1]));

if (tinhF(x1[i]) * tinhF(a[i-1]) < 0)// điều kiện chọn b = x1

{ b[i] = x1[i]; a[i] = a[i-1]; } else { a[i] = x1[i];// chọn a = x1 b[i] = b[i-1]; } fx[i] = tinhF(x1[i]);

eps1[i] = Math.Round(Math.Abs(fx[i]) / m, 5); i=i+1;

}

txtketqua.Text = "Nghiệm của phương trình là: " +

Math.Round(x1[i-1], 3) + " Sai số: " + (Math.Abs(eps1[i-1])).ToString(); }

else

txtketqua.Text = "[" + an + "," + bn + "]" + " Không phải là khoảng phân li cuả phương trình.";

}

private void thuattoan() { int i = 0; double m;

an = Convert.ToDouble(canduoiA.Text); bn = Convert.ToDouble(cantrenb.Text);

if (Math.Abs(DaoHamCap1F(an)) < Math.Abs(DaoHamCap1F(bn)))// m trụy tuyệt đối đạo hàm cấp I của a hoặc b

m = Math.Abs(DaoHamCap1F(bn)); else m = Math.Abs(DaoHamCap1F(an)); if (tinhF(an) * tinhF(bn) < 0)

{ lanlap = Convert.ToDouble(calcEdit_n.Text); x1[0] = an;

i = 1; do

{ x1[i] = (an * tinhF(bn) - bn * tinhF(an)) / (tinhF(bn) - tinhF(an)); if (tinhF(x1[i]) * tinhF(an) < 0) { bn = x1[i]; } else an = x1[i]; }

ĐẠI HỌC HÙNG VƯƠNG

fx[i] = tinhF(x1[i]);

eps[i] = Math.Round(Math.Abs(fx[i]) / m, 5); i++;

} while (i <= lanlap); txtketqua.Text = "Nghiệm của pt la: " + Math.Round(x1[i-1], 3) + " Sai số: " + (Math.Abs(eps[i-1])).ToString() ; }

else txtketqua.Text = "[" + an + "," + bn + "]" + " Không phải là khoảng phân li cuả pt"; }

Phụ lục D: Mã code C# tìm nghiệm theo phương pháp Gauss. int u = 0; private double[,] a; private int i, j, k; private double c, sum = 0; private double[] x = new double[20]; private int sohang; void PPGauss() {

for (j = 0; j < sohang; j++) //Vòng lặp để tạo ra các mtrận tam giác trên {

for (i = 0; i < sohang; i++) { if (i > j) { c = a[i, j] / a[j, j]; // c = a[i,j] / a[j,j]; for (k = 0; k <= sohang; k++) {

a[i, k] = a[i, k] - c * a[j, k]; }

}

}

}

x[sohang - 1] = a[sohang - 1, sohang] / a[sohang - 1, sohang - 1]; //Vòng lặp này để thay thế ngược for (i = sohang - 2; i >= 0; i--)

{

sum = 0; for (j = i + 1; j < sohang; j++) {

sum = sum + a[i, j] * x[j]; }

x[i] = (a[i, sohang] - sum) / a[i, i]; }

}

Phụ lục E: Mã code C# tìm nghiệm theo phương pháp lặp đơn. int u=0; private double[,] a;

private double sum,e,big,temp,relerror,epsilon; private int sohang,lanlap, itr,i,j,k;

ĐẠI HỌC HÙNG VƯƠNG

private double[] x; void TTlapDon()

{

epsilon = Convert.ToDouble(calcE_epsilon.Text); lanlap = Convert.ToInt32(calcE_lanlap.Text); for(i=0;i<sohang;i++)

x[i]=0;

for (itr = 0; itr < lanlap; itr++) {

big = 0;

for (i = 0; i < sohang; i++) {

sum = 0;

for (j = 0; j < sohang; j++) {

if (i != j)

sum = sum + a[i,j] * x[j]; }

temp = (a[i,sohang] - sum) / a[i,i]; relerror = Math.Abs((x[i] - temp) / temp); if (relerror > big) big = relerror; x[i] = temp; } } }

Một phần của tài liệu Xây dựng phần mềm hỗ trợ học phương pháp tính (Trang 62)

Tải bản đầy đủ (PDF)

(72 trang)