54
Lời nói đầu Lập trình tính toán trong Maple muốn trình bầy kiến thức lập trình ứng dụng. Sử dụng phần mềm toán học có sẵn cùng với ngôn ngữ của nó tạo ra những chương trình tính toán trong thực tế. Maple cũng là chương trình tính toán kí hiệu, bạn đọc có thể học được rất nhiều kiến thức nhờ Maple. Mặt khác người học cũng có thể tự mình tạo ra chương trình phục vụ cho mục đích của mình. Tài liệu phục vụ tự học và cũng là tài liệu giảng về môn "Lập trình tính toán". Phần lí thuyết được trình bày thông qua ngay trên câu lệnh của Maple và là các mẫu để người học theo đó mà làm các chương trình khác. Phần lớn bài tập là các dự án dành cho người học tự làm và đều có mẫu kết quả cuối cùng để người lập trình định hướng. Hà Nội, ngày 8 tháng 8 năm 2007 Nguyễn Hữu Điển Mục lục Lời nói đầu ......................... 3 Mục lục ........................... 4 1 Giới thiệu lập trình tính toán trong maple 7 1.1 Chương trình đơn giản ................. 7 1.2 Những câu lệnh có điều kiện .............. 15 1.3 Vòng lặp với câu lệnh do ................ 22 1.3.1 Cấu trúc for - do ................ 22 1.3.2 Giới thiệu mảng đơn giản ........... 24 1.3.3 Phép lặp .................... 26 1.3.4 Tính tổng .................... 28 1.4 Bài tập ......................... 31 2 Các phép lặp 39 2.1 Phương pháp nhát cắt vàng và chia đôi ....... 39 2.1.1 Giới thiệu nhát cắt vàng ............ 39 2.1.2 Phương pháp nhát cắt vàng .......... 42 2.1.3 Vòng lặp while-do ............... 47 2.1.4 Phương pháp chia đôi ............. 47

Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

  • Upload
    lethuy

  • View
    227

  • Download
    7

Embed Size (px)

Citation preview

Page 1: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

Lời nói đầu

Lập trình tính toán trong Maple muốn trình bầy kiến thức lậptrình ứng dụng. Sử dụng phần mềm toán học có sẵn cùng với ngônngữ của nó tạo ra những chương trình tính toán trong thực tế. Maplecũng là chương trình tính toán kí hiệu, bạn đọc có thể học được rấtnhiều kiến thức nhờ Maple. Mặt khác người học cũng có thể tự mìnhtạo ra chương trình phục vụ cho mục đích của mình. Tài liệu phụcvụ tự học và cũng là tài liệu giảng về môn "Lập trình tính toán".

Phần lí thuyết được trình bày thông qua ngay trên câu lệnh củaMaple và là các mẫu để người học theo đó mà làm các chương trìnhkhác. Phần lớn bài tập là các dự án dành cho người học tự làm vàđều có mẫu kết quả cuối cùng để người lập trình định hướng.

Hà Nội, ngày 8 tháng 8 năm 2007

Nguyễn Hữu Điển

Mục lục

Lời nói đầu . . . . . . . . . . . . . . . . . . . . . . . . . 3

Mục lục . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

1 Giới thiệu lập trình tính toán trong maple 7

1.1 Chương trình đơn giản . . . . . . . . . . . . . . . . . 7

1.2 Những câu lệnh có điều kiện . . . . . . . . . . . . . . 15

1.3 Vòng lặp với câu lệnh do . . . . . . . . . . . . . . . . 22

1.3.1 Cấu trúc for - do . . . . . . . . . . . . . . . . 22

1.3.2 Giới thiệu mảng đơn giản . . . . . . . . . . . 24

1.3.3 Phép lặp . . . . . . . . . . . . . . . . . . . . 26

1.3.4 Tính tổng . . . . . . . . . . . . . . . . . . . . 28

1.4 Bài tập . . . . . . . . . . . . . . . . . . . . . . . . . 31

2 Các phép lặp 39

2.1 Phương pháp nhát cắt vàng và chia đôi . . . . . . . 39

2.1.1 Giới thiệu nhát cắt vàng . . . . . . . . . . . . 39

2.1.2 Phương pháp nhát cắt vàng . . . . . . . . . . 42

2.1.3 Vòng lặp while-do . . . . . . . . . . . . . . . 47

2.1.4 Phương pháp chia đôi . . . . . . . . . . . . . 47

Page 2: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

MỤC LỤC 5

2.2 Phương pháp New tơn và các phương pháp lặp khác 48

2.3 Bài tập . . . . . . . . . . . . . . . . . . . . . . . . . 54

3 Mảng trong Maple 58

3.1 Định nghĩa mảng và sử dụng nó . . . . . . . . . . . . 58

3.1.1 Sử dụng mảng . . . . . . . . . . . . . . . . . 58

3.1.2 Lệnh seq . . . . . . . . . . . . . . . . . . . . . 59

3.1.3 Giá trị ban đầu của mảng . . . . . . . . . . . 60

3.1.4 Các phần tử của mảng . . . . . . . . . . . . . 60

3.1.5 Ví dụ mảng các số nguyên tố . . . . . . . . . 61

3.1.6 Ví dụ xác định phần tử cực đại của một mảng 63

3.2 Một số độ đo thống kê . . . . . . . . . . . . . . . . . 64

3.2.1 Miền giá trị . . . . . . . . . . . . . . . . . . . 64

3.2.2 Sắp xếp . . . . . . . . . . . . . . . . . . . . . 66

3.3 Phương pháp sàng . . . . . . . . . . . . . . . . . . . 68

3.3.1 Ví dụ về tìm số nguyên tố bằng phương phápsàng . . . . . . . . . . . . . . . . . . . . . . . 69

3.3.2 Ví dụ về những số Ulam đẹp . . . . . . . . . 71

3.4 Một số dự án về mảng . . . . . . . . . . . . . . . . . 73

3.4.1 Tam giác Pascal . . . . . . . . . . . . . . . . 73

3.4.2 Giá trị trung bình . . . . . . . . . . . . . . . 75

3.5 Bài tập . . . . . . . . . . . . . . . . . . . . . . . . . 76

4 Mô phỏng xác suất 83

4.1 Khai báo loại dữ liệu cho đối số chương trình . . . . 83

4.2 Thử nghiệm xắc suất . . . . . . . . . . . . . . . . . . 85

4.2.1 Giới thiệu . . . . . . . . . . . . . . . . . . . . 85

4.2.2 Sinh số thực ngẫu nhiên . . . . . . . . . . . . 86

6 MỤC LỤC

4.2.3 Sinh số nguyên ngẫu nhiên trong một khoảngnào đó . . . . . . . . . . . . . . . . . . . . . . 86

4.2.4 Ví dụ rút có trả lại . . . . . . . . . . . . . . . 87

4.2.5 Ví dụ rút ba quả bóng không trả lại . . . . . 88

4.2.6 Ví dụ về tính xấp xỉ của xác suất . . . . . . . 89

4.2.7 Ví dụ hai điểm trong hình vuông có khoảngcách nhỏ hơn một . . . . . . . . . . . . . . . 91

4.3 Trò chơi quân bài . . . . . . . . . . . . . . . . . . . . 93

4.3.1 Chương trình rút ngẫu nhiên k quân bài . . . 93

4.3.2 Ví dụ tính xác xuất rút k quân bài có ít nhấtmột quân át . . . . . . . . . . . . . . . . . . . 95

4.3.3 Ví dụ tính xác xuất rút k quân bài có đúngmột quân át . . . . . . . . . . . . . . . . . . . 99

4.4 Một số ví dụ về mô phỏng xác suất . . . . . . . . . . 100

4.4.1 Kiểm tra nhiễm HIV . . . . . . . . . . . . . . 100

4.4.2 Xác suất những người cô đơn trong một nhóm 102

4.5 Bài tập . . . . . . . . . . . . . . . . . . . . . . . . . 104

5 Hệ phương trình đơn giản 105

5.1 Giải phương trình . . . . . . . . . . . . . . . . . . . 105

5.1.1 Lệnh của Maple . . . . . . . . . . . . . . . . 105

5.2 Ví dụ về bài toán hỗn hợp phần trăm . . . . . . . . 107

5.3 Đường thẳng sát nhất . . . . . . . . . . . . . . . . . 108

Danh mục từ khóa . . . . . . . . . . . . . . . . . . . . 110

Page 3: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

Chương 1

GIỚI THIỆU LẬPTRÌNH TÍNH TOÁNTRONG MAPLE

1.1 Chương trình đơn giản . . . . . . . . . . . 71.2 Những câu lệnh có điều kiện . . . . . . . . 151.3 Vòng lặp với câu lệnh do . . . . . . . . . . 221.4 Bài tập . . . . . . . . . . . . . . . . . . . . . 31

1.1 Chương trình đơn giản

Một bài toán tính toán thường có ba phần sau:

1. Dữ liệu để tính toán;

2. Phương pháp tính toán;

8 Giới thiệu lập trình tính toán trong maple

3. Kết quả tính toán.

Ví dụ sau đây chỉ ra cách thức các công việc tính toán cần phảilàm gì: Ta biết đã có công thức tính thể tích hình trụ bằng diện tíchđáy nhân với chiều cao. Nếu ta có hình trụ tròn diện tích đáy là mộthình tròn có bán kính r, thì diện tích đấy được tính bằng công thứcπr2.

Để tính thể tích một hình trụ tròn có bán kính đáy bằng r vàchiều cao h, ta có:

1. Dữ liệu: r và h;

2. Phương pháp tính:

Bước 1. Tính diện tích đáy s = πr2,

Bước 2. Tính thể tích v = s × h,

3. Kết quả: Thể tích v = πr2h.

Một chương trình máy tính thực hiện phương pháp tính toánnhư một nhiệm vụ chính. Nó khởi đầu là nhận dữ liệu vào người tathường gọi là đầu vào, sau đó thực hiện phương pháp tính và chuyểnkết quả ra, người ta gọi là đầu ra. Một chương trình được coi nhưlà một hộp đen đối với người dùng và người sử dụng theo quy trình:Họ đưa dữ liệu vào và chạy chương trình, khi đó nhìn ra kết quả.

Ta có thể viết chương trình trên bằng một trang Maple. Để viếtchương trình trong maple có nhiều dòng , khi xuống dòng nhấn[Shift]+[Enter]. Để Maple không báo lỗi thì ta gõ chú thích sau dấukết thúc lệnh ;.

# Định nghĩa chương trình> cylinder_volume:=proc(radius,height)

local base_area, volume; # biến địa phươngbase_area:=Pi*radius^2; # Thực hiện thuật toánvolume:=evalf(base_area*height);print(’The volume’, volume); # kết quả đưa ra

end;

Page 4: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

1.1 Chương trình đơn giản 9

c y l i nde r −volume := proc ( radius , h e i g h t )loca l base−area , volume ;

base−area := t t x ra fa2 ;volume := e v a l f ( base_area x h e i g h t ) ;print ( ’ t he volume ’ , volume )

end

Tên của chương trình ta đặt là cylindervolume, nó nhận hai đối sốnhư là dữ liệu vào là radius và height. Các biên địa phương (nghĩa làcác biến chỉ dùng trong chương trình này) là base_area và volume

được định nghĩa. Khi đó tính toán lấy các giá trị của base_area vàvolume để tính. Cuối cùng kết quả được in ra bằng lệnh print.

Giả sử ta có bán kính r = 5.5m và chiều cao là h = 8.2m Tachạy chương trình trong môi trường Maple:> r:=5.5; h:=8.2;

r := 5.5

h := 8.2

> cylinder_volume(r,h);Thevolume, 779.2720578

Chương trình được thiết kế dùng đi dùng lại nhiều lần. Mỗi lầndùng nó ta cần phải cung cấp dữ liệu đầu vào theo nguyên tắc củachương trình. Trong ví dụ của ta thì phải cung cấp bán kính trướcvà chiều cao sau.

Với bán kính 3 ft và chiều cao 2 ft:> cylinder_volume(3,2);

The volume, 56.54866777Khi thứ tự ngược lại thì kết quả sẽ khác> cylinder_volume(2,3);

The volume, 37.69911185

Tóm lại một chương trình Maple gồm các thành phần sau đây:

1. Mệnh đề định nghĩa chương trình dưới dạng

10 Giới thiệu lập trình tính toán trong maple

program−name:=proc(argument_list)

Người dùng sẽ dùng tên chương trình program−name để chạychương trình. Danh sách biến được liệt kê trong argument_list.Chú ý kết thúc dòng lệnh khai báo chương trình không dùngdấu ;.

2. Khai báo biến địa phương dưới dạng

local variable_list ;

Khai báo này là một phần của các mệnh đề định nghĩa chươngtrình.

3. Những mệnh đề của chương trình Maple là phương pháp tínhtoán sử dụng các đối số như dữ liệu đầu vào.

4. Cơ chế đầu ra, nhiều khi chỉ đơn giản là câu lệnh in ra.

5. Câu lệnh kết thúc, thường riêng một dòng end;

6. Câu chú thích: Bao giờ cũng bắt đầu bằng kí tự #, phần câusau dấu này chỉ là chú thích của chương trình và không có ảnhhưởng gì đến thực hiện chương trình.

Mặc dù ta gõ trực tiếp chương trình vào trong trang Maple, nhưngta có thể tách quá trình lập trình bốn bước: (1) soạn chương trình,(2) gọi chương trình vào, (3) chạy thử và sửa lỗi chương trình, (4)thực hiện chương trình.

1. Soạn thảo chương trình: Ta có thể soạn chương trình trong mộttệp riêng, chú ý bằng một chương trình không có kí tự điềukhiển như tệp "file.txt" trong chương trình notepad.exe và ghilại chương trình với tên và phần mở rộng như: tinhthetich.mwslà tệp của Maple.

2. Gọi chương trình vào: Trong Maple tại dấu con trỏ >, gõ vào

Page 5: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

1.1 Chương trình đơn giản 11

read (‘c:/hocmaple/tinhthetich . txt ‘);

Maple bắt đầu đọc tệp văn bản vào, nếu có sai sót Maple sẽthông báo. Ngược lại chương trình sẽ được gọi vào. Chú ý dấu‘ được lấy ở phím cao nhất bên trái trong bàn phím.

3. Chạy thử và sửa chữa chương trình: Nếu Maple thông báo lỗihoặc ta phát hiện kết quả chạy chương trình sai. Ta phải quaylại chương trình Notepad để sửa chương trình chính.

4. Chạy chương trình: Gõ tên chương trình và các dữa liệu vàođối số để thực hiện chương trình.

Ví dụ 1. Giá trị tương lai của tiền trợ cấp: Giả sử ta đóng tiềntiết kiệm cho một chu kì năm $R vào tài khoản trả với lãi xuất i

cho chu kì này, khi đó giá trị được nhận được $S trong tài khoảnsau n chu kì (năm) sẽ là

S =R((1 + i)n − 1)

i.

Hãy viết chương trình tính giá trị cho kế hoạch về hưu nếu kế hoạchtrả tiền lãi năm là A, đòi hỏi thu nhập mỗi tháng phải đóng vào$R, trong y năm. Sau đó dùng chương trình tính giá trị tiền trongtương lai nếu mỗi tháng đóng vào là $300, tiền lãi theo năm là 12%trong 30 năm.

Solution. Trước tiên thấy tính toán cần các đại lượng được đưavào

R là tiền gửi

A tiền lãi hàng năm

n là số năm cần tính.

Ta gõ chương trình sau đây vào tệp future.txt:

# Chương trình tính giá trị thu nhập khi về hưu# Input: R: Tiền nộp hàng tháng (\$)

12 Giới thiệu lập trình tính toán trong maple

# A: Lãi suất hàng năm (.12 với 12\%)# y: Số nămfuture:=proc(R,A,y) # Đặt tên chương trình "future"

# và đối số R, I, ylocal i, n, S; # định nghĩa biến địa phươngi:=A/12; # lãi xuất hàng tháng

# 1/12 của lãi xuất nămn:=y*12; # tổng số thángS:=R*((l+i)\symbol{94}n-l)/i; # tính tiền hưuprint(’The future value’, S); # print ra kết quả

end; # dòng kết thúc chương trình

Bây giờ ta đọc chương trình vào Maple

> read(’a:future.txt’);future := proc(R, A, y)local i, n, S;

i := 1/12 × A;n := 12 × y;S := R × (A + i)n − 1)/i);print(’The future value’, S)

end

Nhập đầu vào:>Deposit:=300; AnnualRate:=0.12; Years:=30;

Deposit := 300AnnualRate := .12

Years := 30Bây giờ ta có thể chạy chương trình đã xác định ở trên. Chú ý cácđối số R,A, y là các biến được thay thế bởi các biến mang dữ liệu.> future(Deposit,AnnualRate,Years);

The future value, .1048489240107

Hoặc ta có thể đưa trực tiếp đối số bằng số> future(300, .12, 30);

The future value, .1048489240107

Ví dụ 2. Lập một chương trình tính hai nghiệm của phương trìnhbậc hai tổng quát ax2 + bx + c = 0 bằng công thức nghiệm tổng

Page 6: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

1.1 Chương trình đơn giản 13

quát. Dùng chương trình này để giải

3x2 − 5x + 2 = 0 và x2 − 3x + 2 = 0.

Lời giải. Nhập các dòng lệnh sau đây

> quad:=proc(a,b,c) # Đặt tên chương trình "quad"# with arguments a, b, c

local soil, sol2; # Định nghĩa biến địa phương# tính soil, sol2

soil:= (-b+sqrt (b^2-4*a*c ) ) / (2*a);sol2:=(-b-sqrt(b^2-4*a*c))/(2*a);print(‘The solutions‘,soil, sol2); # In ra kết quả

end; # Kết thúc chương trình

quad := proc ( a , b , c )loca l s o i l , s o l 2 ;s o i l := (−b + ‘ s q r t ‘ ( b^2 − 4∗a∗ c ) )/(2∗ a ) ;s o l 2 := (−b − ‘ s q r t ‘ ( b^2 − 4∗a∗ c ) )/(2∗ a ) ;print ( ‘ The s o l u t i o n s ‘ , s o i l , s o l 2 )

end proc

Để giải phương trình 3x2 − 5x + 2 = 0, ta chú ý rằng a = 3, b = −5

và c = 2:>quad(3,-5,2);

The solution,1, 23

Để giải phương trình x2 − 3x + 2 = 0:>a:=1; b:=-3; c:=2;

a := 1

b := −3

c := 2

>quad(a,b,c);The solution,2, 1

14 Giới thiệu lập trình tính toán trong maple

Ví dụ 3. Nguyên lí bị stress được cho bởi

Smax = A + B, Smin = A − B,

ở đây

A = E(1 − K)Q1 − Q2

2(1 − µ)

B =E(1 + k)

(Q1 − Q2)2 + (Q2 − Q3)2

2(1 + µ).

Hãy viết một chương trình với đầu vào E,µ,K,Q1, Q2, Q3 và in rakết quả stress. Với dữ liệu cụ thể

E µ K Q1 Q2 Q3

9.3 × 106 0.32 0.05 138 -56 786

Lời giải. Ta viết chương trình

>principal_stress:=proc(E, mu, K, Q1, Q2, Q3)local Smax, Smin, A, B;A:=E*(1-K)*(Ql+Q3)/(2*(1-mu));B:=E*(1+K)*sqrt((Q1-Q2)^2+(Q2-Q3)^2)/(2*(1-mu));print (‘Smax, Smin‘);print(A+B,A-B);

end;

s t r e s s := proc (E, mu, K, Q1, Q2, Q3)loca l Smax , Smin , A, B;A := E∗(1−K)∗ (Q1+Q3)/(2−2∗mu) ;B := E∗(1+K)∗ s q r t ( (Q1−Q2)^2+(Q2−Q3)^2)/(2−2∗mu) ;print (Smax , Smin ) ;print (A+B, A−B)

end proc

> stress(9.3*10^6, 0.32, 0.05, 138.0, -56.0, 786.0);Smax, Smin

1.220668212 × 1010,−2.01476241 × 108

Page 7: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

1.2 Những câu lệnh có điều kiện 15

1.2 Những câu lệnh có điều kiện

Ví dụ 1.1. Cho một hàm từng khúc

f(x) =

−(x − 1)2 + 2 x < 0,

2x + 1 0 ≤ x ≤ 2

5e(−(x−2)2) x > 2

Ta có thể tính được hàm bằng Maple

>func:=proc(x) # Định nghĩa hàm# Không có biến địa phương

if x< 0 then-(x-l)^2+2; # trường hợp x < 0

elif x<2 then2*x+l; # trường hợp 0 <= x <= 2

else5*exp(-(x-2)^2); # trường hợp x > 2

fi;end;

func := proc ( x )i f x < 0 then−x − l ^2 + 2

e l i f x < 2 then2∗x + l

else5∗ ‘ exp ‘(−x − 2^2)

end i fend proc

func(-3), func(1), func(3); −14, 3, 5e(−1)

Chú ý khi lập trình. Trên trang làm việc của Maple, kết quả đưara ngay màn hình không cần phải có lệnh print.

16 Giới thiệu lập trình tính toán trong maple

Một cấu trúc điều kiện if có thể có:

1. Các câu lệnh thực hiện nếu điều kiện đúng. Ngược lại, các câulệnh bị bỏ qua.

i f cond i t i on thens ta t ement sf i ;

2. Khả năng có thể xảy ra hai trường hợp, điều kiện có thể đúnghoặc sai

i f cond i t i on thens ta t ement s group1elses ta t ement s group2f i ;

Khi thực hiện Maple kiểm tra điều kiện nếu đúng thì làmnhóm lệnh 1, ngược lại thì làm nhóm lệnh 2.

3. Có thể xảy ra nhiều trường hợp với các điều kiện khác nhau

i f cond i t i on1 thens ta t ement s group1e l i f cond i t i on2 thens ta t ement s group2. . . . . . . . . .. . . . . . . .e l i f cond i t i on n thens ta t ement s group nelsef i n a l s ta t ement s groupf i ;

Page 8: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

1.2 Những câu lệnh có điều kiện 17

Maple kiểm tra lần lượt các điều kiện, nếu điều kiện nào đúngthì làm các câu lệnh nhóm đó. Trong trường hợp tất cả đềusai thì sẽ làm mệnh đề nhóm cuối cùng.

Chú ý.

• Không đặt dấu chấm phẩy sau lệnh then và else.

• Các tốt nhất trình bày if, then, else, elif, fi theo từng khối.

• Tất cả điều kiện cần được kiểm tra. Ví dụ Maple không kiểmtra nếu

√5 > 1 và sẽ thông báo lỗi "boolean error".

Ví dụ 1.2. Giả sử trong một khóa học nào đấy, sau năm lần thi đềuđạt 100 điểm, thì quy định các mức theo tỉ lệ: Loại A với 90% và caohơn, loại B v ới80-90%, loại C với 70-79,9%, loại D với 60-69,9%và loại F với 0-59,9%. Hãy viết một chương trình khi nhập vào sốđiểm thì in ra (1) điểm của toàn khóa, (2) thông báo gần đạt nếuđiểm chỉ còn thiếu 1% so với điểm bậc cao hơn tiếp theo.

Lời giải. Chương trình có dạng

>grade:=proc(points)if points >= 450 then

print(‘ A ‘);elif points >=400 then

print(‘ B ‘);if points >= 445 then print(‘borderline A‘); fi;

elif points >= 350 thenprint(‘ C ‘);if points > 395 then print(‘borderline B‘); fi;

elif points >= 300 then print(‘ D ‘);if points > 345 then print(‘borderline C‘); fi;

elseprint(‘ F ‘);

18 Giới thiệu lập trình tính toán trong maple

if points > 295 then print(‘borderline D‘); fi;fi;

end;

grade := proc ( p o i n t s )i f 450 <= po i n t s then print ( ‘ A ‘ )e l i f 400 <= po i n t s then print ( ‘ B ‘ ) ;

i f 445 <= po i n t s then print ( ‘ b o r d e r l i n e A‘ )end i f

e l i f 350 <= po i n t s then print ( ‘ C ‘ ) ;i f 395 < po i n t s then print ( ‘ b o r d e r l i n e B‘ )

end i fe l i f 300 <= po i n t s then print ( ‘ D ‘ ) ;

i f 345 < po i n t s then print ( ‘ b o r d e r l i n e C‘ )end i f

e lse print ( ‘ F ‘ ) ;i f 295 < po i n t s then print ( ‘ b o r d e r l i n e D‘ )

end i fend i f

end proc

> grade(367); C

> grade(397); C

borderlineB

> grade(310); D

Ví dụ 1.3. Giả sử ta đánh số quân bài trong bộ bài từ 1 đến 52,sao cho

hearts : 1− 13; spades : 14 − 26, diamonds : 27 − 39, clubs : 40 − 52

Trong mỗi một loại được đánh số theo thứ tự

ace, 2, 3, 4, 5, 6, 7, 8, 9, 10, jack, queen, king

Hãy viết một chương trình với việc đưa tên quân bài (ví dụ 3, spade,hoặc jack, diamond), in ra số quân bài tương ứng của quân bài.

Page 9: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

1.2 Những câu lệnh có điều kiện 19

Chú ý loại dữ liệu. Maple phân lớp thành các dạng khác nhau.Ta có thể chỉ ra loại numeric và string trong bài toán này. Quânbài giá trị 2, 3, ..., 10 là loại numeric. Dãy các kí tự nằm trong ‘ ‘gọi là chuỗi kí tự. Chuỗi kí tự không có giá trị mà nó là tên và cóhai giá trị đúng và sai. Ví dụ ’ace’, ‘jack‘, ‘queen‘ là các chuỗi kítự. Hàm type(expression, type name) sẽ trả về đúng, sai phụ thuộcvào biểu thức có tên loại nào.>type(3.5, string); false

>type(3.5, numeric); true

>type(queen, string); false

>type(‘queen‘, string); true

> Value:=6: type(Value,numeric);true

> a:="king": type(a,string); true

#Chương trình cho số quân bài từ 1-52#input: một giá trị trong#ace, 2, 3 10, jack, queen, king#tương ứng với day sau#"heart", "spade", "diamond", "club"#output: số của quân bài 1-52.>cardnum:=proc(value,suit)

local order, number, err;err:=false;if type(value,numeric) then

order:=value;elif type(value,string) then

if value="ace" thenorder:=1;

elif value="jack" thenorder:=11;

elif value="queen" thenorder:=12;

20 Giới thiệu lập trình tính toán trong maple

elif value="king" thenorder:=13;

elseprint("Err : wrong value for the first argument");err:=true

fielse

print("Err: wrong data type for first argument");err:=true;

fi;if suit="heart" then

number:=order;elif suit="spade" then

number:=13+order;elif suit="diamond" then

number:=26+order;elif suit="club" then

number:=39+order;else

print("Err: wrong value for the second argument");err:=true;

fi;if err=false then

print("The card number", number);fi;

end;

cardnum := proc ( va lue , s u i t )loca l order , number , e r r ;

e r r := f a l s e ;i f type ( va lue , numeric ) then

order := va l u ee l i f type ( va lue , s t r i n g ) then

Page 10: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

1.2 Những câu lệnh có điều kiện 21

i f va l u e = "ace " thenorder := 1

e l i f va l u e = " j ac k " thenorder := 11

e l i f va l u e = "queen" thenorder := 12

e l i f va l u e = " k ing " thenorder := 13

elseprint (" Err : wrong va l u e for t he f i r s t argument " ) ;e r r := t ru e

end i fe lse

print (" Err : wrong data type for f i r s t argument " ) ;e r r := t ru e

end i fi f s u i t = " hear t " then

number := ordere l i f s u i t = " spade " then

number := 13 + ordere l i f s u i t = "diamond " then

number := 26 + ordere l i f s u i t = " c l u b " then

number := 39 + orderelse

print (" Err : wrong va l u e for t he second argument " ) ;e r r := t ru e

end i fi f e rr = f a l s e then print ("The card number " , number ) end i f

end proc

> cardnumC,"diamond");The card number, 29> cardnum("king","club");

22 Giới thiệu lập trình tính toán trong maple

The card number, 52> cardnum(queen,club);Error : wrong data type for first argumentError : wrong value for the second argument> cardnum("queen","spade");The card number, 25

1.3 Vòng lặp với câu lệnh do

1.3.1 Cấu trúc for - do

Việc lặp lại một thao tác dẫn đến thiết kế vòng lặp. Nếu ta muốnbình phương một số nguyên i, i = 1, 2, ..., 10 và các câu lệnh sau đâygọi vòng lặp và làm được việc đó:

>for i from 1 to 10 doprint (i^2);

od;

149162536496481

100

Cấu trúc vòng lặp đơn giản là

for loop−i ndex from s t a r t −va l u e to l a s t −va l u e dob l o c k s ta t ement sod ;

Page 11: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

1.3 Vòng lặp với câu lệnh do 23

Nguyên tắc sử dụng vòng lặp này như sau:

1. loop−index là tên biên như là i, j.

2. start−value và last−value có thể là các số, tên biến chứa sốhoặc một biểu thức có kết quả là số như là 1, 10, k1, k2, 2∗n, ...Các số này là những số nguyên, nhưng số thập phân và phânsố cũng chấp nhận.

3. Vòng lặp thực hiện theo cách sau đây:

(a) Gán start−value vào loop−index,

(b) So sánh loop−index với last−value, nếu loop − index >

last − value thì nhảy ra ngoài vòng lặp sau lệnh od;. Ngượclại thì đi vào thân vòng lặp để thực hiện.

(c) Sau khi đã xác định được loop − index < last − value thìblock statements thực hiện.

(d) Thêm 1 vào loop−index và quay lại (b).

4. Không nên tự thay đổi giá trị của loop−index, hãy để chươngtrình tự thực hiện.

5. Nếu start−value=1, thì from start−value có thể bỏ qua, khiđó vòng lặp có dạng

for i to 10 doi ^2;od ;

6. Đừng đặt dấu chấm phảy sau lệnh do mà hãy đặt dấu chấmphảy hoặc hai chấm sau lệnh od.

7. Chỉ số loop−index mặc định bước là 1. Để có các bước khácđi ta thêm lệnh by như ví dụ

24 Giới thiệu lập trình tính toán trong maple

for i from 20 to 2 by −2 doi ^2;od ;

cho kết quả 202, 182, 162, ..., 42, 22.

Ví dụ 1.4. Vòng lặp sau đây tính giá trị của hàm sin x và cos x từ0 đến π với bước π

5 :

for t from 0 by evalf(Pi/5) to evalf(Pi) dos1:=evalf(sin(t));s2:=evalf(cos(t));

od;

s1 := 0.s2 := 1.

s1 := 0.5877852524s2 := 0.8090169943s1 := 0.9510565165s2 := 0.3090169938s1 := 0.9510565160s2 := −.3090169952s1 := 0.5877852514s2 := −.8090169950

1.3.2 Giới thiệu mảng đơn giản

Mảng dùng để chứa dữ liệu, ví dụ ta chia đoạn [0, 1] thành 100

đoạn nhỏ với độ dài bằng nhau 0.01 bằng các điểm (gọi nó là cácnốt).

x0 = 0, x1 = 0.01, x2 = 0.02, ..., x99 = 0.99, x100 = 1.00

Ta có thể dùng mảng để chứa các nốt này.

Page 12: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

1.3 Vòng lặp với câu lệnh do 25

1. Trước tiên mở một mảng rỗng>nod:=array(0..100);nod:=array(0..100,[])

2. Chứa dữ liệu vào các nốt bằng vòng lặp với mỗi i chứa dữ liệuvào nod[i]

> for i from 0 to 100 donod[i]:=i*0.01

od:

3. Có thể xem lại kết quả bằng lệnh seqseq(nod[i],i=0..100);

0 , . 01 , . 02 , . 03 , . 04 , . 05 , . 06 , . 07 , . 08 ,. 09 , . 10 , . 11 , . 12 , . 13 , . 14 , . 15 , . 16 , . 17 ,. 18 , . 19 , . 20 , . 21 , . 22 , . 23 , . 24 , . 25 , . 26 ,. 27 , . 28 , . 29 , . 30 , . 31 , . 32 , . 33 , . 34 , . 35 ,. 36 , . 37 , . 38 , . 39 , . 40 , . 41 , . 42 , . 43 , . 44 ,. 45 , . 46 , . 47 , . 48 , . 49 , . 50 , . 51 , . 52 , . 53 ,. 54 , . 55 , . 56 , . 57 , . 58 , . 59 , . 60 , . 61 , . 62 ,. 63 , . 64 , . 65 , . 66 , . 67 , . 68 , . 69 , . 70 , . 71 ,. 72 , . 73 , . 74 , . 75 , . 76 , . 77 , . 78 , . 79 , . 80 ,. 81 , . 82 , . 83 , . 84 , . 85 , . 86 , . 87 , . 88 , . 89 ,. 90 , . 91 , . 92 , . 93 , . 94 , . 95 , . 96 , . 97 , . 98 ,. 99 , 1 .00

4. Mỗi phần tử có thể chỉ ra giá trị của nó:nod[19];0.19nod[87];0.87

26 Giới thiệu lập trình tính toán trong maple

1.3.3 Phép lặp

Ví dụ 1.5. Viết chương trình liệt kê n số đầu tiên của dãy

xk =xk−1

2+

1

xk−1, x0 = 1, k = 1, 2, ..., n.

Dãy số này tiến dần tới√

2.

Lời giải. Chương trình đòi hỏi nhập vào số n.

#Chương trình sinh ra dãy số hội tụ tới căn 2#input n chỉ số cuối cùng của dãy>sqrt2:=proc(n)

local x, k;x:=array(0..n); # khai báo dãyx[0]:=l; # khởi đầu phần tử 0 của dãy# vòng lặp sinh ra phần tử dưfor k from 1 to n do

x[k]:=evalf( x[k-l]/2 + l/x[k-l] );od;print( seq( x[k], k=0..n ) ) # đầu ra

end;

s q r t 2 := proc (n)loca l x , k ;x := array (0 . . n ) ;x [ 0 ] := l ;for k to n dox [ k ] := e v a l f (1/2∗ x [ k− l ]+ l /x [ k− l ] )end do ;print ( seq ( x [ k ] , k = (0 . . n ) ) )

end proc

> sqrt2(10);1, 1.500000000, 1.416666667, 1.414215686, 1.414213562,

Page 13: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

1.3 Vòng lặp với câu lệnh do 27

1.414213562, 1.414213562, 1.414213562, 1.414213562, 1.414213562,1.414213562.

Ta thấy rằng dãy tiến dần tới√

2 rất nhanh.

Ví dụ 1.6. Viết chương trình sinh ra n số hạng của dãy Fibonacci

F0 = 1, F1 = 1, Fk = Fk−1 + Fk−2

với k = 2, 3, ..., n.

Lời giải.

#Chương trình sinh ra n số hạng đầu của dãy Fibonacci# đầu vào: n (n>=2 ).

> Fibonacci:=proc(n)local k, F;F:=array(0..n);F[0]:=0; F[l]:=1;for k from 2 to n do

F[k] :=F[k-l]+F[k-2]od;seq( F[k], k=0..n )

end;

Fibonacc i := proc (n)loca l k , F ;

F := array (0 . . n ) ;F [ 0 ] := 0 ;F [ l ] := 1 ;for k from 2 to n do

F[ k ] := F [ k − l ] + F [ k − 2 ]end doseq (F [ k ] , k = (0 . . n ) )

end proc

28 Giới thiệu lập trình tính toán trong maple

> Fibonacci(30);0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597,2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418,317811, 514229, 832040.

1.3.4 Tính tổng

Ví dụ 1.7. Viết chương trình tính tổng bình phương của n số lẻđầu tiên trong dãy số nguyên dương. Nghĩa là tính tổng

12, 32, 52, ..., n2.

Lời giải 1. Phân tích: Số lẻ đầu tiên là 1. Nếu số k là lẻ thì số lẻtiếp theo là k + 2:

#Chương trình tính tổng n số lẻ nguyên dương#Đầu vào: n#Đầu ra : tổng.>oddsuml:=proc(n)

local i, oddnum, s;s:=0; # Khởi tạo tổngoddnum:=l; # Khởi tạo số lẻ đầu tiênfor i from 1 to n do

s:=s+oddnum^2; # tính tổng cộng thêm phần tử mớioddnum:=oddnum+2; # chuẩn bị số lẻ sau

od;print("The sum is", s);

end;

oddsuml := proc (n)loca l i , oddnum , s ;s := 0 ;oddnum := l ;for i to n do

Page 14: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

1.3 Vòng lặp với câu lệnh do 29

s := s+oddnum^2;oddnum := oddnum+2

end do ;print ("The sum i s " , s )

end proc

Lời giải 2. Phân tích: các số lẻ biểu diễn như

2k − 1, k = 1, 2, ...

#Chương trình tính tổng n số lẻ nguyên dương#Đầu vào: n#Đầu ra : tổng.>oddsum2:=proc(n)

local k, s;s:=0;for k from 1 to n do

s:=s+(2*k-l)^2;od;print("The sum is", s);

end;

oddsum2 := proc (n)loca l k , s ;s := 0 ;for k to n do

s := s+(2∗k− l )^2end do ;print ("The sum i s " , s )

end proc

Cấu trúc chương trình cộng n phần tử thường là

s:=0;for* from 1 to n do

30 Giới thiệu lập trình tính toán trong maple

{Chuẩn bị phần tử mới}s:=s+{phần tử mới}

od;

s:=s+{the new term} là mấu chốt của tính toán tổng, vì mỗi lần

lặp lấy giá trị tổng cũ cộng với một phần tử mới thêm vào. Ứngdụng điều này ta xét ví dụ

Ví dụ 1.8. Hàm số sin có thể tính bằng công thức

sin(x) =x

1!− x3

3!+

x5

5!− x7

7!+

x9

9!− x11

11!+ · · ·

Viết chương trình đầu vào là x và n, xấp xỉ hàm sin tại x bằng cáchtính tổng n số hạng đầu tiên.

Lời giải. Các số hạng có dạng xk

k! với k là số lẻ và chuyển dấu +/−.

#Chương trình tính hàm sine dùng công thức Taylor#Đầu vào: x, n,#Đầu ra: giá trị xấp xỉ của sin(x)>sine:=proc(x,n)

local i, s, k, sgn;s:=0;k:=1;sgn:=1;for i from 1 to n do

s:=s + sgn*x^k/k!;sgn:=-sgn;k:=k+2;

od;print("The sine function", s); # đầu ra

end;

Page 15: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

1.4 Bài tập 31

s i n e := proc ( x , n)loca l i , s , k , sgn ;s := 0 ; k := 1;sgn := 1;for i to n do

s := s+sgn ∗x^k/ f a c t o r i a l ( k ) ;sgn := −sgn ;k := k+2

end do ;print ("The s i n e f unc t i on " , s )

end proc

> x:=evalf(Pi/6);x := .5235987758> sine(x,3);The sine function, .5000021328> sine(x,4);The sine function, .4999999921> sine(x,5);The sine function, .5000000003Dùng chương trình đã dựng sẵn> sin(x);The sine function, .5000000002

1.4 Bài tập

Bài tập 1.1. (Bài toán thế chấp) Cho $ A là số tiền tài khoản thếchấp, n là tổng số phải trả, i là lãi suất trong chu kì phải trả. Khiđó tiền phải trả cho chu kì $ R được cho theo công thức

R =Ai

1 − (1 + i)(−n).

32 Giới thiệu lập trình tính toán trong maple

• Hãy viết chương trình, với đầu vào p, r, y, d giá mua, lãi suấthàng năm, số năm và vận tốc trả thấp tương ứng, hãy tính vàin ra số tiền trả hàng tháng.

• Dùng chương trình để tính tiền trả hàng tháng mua ngôi nhà$180,000, giảm dần 20%, 7,75% lãi suất hàng năm trong vòng30 năm.

• Dùng chương trình để tính tiền trả hàng tháng mua xe ô tô$15,000, giảm dần 10%, 9,25% lãi suất hàng năm trong vòng5 năm.

Kết quả mẫu chạy chương trình:

> price:=180000: down:=20: rate:=7.75: year:=30:> mortgage(price,rate,year,down);

The monthly payment i s 1031.633646

Bài tập 1.2. Hãy viết chương trình hiện lên kích thước bán kính,chu vi và diện tích hình tròn khi ta cho đường kính của nó.

Kết quả mẫu như sau:

> diameter:=10:> circle(diameter);

The rad i u s : , 5 . 0The c i rcumfe rence : , 31.41592654The area : , 78.53981635

Bài tập 1.3. Có ba tụ điện được nối song song R1, R2 và R3, điệntrở chung R được cho bởi công thức

1

R=

1

R1+

1

R2+

1

R3.

Page 16: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

1.4 Bài tập 33

Hãy viết một chương trình tính R.

Kết quả mẫu chạy chương trình:

> Rl:=20: R2:=50: R3:=100:> resistor(Rl,R2,R3);

The combined r e s i s t a n c e i s 12.50000000

Bài tập 1.4. Sự căng thẳng cực đại được tính bằng công thức

δmax =

P

1 + ec

r2 cos

(

L

√P

AE

2r

)

A

với các đại lượng ở bảng dưới đây.

Hãy viết chương trình tính và in ra căng thẳng cực đại. Dùngchương trình để tính với các mẫu đầu vào dưới đây.

P A e c r L E4000 29.55 16.6 5.56 4.68 120 3.0×107

Bài tập 1.5. Viết chương trình đưa vào một số và xác định tươngứng tên quân bài (tham khảo ví dụ về in quân bài).

Kết quả mẫu:> numcard(l);

ace, heart> numcard(25);

queen, spade> numcard(30);

4, diamond> numcard(0);

Error : the input must be 1 − 52> numcard(55);

34 Giới thiệu lập trình tính toán trong maple

Error : the input must be 1 − 52> numcard(45);

6, club

Bài tập 1.6. (Tính giá) Một công ty nhỏ muốn đặt kế hoạch thuêxe: $20.00 một ngày cộng với $0.10/1 cây số đến 200 cây số mộtngày. Không cộng thêm giá cho ngày nếu lớn hơn 200 cây số (nghĩalà 3 ngày 500 cây số giá $110.00 khi mà 3 ngày với 800 cây số thìgiá chỉ $120.00). Hãy viết chương trình đầu vào số ngày và tổng sốcây số đi được, kết quả ra giá tổng phải trả thuê.

Bài tập 1.7. Một hãng du lịch chào giá cho kế hoạch đi Las Vegas.Một người đi giá $400. Nếu người du lịch có người đi cùng thì mỗingười đi cùng được giảm giá 10%. Một nhóm 10 người hoặc lớn hơnthì được giảm 15% cho mỗi người. Viết chương trình đầu vào là sốkhách du lịch và đầu ra là tổng số giá.

Bài tập 1.8. (Giải nghiệm thực chương trình bậc hai) Một phươngtrình bậc hai tổng quát

ax2 + bx + c = 0, a 6= 0

Định thức ∆ = b2 − 4ac

• Khi ∆ > 0, thì phương trình có hai nghiệm thực;

• Khi ∆ = 0, thì phương trình chỉ có một nghiệm thực − b2a

;

• Trường hợp còn lại là không có nghiệm thực.

Hãy viết chương trình đầu vào a, b, c, in ra số nghiệm thực nếu có,ngược lại thì thông báo không có nghiệm.

Các kết quả mẫu:> a:-l: b:=0: c:-l:> quadreal(a,b,c);

There are no real solutions

Page 17: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

1.4 Bài tập 35

> a:=4: b:=4: c:»l:> quadreal(a,b,c);

There is only one real solution −.5> a:=3: b:=5: c:=2:> quadreal(a,b,c);

There are two real solutions −.6666666665, −1.000000000

Bài tập 1.9. Ta có thể mở rộng giải phương trình bậc hai: a = 0

thì phương trình là phương trình tuyến tính và chỉ có một nghiệmduy nhất − c

bkhi b 6= 0. Nếu lại có b = 0 thì phương trình không có

loại đó.. Hãy viết chương trình tính nghiệm thực của phương trìnhbậc hai với các khả năng có thể xảy ra.

Kết quả mẫu:> a:=0: b:=0: c:=0:> quadadv(a,b,c);

Error : invalid equation> a:=0: b:=5: c:=3:> quadadv(a,b,c);

This is a linear equation with solution −35

> a:=5: b:=3: c:=4:> quadadv(a,b,c);

There are no real solutions> a:=l: b:=2: c:=l:> quadadv(a,b,c);

There is only one real solution −1.0

> a:=2: b:=-9: c:=6:> quadadv(a,b,c);

There are two real solutions3.686140663, .8138593385

Bài tập 1.10. (Bảng thuế) Bảng thuế 1996 tai Hoa kì được chia ralàm bốn hoàn cảnh. Hãy viết chương trình tính tiền nộp thuế đầuvào là hoàn cảnh nào và thu nhập giá trị bao nhiêu: (status: hoàn

36 Giới thiệu lập trình tính toán trong maple

cảnh, TaxableIncome: thu nhập, Tax: Mức thuế):

Status 1 (độc thân)

Taxablelncome Tax0 - 23,350 0.15*TaxableIncome23,350 - 56,550 3,502.50+ 0.28*(TaxableIncome- 23,350)56,550 - 117,950 12,798.50+ 0.31*(TaxableIncome- 56,550)117,950 - 256,500 31,832.50+ 0.36*(TaxableIncome-117,950)256,500 - up 81,710.50+0.396*(TaxableIncome-256,500)

Status 2 (Quả phụ hoặc mất vợ)

Taxablelncome Tax0 - 39,000 0.15*TaxableIncome39,000 - 94,250 5,850.00+ 0.28*(TaxableIncome- 39,000)94,250 - 143,600 21,320.00+ 0.31*(TaxableIncome- 94,250)143,600 - 256,500 36,618.50+ 0.36*(TaxableIncome-143,600)256,500 - up 77,262.50+0.396*(TaxableIncome-256,500)

Status 3 (Đã có gia đình nhưng ở độc thân)

Taxablelncome Tax0 - 19,500 0.15*TaxableIncome19,500 - 47,125 2,925.00+ 0.28*(TaxableIncome- 19,500)47,125 - 71,800 10,660.00+ 0.31*(TaxableIncome- 47,125)71,800 - 128,250 18,309.25+ 0.36*(TaxableIncome- 71,800)128,250 - up 38,631.25+ 0.396*(TaxableIncome-128,250)

Status 4 (Người chủ gia đình)

Taxablelncome Tax0 - 31,250 0.15*TaxableIncome31,250 - 80,750 4,687.50 + 0.28*(TaxableIncome- 31,250)80,750 - 130,800 18,547.50+ 0.31*(TaxableIncome- 80,750)130,800 - 256,500 34,063.00+ 0.36*(TaxableIncome-130,800)256,500 - up 79,315.00+ 0.396*(TaxableIncome-256,500)

Các kết quả mẫu:> status:=2: Taxablelncome:=56890:

Page 18: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

1.4 Bài tập 37

> taxschdKstatus,Taxablelncome);10859.20

> status:=4: Taxablelncome:=35280:> taxschdKstatus,Taxablelncome);

5975.90> status:=1: Taxablelncome:=2590000:> taxschdKstatus,Taxablelncome);

.1005776500107

Bài tập 1.11. (Tính căn bậc ba của số 21). Dãy số

xk =20xk−1 + 21

(

1xk−1

)2

21, x1 = 1, k = 2, 3, ...

hội tụ tới căn bậc ba của 21 rất chậm. Hãy viết chương trình in ran số hạng đầu tiên của dãy và nắm được bao nhiêu bước để nó đạttới giới hạn trong 5 chữ số thập phân.

Bài tập 1.12. Viết chương trình tính chuỗi

1 − 1

3+

1

5− 1

7+ · · ·

và kiểm tra nó bằng π4 .

Bài tập 1.13. (Tổ hợp giữa dãy Lucas và Fibonacci) Dãy số Lucasđược định nghĩa

L0 = 2, L1 = 1, Lk = Lk−1 + Lk−2, k = 2, 3, 4, ..., n.

Viết chương trình in ra n số hạng đầu tiên của

Sk = L2k − 5F 2

k , k = 1, 2, ..., n

ở đây Fk là số hạng thứ k của dãy Fibonacci. Hãy dựa vào dãytính được và đưa ra giả thiết, có chứng minh được gải thiết đưa rakhông?

38 Giới thiệu lập trình tính toán trong maple

Bài tập 1.14. (Tính hàm cosine) Hàm cosine có thể tính bằng

cos(x) = 1 − x2

2!+

x4

4!− x6

6!+

x8

8!− x10

10!+

x12

12!− · · ·

Bài tập 1.15. Viết chương trình tính tổng n số hạng đầu tiên củadãy Fibonacci.

Page 19: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

Chương 2

CÁC PHÉP LẶP

2.1 Phương pháp nhát cắt vàng và chia đôi . 392.2 Phương pháp New tơn và các phương

pháp lặp khác . . . . . . . . . . . . . . . . . 482.3 Bài tập . . . . . . . . . . . . . . . . . . . . . 54

2.1 Phương pháp nhát cắt vàng và chia đôi

2.1.1 Giới thiệu nhát cắt vàng

Phương pháp nhát cắt vàng có thể áp dụng để giải các bài toántối ưu của các hàm lồi. Nó tương tự như phương pháp chia đôi để tìmnghiệm khi hàm bằng không. Mục đích của phần này dùng phươngpháp nhát cắt vàng để mô tả kỹ thuật lập trình, còn phương phápchia đôi chỉ gợi ý và như là một bài tập.

40 Các phép lặp

Một hàm gọi là lồi đều nếu nó thực sự tăng, đạt đến giá trị cựcđại và sau đó giảm. Một ví dụ điển hình của hàm lồi đều được vẽbằng Maple như:>f:=x->-x^2+3*x-2;

f := x → −x2 + 3 ∗ x − 2

>plot(f,0..2);

-1

-2

0

-0.5

-1.5

21 1.50.50

Hình 2.1: Đồ thị trong Maple

Cho [a, b] là một đoạn thẳng có điểm c ở bên trong. Vị trí củac trong [a, b] có thể mô tả bằng cách "c về bên phải của a là baonhiêu". Ví dụ dễ dàng nói rằng c là một phần ba đoạn thẳng về phíabên phải a. Nghĩa là độ dài của [a, c] bằng 1

3 độ dài của đoạn thẳng[a, b]. Một phân ba này là tỉ lệ của c trong [a, b]. Ta có thể nói rằng

Page 20: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

2.1 Phương pháp nhát cắt vàng và chia đôi 41

a c b x

Hình 2.2: Điểm tỉ lệ trong đoạn thẳng

c bắt đầu từ a cộng thêm 13 độ dài b − a. Ta có

c = a + (c − a) = a +1

3(b − a) = (1 − 1

3)a +

1

3b.

Hoàn toàn tương tự một điểm d ∈ [a, b] với tỉ lệ bằng t, ở đây0 ≤ t ≤ 1, thì

d = (1 − t)a + tb

và tỉ lệ nhát cắt

t =c − a

b − a=

|c − a||b − a| .

Bây giờ cho c trong khoảng [a, b] với tỉ lệ nhát cắt t, nghĩa là c =

(1− t)a+ tb. Nếu ngược lại ta thay đổi vai trò t và 1− t, ta sẽ nhậnđược điểm khác d = ta + (1 − t)b, nó là điểm đối xứng của c quatrung điểm đoạn [a, b]. Cặp hai điểm này ta gọi là liên hợp với nhautrong [a, b]. Tồn tại một tỉ lệ cắt đặc biệt τ , được gọi là tỉ lệ cắt

a c = (1 − t)a + tb b x

d = ta + (1 − t)b

Hình 2.3: Hai điểm liên hợp

vàng. Nó đặc biệt vì nếu c cắt đoạn [a, b] với tỉ lệ τ ,

c = (1 − τ)a + τb

thì điểm liên hợp của nó d cắt đoạn thẳng [a, c] với cùng tỉ số vàngnày,

d = τa + (1 − τ)b = (1 − τ)a + τc.

42 Các phép lặp

a c b xd

Hình 2.4: Nhát cắt vàng

Từ phương trình trên ta có thể tính được tỉ lệ nhát cắt vàng

τ =−1 +

√5

2

Xấp xỉ khoảng 0.618.

2.1.2 Phương pháp nhát cắt vàng

Cho f(x) là hàm lồi đều trên đoạn [a, b]. Ta đã biết tồn tại điểmcực đại x∗ của f(x) trong đoạn [a, b]. Mục đích của chúng ta là cắtxén đoạn thẳng này sao cho nó vẫn chứa điểm x∗.

Như hình 2.5, cho m` và mr là cặp điểm cắt liên hợp, tương ứngvới tỉ số cắt vàng, ta có thể gọi điểm cắt vàng bên trái và điểm cắtvàng bên phải của [a, b]. Ta sẽ co [a, b] hoặc về phía bên trái thànhđoạn [a,mr] hoặc về phía phải thành đoạn con [m`, b]. Ta đi tìmđiểm duy nhất cực đại của hàm lồi đều f(x). Như vậy ta so sánhcác giá trị f(m`) và f(mr). Nếu f(mr) > f(m`) như là hình 2.5,thì đoạn thẳng [m`, b] chứa mr là đoạn ta phải chọn. Tương tự, nếuf(m`) > f(mr), ta sẽ co [a, b] về [a,mr]. Như vậy ta có quy tắc chọncác đoạn thẳng con như sau:

• Nếu giá trị bên trái f(m`) lớn hơn, thì chọn đoạn con bên trái[a,mr].

Page 21: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

2.1 Phương pháp nhát cắt vàng và chia đôi 43

a

x∗

b

x

m` mr

f(x)

f(mr)f(m`)

Hình 2.5: Phương pháp nhát cắt vàng

• Nếu giá trị bên phải f(mr) lớn hơn, thì chọn đoạn con bênphải [m`, b].

Cái đẹp của phương pháp là trong mỗi đoạn con được cắt hoặc theom` hoặc mr đều với tỉ số vàng. Do đó, để co những đoạn con ta chỉcần điểm cắt vàng tổ hợp và chỉ một đánh giá hàm cộng tính.

Phương pháp nhát cắt vàng có thể mô tả theo giả mã sau:

Đầu vào: a, b, f và độ chính xác δ;

Đảm bảo δ là một số dương;

Bắt đầu làm việc với đoạn thẳng [α, β] = [a, b];

Đặt τ lát cắt tỉ số vàng;

Tìm cặp điểm nhát cắt vàng m` và mr;

Tính v` = f(m`) và vr = f(mr);

Khi |β − α| > δ, thì lặp lại vòng lặp sau:

Nếu v` > vr thì

Thay thế [α, β] với [α,mr];

44 Các phép lặp

Thay thế mr bằng m`;

Thay thế vr bằng v`;

Thay thế m` bằng (1 − τ)α + τβ;

Tính v` = f(m`);

Ngược lại

Thay thế [α, β] với [m`, β];

Thay thế m` bằng mr;

Thay thế v` bằng vr;

Thay thế mr bằng (1 − τ)α + τβ;

Tính vr = f(mr);

Kết thúc

Ta có thể lập trình như sau:

#Chương trình tính điểm cức đại của hàm lồi#Đầu vào: f hàm lồi,#e.g. f:=x->-x^2+3*x-2;#a, b các điểm vuối của đoạn thẳng [a,b]#tol sai số cần thiết

> goldsec:=proc(f,a,b,delta)local goldratio, gratio, alpha, beta, ml, mr,

fml, fmr, stepcount, tau, vl, vr;if delta <= 0.0 then # tránh delta âm

print("error tolerance must be positive");RETURN();

fi;tau := evalf( 0.5*(-1.0+sqrt(5.0)) );alpha:=a; beta:=b;mr:=(1-tau)*alpha+tau*beta;ml:=tau*alpha+(1-tau)*beta;vl:=f(ml); vr:=f(mr);while abs(beta-alpha) >= delta do

Page 22: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

2.1 Phương pháp nhát cắt vàng và chia đôi 45

if vl > vr thenbeta:=mr;mr:=ml; vr:=vl;ml:=tau*alpha+(1-tau)*beta;vl:=f(ml);

elsealpha:=ml;ml:=mr; vl:=vr;mr:=(1-tau)*alpha+tau*beta; # điểm giữa mớivr:=f(mr) # vr mới

fi;od;print("The solution is");print( 0.5*(alpha+beta) ); # đầu ra

end;

g o l d s e c := proc ( f , a , b , d e l t a )loca l g o l d r a t i o , g ra t i o , a lpha , beta , ml , mr , fml ,

fmr , s t epcoun t , tau , v l , vr ;i f d e l t a <= 0. then

print (" e r ro r t o l e r an c e must be p o s i t i v e " ) ;RETURN()

end i ftau := e v a l f (0.5∗( −1.0 + ‘ s q r t ‘ ( 5 . 0 ) ) ) ;a l pha := a ;b e t a := b ;mr := (1 − tau )∗ a lpha + tau ∗ b e t a ;ml := tau ∗ a lpha + (1 − tau )∗ b e t a ;v l := f (ml ) ;vr := f (mr ) ;while d e l t a <= ‘ abs ‘ ( b e t a − a lpha ) do

i f vr < v l thenb e t a := mr ;mr := ml ;

46 Các phép lặp

vr := v l ;ml := tau ∗ a lpha + (1 − tau )∗ b e t a ;v l := f (ml )

elsea lpha := ml ;ml := mr ;v l := vr ;mr := (1 − tau )∗ a lpha + tau ∗ b e t a ;vr := f (mr)

end i fend doprint ("The s o l u t i o n i s " ) ;print ( 0 . 5∗ ( a lpha + be t a ) )

end proc

Trong chương trình ta có dùng hàm RETURN() là cho máy tínhthoát khỏi chương trình. Ta thử kết quả sau với số chứ sôa sau dấuphảy là 20.> Digits:=20;

Digits := 20> a:=0; b:=2; tol:=0.001;

a:=0b:=2tol := .001

> goldsec(f,a,b,tol);The solution is1.5001934984462164631

Ta có thể giảm sai số đi, ta có > goldsec(f,a,b,0.00002);The solution is 1.4999951775621607752

> goldsec(f,a,b,0.000000001);The solution is 1.4999999999534881866

Page 23: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

2.1 Phương pháp nhát cắt vàng và chia đôi 47

2.1.3 Vòng lặp while-do

Để thực hiện thuật toán nhát cắt vàng ta có dùng loại vòng lặp

while cond i t i on dob l o c k o f s ta t ement sod ;

Trong vòng lặp này block of statements sẽ lặp lại khi mà conditioncòn đúng. Ví dụ như thuật toán nhát cắt vàng trên làm việc với[α, β] và đi vào vòng lặp. Nếu đoạn thẳng chưa đủ nhỏ thì nhữngcâu lệnh được thực hiện, khi kiểm tra thấy sai thì nó nhảy đến dònglệnh sau od;.

Chú ý khi dùng vòng lặp while-do, khi xảy ra điều kiện đặt rakhông bao giờ sai cả. Trong trường hợp chương trình lát cắt vàngta cho delta âm thì vòng lặp vô tận nên ta phải có kiểm tra deltaâm hay không

if delta <= 0.0 then # tránh delta âmprint("error tolerance must be positive");RETURN();

fi;

2.1.4 Phương pháp chia đôi

Định lý giá trị trung gian trong giải tích phát biểu rằng chohàm số f(x) là một hàm số liên tục trên đoạn [a, b] sao cho f(a)

và f(b) có dấu khác nhau, khi đó tồn tại một số x∗ ∈ [a, b] sao chof(x∗) = 0.

Để tìm x∗, ta có thể cắt đoạn thẳng bằng trung điểm mp = a+b2

và tính f(mp). Theo dấu của f(mp),

Nghiệm x∗ nằm trong hoặc bằng

[a,mp] nếu f(a)f(mp) ≤ 0,

mp nếu f(mp) = 0,

[mp, b] nếu ngược lại.

48 Các phép lặp

Ta có thể thay đoạn thẳng [a, b] bằng đoạn con hoặc là [a,mp] hoặclà [mp, b] có độ dài bằng nửa. Quá trình này gọi là phương phápchia đôi, nó có thể lặp lại cho đến khi độ dài đoạn thẳng cuối cùngnhỏ hơn một số sai số cho trước. Trung điểm của đoạn cuối cùng cóthể là nghiệm xấp xỉ của bài toán.

Thực hiện phương pháp chia đôi bằng Maple cũng giống nhưphương pháp lát cắt vàng bạn đọc tự làm lấy.

2.2 Phương pháp New tơn và các phươngpháp lặp khác

Cho một hàm có đạo hàm f(x), phép lặp

xk = xk−1 −f(xk−1)

f ′(xk−1), k = 0, 1, 2, ...

Gọi là phép lặp Newton. Nếu ta bắt đầu từ điểm x0 gần với điểmnghiệm x∗ của hàm f(x), phép nặp sinh ra dãy điểm x1, x2, ... mànó hội tụ tới nghiệm x∗. Thường thì phương pháp Newton hội tụnhanh, nếu nó hội tụ.

Ví dụ 2.1. Cho hàm số f(x) = x − cos(πx). Nó có một nghiệm là0.3769670099. Thực hiện phương pháp Newton để tìm nghiệm gầnđúng và so sánh các nghiệm.

Nếu ta bắt đầu từ x0 = 5

> x:=array(0..10) ;x := array(0..10, [])

> f:=x->x-cos(Pi*x) ;f := x → x − cos(πx)

> g:=D(f); #find the derivative of fg := x → 1 + sin(πx)π

> x[0]:=0.5;

Page 24: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

2.2 Phương pháp New tơn và các phương pháp lặp khác 49

x0 := .5

> x [1] : =evalf (x [0] -f (x [0] ) /g(x [0] ) ) ;xi := .3792734965

Hai chữ số đúng sau một bước> x [2] : =evalf (x [1] -f (x [1] ) /g(x [1] ) ) ;

x2 := .3769695051

Năm chữ số thập phân đúng sau hai bước> x [3] : =evalf (x [2] -f (x [2] ) /g(x [2] ) ) ;

x3 := .3769670094

Chỉ bằng ba bước đã nhận được nghiệm đúng đến 9 chữ số thậpphân.

Quá trình trên có thể dùng phép lặp

> f:=x->x-cos(Pi*x) ;g:=D(f);x[0]:=0.5;for k from 1 to 10 do

delta:=evalf(f(x[k-1])/g(x[k-1])):x[k]:= x[k-1] - delta:printf("x[\%2d]= \%15.10f delta = \%15.10f \n",

k, x[k] , delta):od:

x [ 1]= 0.3792734965 d e l t a = 0.1207265035x [ 2]= 0.3769695051 d e l t a = 0.0023039914x [ 3]= 0.3769670094 d e l t a = 0.0000024957x [ 4]= 0.3769670092 d e l t a = 0.0000000002x [ 5]= 0.3769670093 d e l t a = −0.0000000001x [ 6]= 0.3769670094 d e l t a = −0.0000000001x [ 7]= 0.3769670092 d e l t a = 0.0000000002x [ 8]= 0.3769670093 d e l t a = −0.0000000001x [ 9]= 0.3769670094 d e l t a = −0.0000000001x [10]= 0.3769670092 d e l t a = 0.0000000002

50 Các phép lặp

Một số chú ý quan trong khi sử dụng phương pháp lặp Newton:

• Phép lặp Newton là địa phương. Nghĩa là nó có thể sai nếuđiểm xuất phát x0 không ở gần nghiệm x∗.

• Thậm trí Nếu phép lặp Newton không hội tụ, thì chúng tacũng không kết luận được có nghiệm hay bao nhiêu bước nữathì dừng.

Do những lí do trên ta phải đặt một số tiêu chuẩn để phép lặpdừng lại:

1. Đơn giản là phải cho số bước lặp cụ thể , nghĩa là đầu vào cón để phép lặp Newton dừng lại tại xn.

2. Phép lặp dừng lại khi độ chính xác của nghiệm đủ tốt. Phéplặp Newton chỉ ra rằng độ chính xác của xk phụ thuộc vào

δk

f(xk−1)

f ′(xk−1).

Như vậy ta sẽ cho |δk| ≤ ε, một số ε đủ nhỏ để dừng phép lặpNewton.

Như vậy có hai cách đặt để phép lặp dừng lại. Điều này có thểthực hiện kết hợp giữa hai vòng lặp for-do và while-do:

for loop-index from ... to ... while condition docâu lệnh chuẩn bị

od;

Ta có ví dụ sau:

delta:=1.0:for k from 1 to 10 while abs(delta)>10.0^(-8) do

delta:=evalf(f(x [k-1])/g(x[k-1])):x[k]:= x[k-1] - delta:

Page 25: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

2.2 Phương pháp New tơn và các phương pháp lặp khác 51

printf("x[\%2d]= \%15.10f delta=\%15.10f \n",k, x[k], delta):

od:

x [ 1]= 0.3792734965 d e l t a= 0.1207265035x [ 2]= 0.3769695051 d e l t a= 0.0023039914x [ 3]= 0.3769670094 d e l t a= 0.0000024957x [ 4]= 0.3769670092 d e l t a= 0.0000000002

Vòng lặp dừng lại tại bước thứ 4 vì δ > 10(−8) sẽ đúng sau đó.

Phương pháp Newton có thể thực hiện theo cách giả mã sau đây:

1. Đầu vào: f , điểm xuất phát x0, bước giới hạn n, dung sai tol;

2. Tính đạo hàm của f và gán nó vào g;

3. Tạo ra mảng x với chỉ số từ 0 đến n;

4. Gán giá trị cho x0;

5. Đặt giá trị ban đầu của của δ lớn hơn tol;

6. Dùng cấu trúc "for ... from ... to ... while ... do" thực hiệnvòng lặp;

7. Kiểm tra nếu |δ| < tol;

8. Nếu đúng thì in ra phép lặp này

9. Ngược lại thoát khoải chương trình và thông báo sai.

Ví dụ 2.2. Ta xét ví dụ áp dụng phương pháp Newton tìm nghiệmcủa>f:=x->x^3-5*x^2+2*x-10;

f := x → x3 − 5x2 + 2x − 10

>plot(f,-3..7);

Đồ thị của hàm số f(x) thấy có nghiệm xấp xỉ x = 5. Bây giờta áp dụng phép lặp Newton.

> newton:=proc(f,x0,n,tol)

52 Các phép lặp

0

80

-80

40

-40

6420-2

Hình 2.6: Ví dụ phép lặp Newton

local g,x,delta,k;g:=D(f);x[0]:=x0;delta:=1.0;for k from 1 to n while abs(delta) > tol do

delta:=evalf(f(x[k-1])/g(x[k-1]));x[k]:= x[k-1] - delta;

printf("x[\%2d]= \%15.10f delta = \%15.10f \n", k,x[k] , delta);

od;if abs(delta) < tol then

printf("Phep lap Newton den \%2d vong lap \n",k-1);printf("Nghiem cua no la \%15.10f \n",x[k-1]);

Page 26: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

2.2 Phương pháp New tơn và các phương pháp lặp khác 53

elseprintf("Lap Newton khong hieu qua buoc \%2d",k-1);

fi;end;

newton := proc ( f , x0 , n , t o l )loca l g , x , d e l t a , k ;

g := D( f ) ;x [ 0 ] := x0 ;d e l t a := 1 . 0 ;for k to n while t o l < ‘ abs ‘ ( d e l t a ) do

d e l t a := e v a l f ( f ( x [ k − 1 ] ) / g ( x [ k − 1 ] ) ) ;x [ k ] := x [ k − 1 ] − d e l t a ;

p r i n t f ( x [%2d]=%15.10 f d e l t a = %15.10 f , k , x [ k ] , d e l t a )end do

i f abs ( d e l t a ) < t o l thenp r i n t f ("Phep l ap Newton den %2d vong l ap " , k−1);p r i n t f ("Nghiem cua no l a %15.10 f " , x [ k−1])

elsep r i n t f ("Phep l ap Newton khong h i eu buoc %2d" , k−1)end i fend proc

> newton(f,4.0,10, 10.0^(-8));

x [ 1]= 5.8000000000 d e l t a = −1.8000000000x [ 2]= 5.1652715940 d e l t a = 0.6347284061x [ 3]= 5.0092859510 d e l t a = 0.1559856433x [ 4]= 5.0000317760 d e l t a = 0.0092541752x [ 5]= 5.0000000010 d e l t a = 0.0000317752x [ 6]= 4.9999999970 d e l t a = 0.0000000037Phep l ap Newton den 6 vong l apNghiem cua no l a 4.9999999970

Nếu bắt đầu từ một điểm bất kì thì phép lặp Newton có thể sai:

54 Các phép lặp

>x0:=-3.0;>newton(f,x0,10, 10.0^(-8));

x [ 1]= −1.5084745760 d e l t a = −1.4915254240x [ 2]= −0.3447138130 d e l t a = −1.1637607630x [ 3]= 1.6065726800 d e l t a = −1.9512864930x [ 4]= −0.8521934710 d e l t a = 2.4587661510x [ 5]= 0.4039993150 d e l t a = −1.2561927860x [ 6]= −6.0088494810 d e l t a = 6.4128487960x [ 7]= −3.5470641800 d e l t a = −2.4617853010x [ 8]= −1.8900892560 d e l t a = −1.6569749240x [ 9]= −0.6757701210 d e l t a = −1.2143191350x [10]= 0.7009957210 d e l t a = −1.3767658420Phep l ap Newton khong h i eu qua buoc 10

2.3 Bài tập

Bài tập 2.1. [Tỉ số lát cắt vàng] Chứng minh tỉ số vàng là −1+√

52 .

Bài tập 2.2. Lấy mẫu chương trình lát cắt vàng để viết chươngtrình giải

f(x) = 0

dùng phương pháp chia đôi.

Kết quả mẫu: Tìm nghiệm của phương trình f(x) = x− sin(πx)

trong đoạn [−1, 1].> f:=x->x-sin(Pi*x);

f := x → x − sin(πx)

>plot(f,-1..1); Phương trình có ba nghiệm trong các khoảng[−1,−0.5], [−0.5, 0.5], và [0.5, 1]. Điều quan trong là phương trìnhđổi dấu qua các đoạn thảng. Do đó ta áp dụng phương pháp chiađôi theo địa phương.> bisect(f,-1,-0.5,0.00000001);

Page 27: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

2.3 Bài tập 55

0.5

0

-0.5

-1

1

10 0.5-0.5-1

Hình 2.7: Xác định ba khoảng

Nghiem xap xi la -.7364844497> bisect(f,-0.4,0.5,0.00000001);

Nghiem xap xi la −.372532403109

> bisect(f,0.5,1,0.00000001);Nghiem xap xi là .7364844497

Bài tập 2.3. Dùng chương trình của bài tập trước giải phươngtrình

x = cos(πx)

trong khoảng [−2, 1].

Mẫu chương trình và gợi ý:> g:=x->x-cos(Pi*x);

g := x → x − cos(πx)

> plot(g,-2..1); Như hình 2.8:> plot(g,-1.1..-0.7); Như hình 2.9:

Do đó nó có ba nghiệm:> bisect(g,-1.1,-0.9,0.00000001);

56 Các phép lặp

1

0

-1

-3

-2

10.50-0.5-1-2 -1.5

2

Hình 2.8: Phương phápchia đôi khoảng 1

-0.05

-0.15

0.05

0

-0.1

-0.7-0.8-0.9-1.1 -1

Hình 2.9: Phương phápchia đôi khoảng 2

Nghiem xap xi la −1.000000003

> bisect(g,-0.9,-0.7,0.00000001);Nghiem xap xi la −.7898326312

> bisect(g,0,1,0.000000001);Nghiem xap xi la .3769670099

Hãy thử với hàm số f(x) = sin(x) − e(−x) trên đoạn [0, 7].

Bài tập 2.4. Thuật toán Euclid. Ước số chưng của hai số nguyênm và n là một số nguyên d sao cho đồng thời m và n đều chia hết.Ví dụ hai số nguyên 60 và 45 có ước số chung là 3, 5 và 15. Vì60 = (2)(2)(3)(5) và 45 = (3)(3)(5). Ước số chung của m và n có sốlớn nhất ta gọi số đó là ước số chung lớn nhất của m và n kí hiệu làgcd(m,n). Vậy gcd(60, 45) = 15. Phương pháp cổ điển để tìm ướcsố chung lớn nhất là phương pháp Euclid:

Giả sử n < m.

1. Lấy m chia cho n và gấn r là số dư;

2. Nếu r = 0, thì n là ước số chung, thoát khỏi chương trình;

3. Ngược lại, thay (m,n) bằng cặp (n, r) và trở về 1.

Page 28: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

2.3 Bài tập 57

Ví dụ tìm gcd(13578, 9198)):> m:=13578; n:=9198;

m := 13578 n := 9198

> r:=m mod n;r := 4380

> m:=n; n:=r; r:=m mod n;m := 9198 n := 4380 r := 438

> m:=n; n:=r; r:=m mod n;m := 4380 n := 438 r := 0

Ước số chưng lớn nhất là 438 vì khi đó r = 0.

Hãy viết một chương trình đầu vào là m và n và kết quả ra làgcd(m,n). Dùng chương trình để tính mẫu sau:> gcd(13578,9198);

Uoc so chung lon nhat la 438> gcdiv(9198,13578);

Uoc so chung lon nhat la 438> gcd(60,45);

Uoc so chung lon nhat la 15

Bài tập 2.5. Cho số tiền thế chấp là $ A, mà lãi suất trả theo chukì là i và tổng số tiền phải trả là n. Khi đó tài khoản phải trả $PMT cho từng chu kì được tính theo công thức

PMT = Ai

1 − (1 + i)(−n).

Giả sử ta mua một căn nhà giá $ 120,000 giảm 20%. Ta có khả năngtrả $713/tháng trong 30 năm. Hỏi lãi suất cần phải tính để mua nhàlà bao nhiêu?

Chương 3

MẢNG TRONG MAPLE

3.1 Định nghĩa mảng và sử dụng nó . . . . . 583.2 Một số độ đo thống kê . . . . . . . . . . . 643.3 Phương pháp sàng . . . . . . . . . . . . . . 683.4 Một số dự án về mảng . . . . . . . . . . . 733.5 Bài tập . . . . . . . . . . . . . . . . . . . . . 76

3.1 Định nghĩa mảng và sử dụng nó

3.1.1 Sử dụng mảng

Một mảng dùng để chứa dãy dữ liệu. Ví dụ ta muôn lưu 11 phầntử đầu tiên của dãy Fibonacci F0, F1, ..., F10, đầu tiên phải thiết lậpmột mảng với chỉ số từ 0 đến 10.>fib:=array(0..10); # define an (empty) array

fib := array(0..10, [])

Page 29: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

3.1 Định nghĩa mảng và sử dụng nó 59

Gán các giá trị vào mỗi phần tử của mảng>fib[0]:=0; fib[1]:=1;

fib0 = 0 fib1 = 1

>for i from 2 to 10 dofib[i]:=fib[i-1]+fib[i-2];od;

fib2 = 1 fib3 = 2 fib4 = 3 fib5 = 5 fib6 = 8 fib7 =

13 fib8 = 21 fib9 = 34 fib10 = 55

Tổng quát, mảng được định nghĩa>{Tên mảng}:=array({Chỉ số đầu}..{Chỉ số cuối});Mỗi thực thể của mảng có thể đọc ra như {Tên mảng}[{Chỉ số}].Ta có thể dùng ?array để tra cứu tài liệu trong Maple.>fib[6]

8>fib[10]

55

3.1.2 Lệnh seq

Lệnh seq rất có ích là tạo ra dãy dữ liệu đã biết. Ví dụ mộtphần của dãy Fibonacci f0, f1, ..., f10 là dãy như một mảng fi, i =

0, 1, .., 10. Dễ dàng ghi dữ liệu vào fib[0], f ib[1], ..., f ib[10] hoặc đọcra nhưseq( fib[i], i=0..10 );0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55.

Một cách tổng quát seq(f_i, i=m..n) sinh ra dãy f với i từ m

đến n. Ví dụ sau đây sinh ra các số lẻ:> seq( 2*i-1, i=1..20 );1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39 Tạo radãy bình phương số tự nhiên

60 Mảng trong Maple

> seq( i^2, i=1..15 );1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225

3.1.3 Giá trị ban đầu của mảng

Mảng có thể có giả trị ban đầu bằng:> t:=array(1..5,[2,6,8,10,3]);

t := [2, 6, 8, 10, 3]

Ta có thể gán giá trị mảng bằng lệnh seq. Ví dụ sinh ra mảngchứa các số chẵn> even_number:=array(1..20, [seq(2*i, i=1..20)]);even_number = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24,

26, 28, 30, 32, 34, 36, 38, 40]

Sau khi mảng được gán ta có thể tính toán trên mảng này. Vídụ ta tính tổng số hạng thứ 8 và thứ 12 trong mảng số chẵn trên>even_number[8]+even_number[12];

40

Ví dụ mảng các số chính phương> squ:=array(1..50,[seq(j^2, j=1..50)]);squ := [1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256,

289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 729, 784, 841, 900, 961,

1024, 1089, 1156, 1225, 1296, 1369, 1444, 1521, 1600, 1681, 1764, 1849,

1936, 2025, 2116, 2209, 2304, 2401, 2500]

3.1.4 Các phần tử của mảng

Ta có thể định nghĩa mọi phần từ trong mảng có loại dữ liệumà Maple cho phép, như các mảng trong các ngôn ngữ lập trìnhkhác.> s:=array(1..3);

s := array(1 .. 3, [])> s[1]:=5; s[2]:=‘John Doe‘; s[3]:=array(1..3,[Mark,Bob,Jack]);

Page 30: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

3.1 Định nghĩa mảng và sử dụng nó 61

s1 := 5

s2 := John Does3 := [Mark, Bob, Jack]

> s[3][2];Bob

Định nghĩa mảng chứ bốn tên, mỗi tên người chứa họ và tên.Khi khai báo mảng 4 phần tử, mỗi phần tử lại là mảng của 2 phầntử khác.> Name:=array(1..4,[seq( array(1..2) , i=1..4)]);Name := [[?[1], ?[2]], [?[1], ?[2]], [?[1], ?[2]], [?[1], ?[2]]]

> Name[1][1]:=Bill: Name[1][2]:=Clinton:> Name[2][1]:=A1: Name[2][2]:=Gore:> Name[3][1]:=Bob: Name[3][2]:=Dole:> Name[4][1]:=Jack: Name[4][2]:=Kemp:> eval(Name);[[Bill, Clinton], [A1, Gore], [Bob,Dole], [Jack,Kemp]]

Phần tử thứ 3 là tên của Bob Dole> eval(Name[3]);[Bob,Dole]

> Name[4][1];Jack

3.1.5 Ví dụ mảng các số nguyên tố

Số nguyên tố là một số nguyên dương mà nó chỉ chia hết cho 1và cho chính nó. Maple có hàm số "isprime" để xác định một số cóphải là số nguyên tố không? Ví dụ ta biết rằng 11 là số nguyên tốcòn 15 không phải là số nguyên tố thì:

>isprime(11);true

>isprime(15);false

62 Mảng trong Maple

Ta có thẻ viết một chương trình đơn giản đưa n số nguyên tốvào mảng.

#Chương trình sinh mảng số nguyên tố#Đầu vào: n số nguyên tố muốn sinh ra#Đầu ra: p mảng chứa số nguyên tố

>primearray:=proc(n,p)local i, k, count;p:=array(1..n);count:=0;k:=2;while count < n do

if isprime(k) thencount:=count+1;p[count]:=k

fi;k:=k+1;

od;print("I got them")

end;

primearray := proc (n , p )loca l i , k , count ;p := array (1 . . n ) ;count := 0 ; k := 2;while count < n doi f i spr ime ( k ) then

count := count +1; p [ count ] := kend i f ; k := k+1end do ;print (" I go t them ")

end proc

Page 31: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

3.1 Định nghĩa mảng và sử dụng nó 63

> primearray(50,p);"I got them"

> seq(p[i],i=1..50);2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71,

73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151,

157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229

p[25]*p[12];3589

Chú ý. Chương trình trên ta không in ra nghiệm của bài toán,mà ta dùng đối số p lấy kết quả ra để sử dụng với mục đích sau này.

3.1.6 Ví dụ xác định phần tử cực đại của một mảng

Tìm số lớn nhất trong mảng các phần tử: 2,−5, 9, π.

#Tìm chỉ số của phần tử cực đại trong mảng số#Input: m chỉ số đầu của mảng#n (>m) chỉ số cuối

#s là mảng số#Output: index_max chỉ số phần tử cực đại#value_max giá trị phần tử cực đại#value_max giá trị phần tử cực đại> find_max:=proc(m, n, s)

local i, value_max, index_max;value_max:=evalf(s[m] ); # phần tử thứ nhất là maxindex_max:=m;for i from m+1 to n doif evalf(s[i]) > value_max then# nếu giá trị lớn hơn tìm thấy

value_max:=evalf(s[i]); # cập nhật giá trị maxindex_max:=i; # cập nhật chỉ số max

fi;

64 Mảng trong Maple

od;print("The maximum value:");print( value_max );print("The index of the maximum value");print( index_max );

end;

find_max := proc (m, n , s )loca l i , value_max , index_max ;

value_max := e v a l f ( s [m] ) ;index_max := m;for i from m + 1 to n do

i f value_max < e v a l f ( s [ i ] ) thenvalue_max := e v a l f ( s [ i ] ) ;index_max := i

end i fend doprint ("The maximum va lu e : " ) ;print ( value_max ) ;print ("The index o f the maximum va lu e " ) ;print ( index_max )

end proc

find_max(1,7,data);The maximum value : 9.The index of the maximum value 3

3.2 Một số độ đo thống kê

3.2.1 Miền giá trị

Cho x1, x2, ..., xn là dãy dữ liệu. Miền giá trị R được định nghĩalà maxi xi −mini xi. Hãy viết chương trình tính miền giá trị với đầuvào n và dãy dữ liệu.

Page 32: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

3.2 Một số độ đo thống kê 65

#Chương trình tìm miền giá trị của mảng số#Đầu vào: m chỉ số đầu của mảng#n (>m) chỉ số cuối của mảng#x mảng các số#Đầu ra: miền giá trị

> Range:=proc(m, n, x)local i, value_max, value_min;value_max:=evalf(x[m]); # khởi đầu giả sử đã cóvalue_min:=evalf(x[m]); # một là max và min# tìm maximum

for i from m to n do # kiểm tra phần tử còn lại# nếu giá trị lớn hơn tìm thấyif evalf(x[i]) > value_max then

value_max:=evalf(x[i]); # gán lại giá trị cực đạifi;

od;# tìm cực tiểu

for i from m to n do # kiểm tra phần tử còn lạiif evalf(x[i]) < value_min then

value_min:=evalf(x[i]);fi;

od;value_max - value_min #đưa ra miền giá trị

end;

Range := proc (m, n , x )loca l i , value_max , value_min ;

value_max := e v a l f ( x [m] ) ;value_min := e v a l f ( x [m] ) ;for i from m to n do

i f value_max < e v a l f ( x [ i ] ) thenvalue_max := e v a l f ( x [ i ] )

end i f

66 Mảng trong Maple

end dofor i from m to n do

i f e v a l f ( x [ i ] ) < value_min thenvalue_min := e v a l f ( x [ i ] )

end i fend dovalue_max − value_min

end proc

> a:=array(1..10,[2,45,-23,25,43,-26,89,-19,56,9]);a := [2, 45,−23, 25, 43,−26, 89,−19, 56, 9]

> rang:=Range(1,10,a);rang := 115.

3.2.2 Sắp xếp

Giả sử ta có dãy xm, xm+1, ..., xn và ta muốn sắp xếp chúng tăngdần. Ta dùng m thay cho 1 nên chỉ số của mảng được khởi đầu mềmdẻo hơn. Ta áp dụng thuật toán sau đây:

Bước m: tìm phần tử nhỏ nhất giữa xm, xm+1, ..., xn và đổi chỗnó với xm.

Bước m + 1: tìm phần tử nhỏ nhất trong xm+1, xm+2, ..., xn vàđổi chỗ nó với xm+1

Bước m + 2: tìm phần tử nhỏ nhất trong xm+2, xm+3, ..., xn vàđổi chỗ nó với xm+2

.......

Bước n − 1: tìm phần tử nhỏ nhất trong xn−1, xn và đổi chỗ nóvới xn−1

Tổng quát, ta có vòng lặp k = m,m + 1, ...., n − 1

Bước k: tìm phần tử nhỏ nhất trong xk, xk+1, ..., xn và đổi chỗnó với xk

Trong bước k, lại cần có vòng lặp tìm phần tử nhỏ nhất trong

Page 33: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

3.2 Một số độ đo thống kê 67

dãy. Do đó ta có chương trình:

#Chương trình sắp xếp dãy dữ liệu#x[m] , x[m+l] x[n] theo thứ tự tăng#Đầu vào: m chỉ số đầu của mảng#n (>n) chỉ số cuối của dãy#x mảng dữ liệu với chỉ số [m,n]> sort_ascend:=proc(m,n,x)

local k, j, tmp, value_min, index_min;if n < m then

print("starting index larger than ending index");RETURN()

fi;for k from m to n-1 do# tìm giá trị nhỏ nhất chỉ số nhỏ nhất x[k] ,x[k+l] x[n]value_min:=evalf(x[k]);index_min :=k;for j from k+1 to n do

if value_min > evalf(x[j]) thenvalue_min:=evalf(x[j]);index_min:=j;

fi;od;# đổi phần tử thứ k nếu cầnif index_min > k then

tmp:=x[index_min];x [index_min] :=x[k] ;x[k] :=tmp;

fi;od;print("ascending sorting finished");

end;

sor t_ascend := proc (m, n , x )

68 Mảng trong Maple

loca l k , j , tmp , value_min , index_min ;i f n < m then

print (" s t a r t i n g index l a r g e r than ending index " ) ;RETURN()

end i ffor k from m to n − 1 do

value_min := e v a l f ( x [ k ] ) ;index_min := k ;for j from k + 1 to n do

i f e v a l f ( x [ j ] ) < value_min thenvalue_min := e v a l f ( x [ j ] ) ;index_min := j

end i fend doi f k < index_min then

tmp := x [ index_min ] ;x [ index_min ] := x [ k ] ;x [ k ] := tmp

end i fend doprint (" ascend ing s o r t i n g f i n i s h e d ")

end proc

> a:=array(2..10,[3,-4,9,8,-Pi,exp(1),sqrt(12),1/3,0]):> sort_ascend(2,10,a);

"ascending sorting finished"> seq(a[i],i=2..9);

−4,−π, 0, 13 , e, 3, 2

√3, 8

3.3 Phương pháp sàng

Phương pháp sàng là một quá trình gạch các phần tử trong dãy

xm, xm+1, ..., xn

Page 34: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

3.3 Phương pháp sàng 69

mà nó có tính chất (hoặc không có tính chất) nào đó.

Có thể tượng tượng cách sàng lọc như sau: Ta gắn vào dãy

sm, sm+1, ..., sn

ban đầu với chuỗi "sống". Nếu xk bị bỏ đi, thì gán sk:="chết". Cuốicùng việc sàng lọc là kiểm tra lại sm, sm+1, ..., sn còn sống hay chết.Nếu phần tử, ví dụ như sj là "sống", thì tương ứng xj còn ở trênsàng.

3.3.1 Ví dụ về tìm số nguyên tố bằng phương phápsàng

Bài toán: Tìm tất cả số nguyên tố nằm giữa 1 và n bằng cáchxóa đi các bộ của số nguyên tố.

Số nguyên tố đầu tiên là 2, vậy tất cả số bội của 2 bị xóa, nghĩalà ta đánh dấu các số 2 ∗ 3, 2 ∗ 4, 2 ∗ 5, ... như là phần tử "chết".

Số còn "sống" tiếp theo là số nguyên tố 3, vậy ta lại bỏ đi tất cảcác bội của 3, ta đánh dấu 3 ∗ 3, 3 ∗ 4, 3 ∗ 5, ... như đã "chết" (chú ýkhông đánh dấu 3 ∗ 2 vì nó đã chết rồi).

Số còn "sống" tiếp theo là số nguyên tố 5, vậy ta lại bỏ đi tất cảcác bội của 5, ta đánh dấu 5 ∗ 5, 5 ∗ 6, 5 ∗ 7, ... như đã "chết" (chú ýkhông đánh dấu 5 ∗ 2, 5 ∗ 3, 5 ∗ 4 vì chúng đã chết rồi).

Tổng quát, số nguyên tố hiện thời là k, vậy ta lại bỏ đi tất cảcác bội của k, ta đánh dấu như đã "chết" (chú ý không đánh dấuk ∗ 2, k ∗ 3, k ∗ (k − 1) vì chúng đã chết rồi). Sau đó tìm số còn sốngsau k và công việc lặp lại.

#Chương trình tìm tất cả các số nguyên tố nhỏ hơn n bằng sàng#Đầu vào: n cận trên của tìm kiếm#Đầu ra: p mảng chứa tất cả các số nguyên tố đến n>prime_sieve:=proc(n,p)

local s, i, k, count, flag;

70 Mảng trong Maple

#Khởi tạo mảng sốngs:=array(1..n,[ seq("alive",i=1..n) ] );# 1 không phải là số nguyên tốs[1]:="killed";# thoát nếu n < 2if n < 2 then

print("There is no prime numbers in the given range");RETURN()

fi;# sàng tới khi k*k > n

for k from 2 to n while k^2 <= n do# đánh dấu mọi i*k như "killed" nếu k là nguyên tố

if s[k]="alive" thenfor i from k to n while i*k <= n do

s[i*k]:="killed";od;

fi;od;

# đếm số nguyên tố tìm đượccount:=0;for i from 1 to n do

if s[i]="alive" thencount:=count+1;

fi;od;# khởi tạo mảng để ghi số nguyên tốp:=array(1..count);# khởi tạo k như số đếmk:=0;for i from 1 to n do

if s[i]="alive" then# khi s[i] là ’alive’, i là số nguyên tố thứ k

k:=k+1;

Page 35: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

3.3 Phương pháp sàng 71

p[k]:=i;fi;

od;print("The number of primes:");count;

end;

Ta áp dụng tìm tất cả các số nguyên tố đến 1000> prime_sieve(1000,p);

"The number of primes:" 168>eval(p);[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73,

79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157,

163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239,

241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331,

337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421,

431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509,

521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613,

617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709,

719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821,

823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919,

929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997]

3.3.2 Ví dụ về những số Ulam đẹp

Từ danh sách các số nguyên dương 1, 2, 3, ... ta bỏ đi mọi số đứngthứ hai, chỉ còn các số sống 1, 3, 5, 7, 9, ... vì 3 là số sống đầu tiênvượt 2 mà nó không bị "killer", ta bỏ đi mọi số đứng thứ ba trongcác số sau đó, nên có 1, 3, 9, 13, 15, 19, 21, ... bây giờ lạo đến mọi sốthứ 7 còn sống được bỏ đi, ...Các số không bao giờ bị bỏ đi gọi làsố "đẹp". Viết chương trình in ra các số đẹp đến n.

#Số đẹp Ulam: cho dãy 1, 2, 3, ..., n

72 Mảng trong Maple

#bỏ mọi số thứ 2, nó còn:#1, 3, 5, 7, 9, 11, 13, ...#sau ddos bỏ số thứ 3. Tổng quát,#sau đó bỏ mọi số thứ, nếu m là số đầu tiên còn#mà lớn hơn k. cập nhật k cho m#và lại bọ mọi số thứ k , quá trình tiếp tục#đến khi k lớn hơn cỡ của dãy.#iĐầu vào: n cận trên phải tìm#Đầu ra: mảng chứa các số đẹp đến n>ulamluck:=proc(n,lucky)

local i,count,u,k,flag,survive;# initialize the array u.# u[i] = ’alive’ : i survives# u[i]=’killed’ : i removed.u:=array(1..n);

for i from 1 to n dou[i] :="alive"

od;survive:=n; # có n phần tử sống từ đầufor k from 2 to n while survive > k do# bỏ mọi số thứ k nếu k sống

if u[k]="alive" thencount:=0;for i from 1 to n do

if u[i]="alive" thencount:=count+1;if count=k then

u[i]:="killed";count:=0;survive:=survive-1;

fi;fi;

od;

Page 36: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

3.4 Một số dự án về mảng 73

fi;od;

# Ghi lại những phần tử số đẹplucky:=array(1..survive); # khởi tạo mảng số đẹpcount:=0;for i to n do

if u[i]="alive" thencount:=count+1;lucky[count]:=i;

fi;od;print("The Ulam’s lucky numbers");seq(lucky[i],i=1..count); # in ra

end;

> ulamluck(100,lucky);"The Ulam’s lucky numbers"

1, 3, 7, 9, 13, 15, 21, 25, 31, 33, 37, 43, 49,

51, 63, 67, 69, 73, 75, 79, 87, 93, 99

3.4 Một số dự án về mảng

3.4.1 Tam giác Pascal

Hệ số của đa thức (a + b)n có thể tính được nhờ sơ đồ tam giácPascal

74 Mảng trong Maple

n (a + b)n c0, c1, ..., cn

0 1 11 a + b 1 12 a2 + 2ab + b2 1 2 13 a3 + 3a2b + 3ab2 + b3 1 3 3 14 a4 + 4a3b + 6a2b2 + 4ab3 + b4 1 4 6 4 15 a5 + 5a4b + 10a3b2 + 10a2b3 + 5ab4 + b5 1 5 10 10 5 1· · · · · · · · ·

Ta có nhận xét sau trong bảng này

• với mỗi n có (n + 1) số hạng c0, c1, ..., cn;

• c0 = cn = 1;

• Cho d0, d1, ..., dk−1 là các hệ số của (a + b)k−1 thì

c0 = 1, c1 = d0+d1, c2 = d1+d2, ..., ck−1 = dk−2+dk−1, ck = 1.

Hãy viết chương trình đưa vào n, đưa ra (1) hệ số mảng c và (2) inra tam giác Pascal. Mẫu chạy chương trình như sau:>Pascal_triangle(10,c);

11, 11,2,1

1, 3, 3, 11, 4, 6, 4, 1

1, 5, 10, 10, 5, 11, 6, 15, 20, 15, 6, 1

1, 7, 21, 35, 35, 21, 7, 11, 8, 28, 56, 70, 56, 28, 8, 1

1, 9, 36, 84, 126, 126, 84, 36, 9, 11, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1

Page 37: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

3.4 Một số dự án về mảng 75

> seq( c[j], j=0..10 );1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1

3.4.2 Giá trị trung bình

Cho dãy số thực

xm, xm+1, xm+2, ..., xn

có những giá trị trung bình khác nhau như:

(i) Trung bình cộng A

A =

n∑

i=m

xi

n − m + 1.

(ii) Trung bình nhân G

G =

(

n∏

i=m

xi

) 1n−m+1

(iii) Trung bình điều hòa H

1

H=

n∑

i=m

1xi

n − m + 1

Viết chương trình đầu vào m,n, x và in ra ba giá trị trung bình.Mẫu thực hiện chương trình như sau:> x:=array(0..10,[2,5,9,12,21,33,18,8,ll,15,17]):> Mean(0,10,x);

The arithmetic mean : 13.72727273The geometric mean : 11.05802293The harmonic mean : 8.033176344

76 Mảng trong Maple

> y:=array(l..9,[3,9,12,43,31,18,24,38,5]):> Mean(l,9,y);

The arithmetic mean : 20.33333333The geometric mean : 14.86548789The harmonic mean : 9.924686319

Ta có thể tính được cả giá trị trung bình của hệ số Newton:> Pascal_triangle(12,c):

11,1

1,2,11, 3, 3, 1

1, 4, 6, 4, 11, 5, 10, 10, 5, 1

1, 6, 15, 20, 15, 6, 11, 7, 21, 35, 35, 21, 7, 1

1, 8, 28, 56, 70, 56, 28, 8, 11, 9, 36, 84, 126, 126, 84, 36, 9, 1

1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 11, 11, 55, 165, 330, 462, 462, 330, 165, 55, 11, 1

1, 12, 66, 220, 495, 792, 924, 792, 495, 220, 66, 12, 1

> Mean(0,12,c);The arithmetic mean : 315.0769231The geometric mean : 78.51839612The harmonic mean : 5.872498536

3.5 Bài tập

Bài tập 3.1. Mảng Fibonacci. Viết jchương trình đầu vào n, đầu

Page 38: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

3.5 Bài tập 77

ra là mảng của dãy Fibonacci

F0, F1, ..., Fn

Nhưng không in kêtquả khi chương trình đang chạy mà kết quả đưara như một mảng đối số và dùng lệnh seq để liệt kê kết quả.

Ví dụ mẫu như sau:>n:=40:> fibarray(40,f);

Fibonacci sequence is generated> seq(f[k],k=0..n);0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584,

4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811,

514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465,

14930352, 24157817, 39088169, 63245986, 102334155

Bài tập 3.2. Tích vô hướng. Một vector có n thành phần đượcđịnh nghĩa như một mảng

(v1, v2, ..., vn).

Ví dụ như a = (1, 3, 5,−3, 2) và (9,−5, 2,√

7, π). Một tích vô hướnghai vector được định nghĩa a = (a1, a2, ..., an) và b = (b1, b2, ..., bn)

a · b = a1b1 + a2b2 + · · · anbn

Hãy viết chương trình đầu vào n, a, b và in ra giá trị tích vô hướng.

Kết quả mẫu như sau:> n:=5:> a:=array(1..n, [1,3,5,-3,2]);

a := [1, 3, 5,−3, 2]

> b:=array(1..n, [9, -5, 2, sqrt(7), Pi]);b := [9,−5, 2, y/7, n]

> dotprod(a,b,n);The dot product is 2.345931375

78 Mảng trong Maple

Bài tập 3.3. Danh sách quân bài. Hãy viết chương trình địnhnghĩa mảng 52 phần tử, mỗi phần tử chứa số và loại quân bài nhưbộ bài chuẩn. Nghĩa là, mỗi phần tử là mảng của hai thành phần,thành phần thứ nhất là số và thành phần thứ hai là loại quân bài.Bộ bài được xếp theo thứ tự như ví dụ 3 trong chương 2.

Mẫu ví dụ như sau:> decklist(deck):> eval(deck);[[ace, heart], [2, heart], [3, heart], [4, heart], [5, heart], [6, heart],

[7, heart], [8, heart], [9, heart], [10, heart], [jack, heart], [queen, heart],

[king, heart], [ace, spade], [2, spade], [3, spade], [4, spade],

[5, spade], [6, spade], [7, spade], [8, spade], [9, spade], [10, spade],

[jack, spade], [queen, spade], [king, spade], [ace, diamond],

[2, diamond], [3, diamond], [4, diamond], [5, diomond], [6, diamond],

[7, diamond], [8, diamond], [9, diamond], [10, diomond],

[/ocA, diamond], [queen, diamond], [king, diamond], [ace, club],

[2, club], [3, club], [4, ciu6], [5, club], [6, club], [7, club], [8, club],

[9, club], [10, club], [jack, club], [queen, club], [king, club]]

> eval(deck[18]);[5, spade]

> eval(deck[37]);[jack, diamond]

Bài tập 3.4. Giá trị cực tiểu. Hãy viết chương trình để xác địnhphần tử cực tiểu trong mảng bằng cách in ra giá trị cực tiểu và chỉsố của nó. Dùng dữ liệu của ví dụ 2 để kiểm tra chương trình.

Bài tập 3.5. Phương sai chuẩn.

s =

n∑

i=1

(xi − σ)2

n

Page 39: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

3.5 Bài tập 79

ở đây σ là trung bình cộng của x1, x2, ..., xn, nghĩa là

σ =

n∑

i=1

xi

n.

Bài tập 3.6. Giá trị trung gian và giá trị phần tư. Choxm, xm+1, ..., xn là dãy n − m + 1 số thực theo thứ tự tăng dần.Chỉ số dẫn đầu m có thể là 0, 1 hoặc một số nguyên bất kì. Giá trịtrung gian của dãy này được định nghĩa như sau:

Trường hợp 1. Nếu n − m + 1 là số lẻ, khi đó giá trị trung gianlà phần tử ở giữa có chỉ số là n+m

2 .

Trường hợp 2. Nếu n − m + 1 là số chẵn, thì giá trị trung gianlà trung bình cộng của phần tử bên trái và phần tử bên phải có chỉsố tại n+m−1

2 và n+m+12 tương ứng.

Giá trị trung gian còn được gọi là phần tư thứ hai.

Phần tư thứ nhất và phần tư Phần tư thứ ba được định nghĩanhư sau:

Trường hợp 1. Nếu n + m− 1 là chẵn, khi đó dãy số có thể chiađôi nửa đầu tiên của dãy con

xm, xm+1, ..., xn+m−1

2

và nửa phần thứ hai

xn+m+1

2

, ..., xn

Phần tư thứ nhất là giá trị trung gian của dãy con nửa đầu, phầntư thứ ba là giá trị trung gian của dãy con nửa thứ hai.

Trường hợp 2. Nếu n − m + 1 là lẻ, thì tồn tại phần tử ở giữaxn+m

2

. Phần tư thứ nhất được định nghĩa như giá trị trung gian của

dãy con

xm, ..., xn+m

2−1

80 Mảng trong Maple

và phần tử thứ ba được định nghĩa như giá trị trung gian của dãycon

xn+m

2+1, ..., xn.

Hãy viết chương trình cho một dãy

xm, xm+1, ..., xn

in ra ba loại phần tư trên. Chương trình phải tiếp nhận đầu vàom,n và mảng x và sắp xếp lại theo thứ tự tăng dần và tìm các phầntư.

Gợi ý: Ta xét các bước sau đây:

Đầu vào: m,n, x

1. Sắp xếp lại mảng x theo thứ tự tăng dần;

2. Theo giá trị chẵn/lẻ số n − m + 1:

- Tìm giá trị trung gian (Phần tư thứ hai).

- Tìm chỉ số khoảng m1 và n1 cho dãy con thứ nhất.

- Tìm chỉ số khoảng m2 và n2 cho dãy con thứ hai.

3. Theo tính chẵn/lẻ của n1 − m1 + 1 và n2 − m2 + 1 tìm phầntư thứ nhất và phần tư thứ ba.

Ví dụ mẫu:> x:=array(0..10,[23,12,34,87,25,10,5,19,65,29,71]):> quartile(x,0,10);

The sequence in ascending order5, 10, 12, 19, 23, 25, 29, 34, 65, 71, 87

The 1st subsequence5, 10, 12, 19, 23

The 2nd subsequence29, 34, 65, 71, 87

The 1st, 2nd, and 3rd quartiles :

Page 40: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

3.5 Bài tập 81

122565

> y:=array(l..14,[22,11,33,44,51,62,12,81,37,19,9,20,18,5]);y := [22, 11, 33, 44, 51, 62, 12, 81, 37, 19, 9, 20, 18, 5]

> quartile(y,l,14);The sequence in ascending order

5, 9, 11, 12, 18, 19, 20, 22, 33, 37, 44, 51, 62, 81

The 1st subsequence5, 9, 11, 12, 18, 19, 20

The 2nd subsequence22, 33, 37, 44, 51, 62, 81

The 1st, 2nd, and 3rd quartiles :1221.044

Bài tập 3.7. Cho

λ = (λm, λm+1, ..., λn)

là một vec tơ những số dương sao chon∑

i=m

λi = 1

khi đó trung bình cộng và trung bình nhân trọng số tương ứng vớivec tơ λ được định nghĩa

(i) Trung bình cộng trọng số là

Aλ =n∑

i=m

λixi = λmxm + λm+1xm+1 + · · · + λnxn.

(ii) Trung bình nhân trọng số nghĩa là

Gλ =

n∏

i=m

xλi

i = (xλm

m )(xλm+1

m+1 ) · · · (xλn

n )

82 Mảng trong Maple

Cho trọng sốλm, λm+1, ..., λn

được định nghĩa như sau

λm =1

2, λm+1 =

1

4, ..., λi =

λi−1

2, ..., λn−1 =

λn−2

2, λn = λn−1.

Hãy viết chương trình đầu vào là m,n, x tính hai giá trị trung bìnhtrọng số trên. Dùng chương trình tính hai giá trị trung bình trọngsố trong dự án trên.

Mẫu chạy chương trình:> Weighted_means(0,10,x);

The weighted arithmetic mean 5.521484376The weighted geometric mean 3.933248559

> Weighted_means(l,9,y);The weighted arithmetic mean 9.54296875The weighted geometric mean 6.309771865

> Weighted_means(0,12,c);The weighted arithmetic mean 64.87329102The weighted geometric mean 6.551390952

Bài tập 3.8. Viết chương trình đầu vào a, b, n tính (a + b)n dùngtam giác Pascal và kết của hệ số đa thức. Chương trình có cấu trúcsau đây

Bước 1. Tính c0, c1, ..., cn dùng tam giác Pascal.

Bước 2. Tính và in ra

c0an + c1a

(n−1)b+ c2a(n−2)b2 + c3a

(n−3)b3 + · · ·+ cn−1ab(n−1) + cnbn.

Page 41: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

Chương 4

MÔ PHỎNG XÁC SUẤT

4.1 Khai báo loại dữ liệu cho đối số chươngtrình . . . . . . . . . . . . . . . . . . . . . . 83

4.2 Thử nghiệm xắc suất . . . . . . . . . . . . 85

4.3 Trò chơi quân bài . . . . . . . . . . . . . . 93

4.4 Một số ví dụ về mô phỏng xác suất . . . 100

4.5 Bài tập . . . . . . . . . . . . . . . . . . . . . 104

4.1 Khai báo loại dữ liệu cho đối số chươngtrình

Maple phân loại dữ liệu vào các dạng sau đây (có thể xem ?type).

84 Mô phỏng xác suất

! . And NotOr PLOT PL0T3D Point RangeRootOf TEXT algext ‘*‘ ‘+ ‘

algebraic anything algfun algnumalgnumext anyfunc complex arctrig arrayatomic boolean disjcyc complexcons constantcubic dependent exprseq equation evenevenfunc expanded function facint floatfraction freeof infinity hfarray identicalindexed indexedfun list integer intersectlaurent linear matrix listlist literallogical mathfunc negint minus monomialname negative numeric nonneg nonnegintnonposint nothing polynom odd oddfuncoperator point protected posint positiveprime procedure radext quadratic quarticradalgfun radalgnum radnumext radfun radfunextradical radnum relation range rationalratpoly realcons rgf-seq scalar

Những loại dữ liệu sau đây thường được sử dụng nhấtarray, numeric, integer, odd, even, positive, negative

Khi ta viết chương trình muốn mỗi đối số thuộc một dữ liệu nàođó để máy tính kiểm tra khi đưa dữ liệu vào. Ví dụ chương trìnhtìm số phần tư trong mảng số

xm, xm+1, ..., xn

Ta có thể dùng ba đối số m,n, x như là số nguyên, số nguyên vàmảng tương ứng. Khi đó ta có thể khai báo chương trình như sau:quartiles:=proc(m::integer, n::integer, x::array)Khi chương trình thực hiện, Maple tự động kiểm tra phần tử vàoxem có tương ứng với loại dữ liệu khai báo không? nếu không đúngMaple sẽ thông báo lỗi.

Ví dụ 4.1. Ví dụ sau tính căn bậc hai của của tổng ba số thực:

Page 42: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

4.2 Thử nghiệm xắc suất 85

>sqrt3:=proc(a::numeric, # đầu vào: số thựcb::numeric, # đầu vào: số thựcc::numeric, # đầu vào: số thựcans::evaln # đầu ra phải khai báo như loại "evaln"ans:=sqrt(a+b+c);

end;

> sqrt3(3,5,8,t);4

> sqrt3(s,5,7,ans);Error, sqrt3 expects its 1st argument, a, to be of type numeric, butreceived s

Chú ý khi khai báo đầu ra là một biến phải là evaln.

4.2 Thử nghiệm xắc suất

4.2.1 Giới thiệu

Trong xắc suất một thử nghiệm là một hoạt động hoặc một hànhđộng xảy ra với một kết quả nào đó, như trải quân bài xuống mặtbàn, ... Mỗi lần lặp lại một thử nghiệm ta gọi là một phép thử. Vídụ có ba quả bóng trắng và năm quả bóng đỏ trong hộp. Lấy mộtquả bóng từ trong hộp để người ta nhận biết màu của nó. Như vậyhành động rút bóng từ trong hộp là một thử nghiệm. Nếu người tatrả lại bóng sau khi rút khỏi bóng trong hộp thì thử nghiệm đượcgọi là rút bóng có trả lại. Nếu trường hợp này xảy ra thì ta có vôhạn cuộc thử nghiệm.

Nếu ta đặt câu hỏi sắc xuất của rút bóng có trả lại là bao nhiêukhi ta rút liên tiếp ba quả đều là màu đỏ? Về mặt lí thuyết cho kếtquả là p =

(

58

)3. Ta có thể lập chương trình mô phỏng thử nghiệmvà tính xắc suất của nó.

86 Mô phỏng xác suất

4.2.2 Sinh số thực ngẫu nhiên

Trong Maple có hàm số rand() sinh số nguyên dương 12 chữ sốngẫu nhiên. Chương trình sau đây sinh ra một số thực trong khoảng[a, b]:

# hàm sinh ra số ngẫu nhiên trong khoảng [a,b]real_ran:=proc( a::numeric, b::numeric )

local x;x:=rand();evalf( a+ (b-a)*x/999999999999 );

end;

Và chạy thử> s:=real_ran(-3,2);

s := 1.603124737

4.2.3 Sinh số nguyên ngẫu nhiên trong một khoảngnào đó

Muốn sinh ra một số nguyên trong một khoảng nào đó ta xâydựng hàm sau:

int_ran:=proc( m::integer, n::integer)round(evalf(m-0.5+(n-m+1)*rand()/999999999999))

end;

Kết quả là> k:=int_ran(l,52);

k := 50

> m:=int_ran(l,52);m := 8

Page 43: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

4.2 Thử nghiệm xắc suất 87

4.2.4 Ví dụ rút có trả lại

Giả sử trong hộp có 3 quả bóng trắng và 5 quả bóng đỏ. Ta cóthể đánh số từ 1 đến 3 cho các quả bóng trắng và cũng đánh số từ4 đến 8 cho các quả bóng đỏ. Rút ngẫu nhiên một quả bóng tronghộp, tương đương với lấy một số từ 1 đến 8 và như vậy sau đó taxác định được màu quả bóng. Do đó thử nghiệm rút một quả bóngcó thể mô phỏng bằng chương trình sau:

one_ball:=proc()local k;k:=int_ran(l,8);if k<=3 then

"white";else

"red";fi;

end;int_ran:=proc( m::integer, n::integer )

round(evalf(m-0.5+(n-m+l)*rand()/999999999999))end;

Ta chú ý rằng chương trình one_ball không cần một đầu vàonào. Chương trình int_rant được dùng như một chương trình concủa one_ball. Do đó nội dung của nó phải đi kèm ngay trong tranglàm việc để khi Maple đọc sẽ lấy vào tất cả hàm chính và hàm phụ.

Ta có thể thử nghiệm:> one_ball();

”white”

> one_ball();”red”

88 Mô phỏng xác suất

4.2.5 Ví dụ rút ba quả bóng không trả lại

Giả sử vẫn có 3 quả bóng trắng và 5 quả bóng đỏ trong hộp.Nếu ta rút k quả bóng từ hộp không trả lại, thì thử nghiệm của tacó thể mô phỏng bằng cách:

1. Đánh số các quả bóng từ 1 đến 8. Ba số đầu màu trắng cácsố còn lại là đỏ.

2. Rút k quả bóng từng quả một:

- Rút lần thứ nhất bóng từ 1 đến 8. Khi đó ta đổi quả bóng đãrút thành số 8 (= 8 − 1 + 1).

- Rút lần thứ hai bóng từ 1 đến 7. Khi đó ta đổi quả bóng đãrút thành số 7 (= 8 − 2 + 1).

- Rút lần thứ ba bóng từ 1 đến 6. Khi đó ta đổi quả bóng đã rútthành số 6 (= 8 − 3 + 1).

- Tổng quát, rút lần thứ j bóng từ 1 đến n=8-j+1. Khi đó ta đổiquả bóng đã rút thành số n , cho đến khi không đổi được nữa.

3. Biên dịch các số thành màu.

draw_k_ball:=proc(k::integer, # số bóng cần rútdraw::evaln # đầu ra: mầu các quả bóng

)local ball, i, j, n, m, temp;ball:=array(1..8); # hộp chứa bóngfor i to 3 do

ball[i]:="white";od;for i from 4 to 8 do

ball[i]:="red";od;draw:=array(1..k); # ổ chưa bóng đã rút ran:=8; # n là số bóng còn lại

Page 44: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

4.2 Thử nghiệm xắc suất 89

for j to k do # Rút từng quả mộtm:=int_ran(1,n); # rút số từ 1 đến ndraw[j] :=ball[m]; # lấy màuif m <> n and ball[m] <> ball[n] then

temp:=ball[m]; # chuyển bóng xuống cuốiball[m]:=ball[n]; # Đổi vào chỗ đã rút raball[n]:=temp;

fi;n:=n-1; # sưa lại n

od;end;

Thử nghiệm> draw_k_ball(3,ball):> eval(ball);

[”white”, ”red”, ”red”]

4.2.6 Ví dụ về tính xấp xỉ của xác suất

Nếu muốn tính xác suất của sự kiện rút 3 quả bóng không trảlại và cả ba quả đều là đỏ, ta có thể mô phỏng thử nghiệm n lần,đếm số lần thành công rút ra theo công thức

số lần rút ra thành công như ýn

là giá trị xác suất xấp xỉ.

# Chương trình mô phỏng tính xác suất rút k quả bóng không trả lại, trong hộp có 3 bóng#đầu vào: k số bóng cần rút#n là số phép thửdraw_test:=proc( k::integer, n::integer )

local i, j, count, ball, flag;ball:=array(1..k); # chứa bóng rút được

90 Mô phỏng xác suất

count:=0; # số đếmfor i to n do

draw_k_ball(k,ball); # rút k bóng không trả lạiflag:=0; # khởi tạo flag=0, giả sử thành côngfor j to k while flag=0 do # kiểm tra xem có tất cả đỏ không

if ball[j]="white" thenflag:=l; # quả bóng trắng

fi;od;

# tính những lần rút thành công cả ba quả đều đỏ (flag=0)if flag=0 then

count:=count+1;fi;

od;evalf(count/n); # tính xác suất

end;

draw_k_ball:=proc( k::integer, draw::evaln )local ball, i, j, n, m, temp;ball:=array(1..8);for i to 3 do

ball[i]:="white";od;for i from 4 to 8 do

ball[i]:="red";od;draw:=array(1..k);n:=8;for i to k do

m:=int_ran(1,n);draw[i] :=ball[m] ;if m <> n and ball[m] <> ball[n] then

temp:=ball[m];

Page 45: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

4.2 Thử nghiệm xắc suất 91

ball[m]:=ball[n];ball[n]:=temp;

fi;n:=n-1;

od;end;

int_ran:=proc( m::integer, n::integer )round(evalf(m-0.5+(n-m+1)*rand()/999999999999))

end;

Ta thử với số liệu> draw_test(3,300);

.1700000000

Xác suất chính xác là>evalf(5)-2/(2!)*(8!)));!

.1785714286

Bây giờ tăng số thử lên>draw.test(3,10000);

.1758000000

Vậy càng cho nhiều phép thử thì xác suất càng tiến gần tới giátrị của nó.

4.2.7 Ví dụ hai điểm trong hình vuông có khoảng cáchnhỏ hơn một

Cho hình vuông có cạnh 1 đơn vị. tính xác suất ném hai hòn đánhỏ trong hộp vuông này mà khoảng cách của chúng nhỏ hơn 1?Điều này rất khó tính toán chính xác. Ta có thể viết chương trìnhtính gần đúng chúng.

Một hình vuông có thể xem như tập hợp điểm {(x, y)|0 ≤ x ≤1 và 0 ≤ y ≤ 1} trong hệ tọa độ xy. Nắm ngấu nhiên hòn đá có thểbiểu diễn như điểm (x, y) trong tập này. Chương trình mô phỏng là

92 Mô phỏng xác suất

sinh ra hai tập số ngẫu nhiên x và y trong khoảng [0, 1].

#Chương trình tính xấp xỉ xác suất ném hai điểm có khoảng cách#đầu vào: num_of_trials số phép thử#đầu ra : xấp xỉ xắc suấttwo_pts:=proc(num_of_trials::integer)

local count, i, x1, y1, x2, y2, distance;if num_of_trials > 0 then

count:=0;for i to num_of_trials do

x1:=real_ran(0,1); # sinh ra điểm thứ nhấty1:=real_ran(0,1);x2:=real_ran(0,1); # sinh ra điểm thứ haiy2:=real_ran(0,1);

# Kiểm tra có nhỏ hơn 1distance:=evalf(sqrt( (x2-x1)^2+(y2-y1)^2));if distance < 1.0 then

count:=count+1;fi;

od;evalf(count/num_of_trials);

elseprint("invalid input");

fi;end;

real_ran:=proc(a::numeric,b::numeric)local x;x:=rand();evalf( a + (b-a)*x/999999999999 );

end;

> two_pts(500);0.9740000000

Page 46: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

4.3 Trò chơi quân bài 93

> two_pts(2000);0.9780000000

Đánh giá bằng công thức tổ hợp> (.98*500+0.967*2000)/2500;

0.9696000000Phép thử càng lớn thì càng chính xác> two_pts(10000);

0.9757000000

4.3 Trò chơi quân bài

4.3.1 Chương trình rút ngẫu nhiên k quân bài

Mục đích là mô phỏng rút ngẫu nhiên k quân bài. Như phầntrước ta phải có ba chương trình. Những chương trình này làm cácviệc sau đây:

1. Chương trình chính: lấy k số ngẫu nhiên khác nhau từ 1 đến52 bằng cách gọi hàm int_ran như hàm con của nó.

2. Mỗi số nhận được được dịch sang tương ứng với tên quân bàivà gọi chương trình con card làm việc đó.

#### chương trình chính ####Mô phỏng rút k quân bài trong bộ 52 quân#đầu vào: k là số quân cần rút#đầu ra: mản chứa tên quân bài rút đượcdraw_k_card:=proc(

k::integer, # số quân bài cần rúthand::evaln # tên quân bài

)local deck, i, m, n, temp;if k < 1 or k > 52 then # quick exit if k < 1 or k > 52

print("đối số thứ nhất từ 1 đến52");

94 Mô phỏng xác suất

RETURN();fi;hand:=array(1..k);deck:=array(1..52,[seq(i,i=1..52)]);n:=52;for i from 1 to k do

m:=int_ran(1,n);hand[i]:=deck[m];if m<>n then

temp:=deck[m];deck[m] :=deck[n] ;deck[n]:=temp;

fi;n:=n-1;

od;# Lấy tên quân bài

for i from 1 to k dom:=hand[i]; # lấy sốhand[i]:=card(m); # gọi chương trình con

od;end;

### chương trình con lấy số ngẫu nhiên###int_ran:=proc(m::integer,n::integer)

round(evalf(m-0.5+(n-m+l)*rand()/999999999999))end;

### chương trình con tên quân bài####đầu vào: m là số từ 1 đến 52#đầu ra: tên quân bàicard:=proc(m::integer)

local rank, suit;if m>0 and m<= 52 then %# quick exit if m is beyond 1-52

Page 47: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

4.3 Trò chơi quân bài 95

rank:= m mod 13; %# get numerical rank A-13)suit:=ceil(m/13); %# get numerical suit A-4)if suit=l then

suit:="heart";elif suit=2 then

suit:="spade";elif suit=3 then

suit:="diamond";else

suit:="club";fi;

# xác định cỡ rankif rank=1 then

rank:="ace";elif rank=11 then

rank:="jack"elif rank=12 then

rank:="queen"elif rank=0 then

rank:="king"fi; # trường hợp còn lại rank=2,3,4, ... 10,array(1..2,[rank,suit])fi;

end;

4.3.2 Ví dụ tính xác xuất rút k quân bài có ít nhấtmột quân át

Trong Maple chương trình mô phỏng tính xác suất có cấu trúctương tự như sau:

count:=0; đây là khởi tạo bộ đếm

for i from 1 to n do

96 Mô phỏng xác suất

Khối 1: Mô phỏng, thực hiện mô phỏng những thử nghiệm;

Khối 2: Kiểm tra, nếu count đúng thì thử nghiệm thành công;

od;

xác suất =evalf(count/n)

Như vậy ta luôn cần hàm int_ran và real_rand và một sốchương trình khác. Ví dụ hàm sau đây:

###Chương trình chính####Tính xác suất rút k quân bài có ít nhất 1 quân át#đầu vào: k số quân bài cần rút#n số phép thử#hàm draw_k_card là chương trình conk_card_get_ace:=proc(k::integer,n::integer)

local count, i, j, hand, flag;count:=0;for i from 1 to n do

#mô phỏng thử nghiệmdraw_k_card(k,hand);flag:=0; # khởi tạo flag=0, nghĩa là không có acefor j from 1 to k while flag=0 do

if hand[j] [1] = "ace" thenflag:=1;

fi;od;count:=count+flag;

od;evalf(count/n);end;###chương trình con#####draw_k_card:=proc( k::integer, hand::evaln)

local deck, i, m, n, temp;if k < 1 or k > 52 then

Page 48: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

4.3 Trò chơi quân bài 97

print("đối số đầu giữa 1 và 52");RETURN();

fi;hand:=array(1..k);

deck:=array(1..52,[seq(i,i=1..52)]);n:=52;for i from 1 to k dom:=int_ran(1,n);hand[i] :=deck[m];if m<>n thentemp:=deck[m];deck[m] :=deck[n];deck[n]:=temp;fi;n:=n-1;od;for i from 1 to k dom:=hand[i];hand[i]:=card(m);od;end;###Chương trình con###int_ran:=proc(m::integer,n::integer)

round(evalf(m-0.5+(n-m+1)*rand()/999999999999))end;###Chương trình con###card:=proc(m::integer)

local rank, suit;if m>0 and m<= 52 thenrank:= m mod 13;suit:=ceil(m/13);if suit=1 then

suit:="heart";

98 Mô phỏng xác suất

elif suit=2 thensuit:="spade";

elif suit=3 thensuit:="diamond";

elsesuit:="club";

fi;if rank=1 then

rank:="ace";elif rank=11 then

rank:="jack"elif rank=12 then

rank:="queen"elif rank=0 then

rank:="king"fi;array(1..2,[rank,suit])

fi;end;

Ta xét xác suất rút bốn quân bài có ít nhất một quân át với 400 lầnthử>k_card_get_ace(4,400);

.3125000000Xác suất chính xác tính theo lý thuyết la 15225

52129 = .2812632745.>k_card_get_ace(5,200);

.3100000000Xác suất chính xác tính theo lý thuyết la 1− 48!

5!43! 52!5!47!

= .3411580017.

>k_card_get_ace(5,500);.3480000000

Xác suất chính xác tính theo lý thuyết la 1522552129 = .2812632745.

Page 49: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

4.3 Trò chơi quân bài 99

4.3.3 Ví dụ tính xác xuất rút k quân bài có đúng mộtquân át

Chương trình dưới đây phần chương trình con bỏ qua, tương tựnhư chương trình phần trước.

> #Chương trình tính xác suất rút k quân bài có đúng một quân acek_card_get_1_ace:=proc(k::integer,n::integer)

local count, i, j, hand, num_of_ace;count:=0;for i from 1 to n dodraw_k_card(k,hand);num_of_ace:=0;for j from 1 to k do

if hand[j][1] = "ace" thennum_of_ace:=num_of_ace+1; # đếm số át

fi;od;if num_of_ace=1 then

count:=count+1; # đếm số thành côngfi;od;evalf(count/n);

end;

Ta xét trường hợp rút 4 quân với số lần khác nhau>k_card_get_l_ace(4,300);

.2766666667> k_card_get_l_ace(4,1000);

.2480000000

Xác suất đúng là 69184270725 = .2555. Nếu kết hợp 1300 lần thử

(.2766666667*300+.2480000000*1000)/1300.2546153846

100 Mô phỏng xác suất

4.4 Một số ví dụ về mô phỏng xác suất

4.4.1 Kiểm tra nhiễm HIV

Giả sử sự kiểm tra HIV là 99%. Nghĩa là sự chính xác được hiểunhư sau:

1. Nếu người mang virus HIV, thì người này có 0.99 xác suấtđược kiểm tra là dương tính và 0.01 xác suất là âm tính.

2. Nếu một người không mang virus HIV thì người đó có 0.99xác suất kiểm tra âm tính và 0.01 xác suất kiểm tra dương tính.

Người ta biết rằng 0.5% dân số mang virus HIV. Nếu một ngườinào đó kiểm tra HIV mà dương tính thì xác suất bao nhiều ngườiđó đã mang mầm bệnh HIV?

Bạn có thể chỉ ra cho người này với dự kiện là người ấy chỉ có 13

may mắn mang HIV. Hãy chứng minh bằng chương trình Maple.

Chương trình đòi hỏi mô phỏng một người trong cộng đồng nàođó kiểm tra HIV dương tính và tinhsxacs suất người đó có thể mangHIV.

Để mô phỏng người nào đó đẫ kiểm tra dương tính:

1. Sinh ra n quần chúng mà 5% trong chúng mắc bệnh HIV vànhững người còn lại vẫn khỏe.

2. Nhặt từng người ra để kiểm tra:

(a) Nếu người đó mang bệnh, 99% khả năng dương tính, 1% âmtính.

(b) Nếu người đó không mang bệnh, 99% âm tính và 1% dươngtính lặp lại cho đến khi gặp người mang HIV dương tính.

#Đầu vào: n số lần lặp lại thử nghiệm#Đầu ra tính xác suất xấp xỉ bị nhiễm HIV>true_hiv:=proc(n)

local count, i, j, k, u, s, result;

Page 50: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

4.4 Một số ví dụ về mô phỏng xác suất 101

count:=0; # Khởi tạo thành côngu:=array(1..200,["sick",seq("healthy",i=2..200)]);for i to n do

result:="negative"; # vòng lặp tìm được dương tínhwhile result="negative" do#lấy một người trong dân số

k:=int_ran(1,200);#thực hiện kiểm tra (như quay sổ số)

if u[k]="sick" thens:=int_ran(1,100); # lấy người ngẫu nhiênif s = 1 then

result:="negative" # 1 out 100 bị âm tínhelse

result:="positive"fi;

elses:=int_ran(1,100); # lấy ngẫu nhiênif s = 1 then

result:="positive" # 1 out 100 bị dương tínhelse

result:="negat ive"fi;

fi;od;

if u[k]="sick" thencount:=count+1

fi;od;evalf(count/n);

end;

int_ran:=proc(m::integer,n::integer)

102 Mô phỏng xác suất

round(evalf(m-0.5+(n-m+1)*rand()/999999999999))end;

Chạy thử chương trình này> true_hiv(500);

0.002000000000> evalf(99/298);

0.3322147651

4.4.2 Xác suất những người cô đơn trong một nhóm

Trong một nhóm k người, mỗi người được kết nghĩa với nhữngngười khác như là bạn. Nếu một người không kết nghĩa với ai thìngười này gọi là cô đơn. Tìm xác suất một người cô đơn?

Ta có thể dùng kết bạn một cách ngẫu nhiên là

# Đầu vào: k số người trong nhóm# n số phép thửlonesome:=proc( k::integer, n::integer )

local u, i, j, r, s, flag, count;u:=array(1..k); # tạo không gian cho mỗi ngườicount:=0; # đếm số người cô đơnfor i to n do # số lần thử nghiệm lặp lại

for j to k do # bắt đầu cho mỗi người cô đơnu[k] :="lonesome"

od;for j to k do # mỗi người kết bạn ngẫu nhiên# người kết bạn đầu tiên: rr:=j;while r=j do # không kết bạn chính mình

r:=int_ran(1,k); # người j kết bạnod;u[r]:="happy"; # r đã kết bạn hết cô đơn

Page 51: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

4.4 Một số ví dụ về mô phỏng xác suất 103

# kết bạn thứ hai: ss:=j;while s=j or s=r do # lặp cho đến khi gặp người mới

s:=int_ran(1,k)od;u[s]:="happy"; # người s đã kết bạn

od;# kiểm tra xem ai còn cô đơnflag:=0; #đã có bạnfor j to k while flag=0 do

if u[j]="lonesome" thenflag:=1

fi;od;if flag=1 then

count:=count+1fi;

od;evalf(count/n);end;

int_ran:=proc(m::integer,n::integer)round(evalf(m-0.5+(n-m+1)*rand()/999999999999))

end;

Thử nhóm 5 người trong 200 lần thử> lonesome(5,200);

.06000000000Thử nhóm 30 người trong 500 lần thử> lonesome(30,500);

.1180000000

104 Mô phỏng xác suất

4.5 Bài tập

Bài tập 4.1. Một đường tròn bán kính 1 ném trong một hình vuông2×2. Nếu người ta ném hình tròn vào hình vuông, thì xác suất hìnhtròn nằm trong hình vuông là π

4 . Nếu người ta lặp lại n lần thửnghiệm thì người ta tính được xác suất của nó nhân với 4 gần vớisố π. Đây là một cách tính số π nhưng không hiệu quả. Hãy viếtchương trình dùng thuật toán ở trên để tính gần đúng π với đầuvào n số thử nghiệm.

Bài tập 4.2. Viết chương trình tính xác suất rút k quân bài cócùng chất. Xác suất chính xác là 413!(52−k)!

(13−k)!52! .

Bài tập 4.3. Trong hộp có 4 quả bóng trắng và 8 quả bóng đỏ.Viết chương trình tính xác suất rút k quả bóng không trả lại và tấtcả quả bóng đều là đỏ.

Bài tập 4.4. Dùng chương trình trong HIV tìm xác suất mà ngườibị kiểm tra là âm tính nhưng người này lại thực sự khỏe.

Bài tập 4.5. Có 15 người con trai và 10 người con gái. Mỗi ngườicon trai sẽ làm bạn với một người con gái. Tuy nhiên, có thể mộtsố người con trai muốn chọn bạn cùng một người con gái. Tìm xácsuất mà ít nhất một người con gái cô đơn?

Bài tập 4.6. Có k người trong một nhóm và cả bạn nữa là mộttrong số đó, bạn được gọi là số # 1. Mỗi người làm bạn với hai ngườikhác. Nếu bạn chọn một người bạn mà người đó lại cũng chọn chínhbạn là bạn thì gọi là bạn tâm giao. Tìm xác suất bạn có thể tìmthấy cặp tâm giao của mình.

Page 52: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

Chương 5

HỆ PHƯƠNG TRÌNHĐƠN GIẢN

5.1 Giải phương trình . . . . . . . . . . . . . . 1055.2 Ví dụ về bài toán hỗn hợp phần trăm . . 1075.3 Đường thẳng sát nhất . . . . . . . . . . . . 108Danh mục từ khóa . . . . . . . . . . . . . . . . . 110

5.1 Giải phương trình

5.1.1 Lệnh của Maple

Trong Maple hàm solve dùng để giải phương trình. Hãy xemhướng dẫn bằng lệnh >?solve. Cú pháp chung để giải phương trìnhlà>solve(<phương trình>, <tệp biến>);

106 Hệ phương trình đơn giản

Ví dụ để giải phương trình 5x + π = 9 có lệnh> solve(5*x+Pi=9,x); −1

5π + 95

Hoặc một cách khác > eqn:=5*x+Pi=9: variable:=x:> solve(eqn,variable);

−15π + 9

5

Để giải hệ phương trình ta có mẫu>solve({<các phương trình>}, {<các biến>})Ví dụ giải hệ phương trình sau:

{

3x + 6y = 5

4x − 5y = 3

> equations:={ 3*x+6*y=5,4*x-5*y=3};equations := {3x + 6y = 5, 4x¯5y = 3}

> variables:={x,y};variables := x, y

> solve(equations,variables);{y = 11

39 , x = 4339}

Muốn sử dụng được nghiệm phải dùng lệnh gán vào các biếnnghiệm. Ví dụ cho hệ phương trình>equations:={a*x+b*y+c*z=d, e*x+f*y+g*z=h, i*x+j*y+k*z=l};

equations := {ax + by + cz = d, ex + fy + gz = h, ix + jy + kz = 1}variables:={x,y,z};

variables := {x, y, z}solutions:=solve(equations,variables);solutions := {z = jed−ajh+afl−fid−ebl+ibh

afk−ajg−ebk+jec−fic+ibg,

y = − agl−ahk−ecl−gid+hic+edkafk−ajg−ebk+jec−fic+ibg

,

x = bgl−bhk+cjh−cfl+dfk−djgafk−ajg−ebk+jec−fic+ibg

}assign(solutions);x; y; z;bgl−bhk+cjh−cfl+dfk−djgafk−ajg−ebk+jec−fic+ibg

− agl−ahk−ecl−gid+hic+edkafk−ajg−ebk+jec−fic+ibg

jed−ajh+afl−fid−ebl+ibhafk−ajg−ebk+jec−fic+ibg

Page 53: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

5.2 Ví dụ về bài toán hỗn hợp phần trăm 107

5.2 Ví dụ về bài toán hỗn hợp phần trăm

Một hóa chất hỗn hợp có 11% axit trộn với hỗn hợp 4%. Hỏicần mỗi loại bao nhiêu mỗi loại hỗn hợp để được hỗn hợp axit 700mililit với 6%. Bài toán tổng quát hơn, nếu người ta muốn trộn hỗnhợp a% và hooanx hợp b% để được hỗn hợp c% với dung lượng s.Cho x và y là số lượng hỗn hợp cần phải trộn. Thì bài toán đi vềgiải phương trình sau đây:

{

x + y = s

ax + by = cs

Ta có thể làm chương trình để tính số lượng của mỗi loại hỗn hặp.

#đầu vào: a, b, c, s như mô tả trên#đầu ra: x khối lượng của a#y khối lượng của of bmix_2_solutions:=proc( a::numeric,b::numeric,c::numeric,s::numeric,x::evaln,y::evaln )local equations, variables, solutions;equations:={ x + y = s, a*x+b*y=c*s }; # định nghia phương trìnhvariables:={ x, y }; # định nghĩa biếnsolutions:=solve( equations, variables ); # giải phương trìnhassign( solutions ); # gán nghiệm vào x, yend;

Thử với các số:> mix_2_solutions(11,4,6,700,x,y);

108 Hệ phương trình đơn giản

> x; y;200 500

5.3 Đường thẳng sát nhất

Người ta cho một dãy số liệu:x:=array(1..5,[1,2,3,4,5]);y:=array(1..5,[4.1,4.4,5.1,5.5,5.7]);Thiết lập dãy điểm points:=[ seq( [x[i],y[i]], i=1..5 ) ]:Ta có thể vẽ đồ thị:plot(points,style=point); Câu hỏi đặt ra là đường thẳng nào

5.2

4.4

54321

5.6

4.8

Hình 5.1:

là tốt nhất đi qua các điểm này?

Nghĩa là ta không biết y = g(x). Để đơn giản ta cho đường đólà một đường thẳng có dạng

y = ax + b

và ta cố gắng tím a và b.

Ta biết rằng phương trình đường thẳng y = ax+ b với a là hệ sốnghiêng và số b là điểm cắt trục tung. Tại mỗi điểm xi, i = 1, 2, ..., 5

Page 54: Lời nói đầu Mục lục - downloads.tuxfamily.netdownloads.tuxfamily.net/viettug/vietex/doc/Scientific.pdf · 3.2 Một số độ đo thống kê ... 4 Mô phỏng xác suất

5.3 Đường thẳng sát nhất 109

hiệu giữa dữ liệu và đường thẳng là

yi − (axi + b), i = 1, 2, 3, 4, 5.

Ta có thể xác định tốt nhất sao cho

5∑

i=1

[yi − (axi + b)]2

có giá trị nhỏ nhất. Một cách tổng quát với dữ liệu xi, yi i = m, ..., n,ta cố gắng tìm a và b sao cho hàm số

f(a, b) =

n∑

i=m

[yi − (axi + b)]2

là nhỏ nhất.

Ta biết rằng điều kiện cần cho một hàm đặt cực tiểu là tất cảcác đạo hàm bậc nhất của nó bằng 0. Hàm f(a, b) là hàm hai biếnnên nó có cực tiểu khi ∂

∂af và ∂

∂bphải bằng 0. Do đó

−2

(

n∑

i=m

[yi − (axi + b)]xi

)

= 0

−2

(

n∑

i=m

[yi − (axi + b)]

)

= 0

Đơn giản hóa còn(

n∑

i=m

x2i

)

a +

(

n∑

i=m

xi

)

b =n∑

i=m

xiyi (5.1)

(

n∑

i=m

xi

)

a + (n − m + 1)b =

n∑

i=m

yi (5.2)

Bằng cách giải phương trình với a và b ta tìm được đường sát nhất.>line_fit(1,5,x,y,a,b);

110 Danh mục từ khóa