1. Trang chủ
  2. » Luận Văn - Báo Cáo

Cơ sở và các thuật toán trong Khớp đường cong bằng phương pháp bình phương nhỏ nhất

14 963 2
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Cơ Sở Và Các Thuật Toán Trong Khớp Đường Cong Bằng Phương Pháp Bình Phương Nhỏ Nhất
Người hướng dẫn Thầy Dương Thăng Long
Trường học Khoa Công Nghệ Tin Học
Chuyên ngành Công Nghệ Tin Học
Thể loại thực tập tốt nghiệp
Định dạng
Số trang 14
Dung lượng 90 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Cơ sở và các thuật toán trong Khớp đường cong bằng phương pháp bình phương nhỏ nhất

Trang 1

Lời nói đầu

Ngày nay thế giới chúng ta đã và đang là kỷ nguyên của sự bùng nổ thông tin Trong thời đại ngày nay khoa học kỹ thuật ngày một đợc ứng dụng rộng rãi khắp mọi nơi trong mọi lĩnh vực, mọi nghành nghề và tin học phát triển không ngừng từng giây, từng phút.Máy tính điện tử đơc sử dụng ,khai thác triệt để trong mọi công việc , nh trong hàng không , quân sự , ngân hàng ,đo lờng , tính toán , và nó cũng đợc sử dụng để giải quyết các bài toán

từ đơn giản đến phức tạp.Đề tài thực tập tốt nghiệp này cũng đựơc áp dụng để thực hiện , tên đề tài: Cài đặt bài toán:"Khớp đờng cong" bằng phơng pháp bình phơng nhỏ nhất.

Để hoàn thành đề tài tốt nghiệp này, bên cạnh nỗ lực của bản thân em còn nhận đợc sự giúp quý báu của các thầy, cô và các bạn.

Em xin chân thành cảm ơn thầy Dơng Thăng Long đã tận tình hớng dẫn

em trong suốt quá trình thực hiện đề tài.

Cảm ơn khoa Công nghệ tin học đã tạo mọi điều kiện giúp đỡ em trong suốt quá trình học tập ở trờng và các thầy cô đã hết lòng truyền đạt cho em những kiến thức và kinh nghiệm quý giá Cũng nh tất cả các bạn đã cùng trao

đổi giúp đỡ nhau trong quá trình học tập.

Trang 2

Cơ sở và các thuật toán trong đề tài

"Khớp đờng cong" bằng phơng pháp bình

phơng nhỏ nhất

1 Cơ sở:

Khi những giá trị dữ liệu không chính xác, thờng ta cần phải tởng tợng

ra hình dạng của hàm khớp và dữ liệu Hàm này có thể phụ thuộc một tham số.

f(x) = f(c1,c2 , cM, x)

và thủ tục điều chỉnh đờng cong là tìm cách chọn các tham số nào khớp nhất với các giá trị quan sát đợc ở các điểm đã cho Nếu hàm là một đa thức (với tham số là những hệ số) và các giá trị là chính xác thì đây chính là phép nội suy Nhng ta đang xét những hàm tổng quát hơn và dữ liệu không đúng.

Để giản đơn hoá vấn đề, ta tập trung vào việc nối những hàm là tổ hợp tuyến tính của hàm đơn giản hơn, với các tham số ẩn là các hệ số:

f(x) = c1f1(x) + c2f2(x) + +cMfM(x) Hàm này bao hàm hầu hết các hàm mà ta quan tâm Sau khi nghiên cứu xong trờng hợp này, ta sẽ xét đến những hàm tổng quát hơn.

Một các phổ thông để đo mức độ tốt của hàm nối là tiêu chuẩn bình

ph-ơng tổng quát ở đây sai số đợc tính bằng cách thêm vào bình phph-ơng sai số ở mỗi điểm quan sát đợc.

E = Z (f(xj) - ỵ)2

Đây là một phép đo rất tự nhiên: bình phơng đợc thực hiện để làm khử các ớc lợc giữa các sai số với các số hiệu khác nhau Hiển nhiên, điều ngời ta mong muốn nhất là tìm ra một phép chọn các tham số sao cho tối thiểu hoá E.

Điều này khiến phép chọn có thể đợc tính có hiệu qủa; đây là phơng pháp bình phơng nhỏ nhất, phơng pháp này đúng nh định nghĩa của nó Để đơn giản hoá

đạo hàm, xét trờng hợp M=2, N=3 Giả sử có ba điểm x1, x2,x3 và các giá trị

t-ơng ứng y1,y2,y3 thoả hàm có dạng:

f(x) = (c1f1(x1) + c2f2(x1) - y1)2

+ (c1f1(x2) + c2f2(x2) - y2)2

+ (c1f1(x3) + c2f2(x3) - y3)2

Để tìm các phép chọn của c1 và c2 sao chỏ tối tiểu hoá sao số này, đơn gian chỉ cần gán zero các đạo hàm dE/dc1 và dE/dc2 Với c1 ta có :

dE/dc1 = 2(c1f1(x1) + c2f2(x1) - y1)2 f1(x1)

+ (c1f1(x2) + c2f2(x2) - y2)2 f2(x2) + (c1f1(x3) + c2f2(x3) - y3)2 f3(x3) Việc gán đạo hàm bằng zero cho ra phơng trình có biến là c1 và c2 phải thoả (f1(x1), là các "hằng số" có trị biết trớc).

c1(f1(x1)f1(x1) + f1(x2)f1(x2) + (f1(x3)f1(x3) + c2(f2(x1)f1(x1) + (f2(x2)f1(x2) + (f2(x3)f1(x3))

= y1f1 (x1) + y2f1 (x2) + y3f1 (x3)

Ta có phơng trình tơng tự, khi gán đạo hàm dE/dc2 về zero

1 j

N

Trang 3

Giả sử đa thức xấp xỉ bậc m của f là P(x) = j=0 Cjx

với Cj (j = O1m) xác định từ hệ 0C0 +1C1 + + mCm = t0

1C0 +2C1 + + m+1Cm = t1

mC0 +m+1C1 + + 2mCm = tm

Trong đó k =  x (k= 0,2m)

ti =  x f (x) (i = o1m)

với Cj (j = 0,m) xác định từ hệ phơng trình trên trong đó.

2 Các thuật toán dùng trong chơng trình Cài đặt bài toán: "Khớp đờng cong" bằng phơng pháp bình phơng nhỏ nhất

2.1 Nhập dữ liệu

+ nhập từ file:

Nhập các toạ độ xi , yi vào máy toạ độ, số điểm n, bậc m của đa thức.

- hỏi xem có ghi vào file không nếu hỏi nhập tên tên file ghi dữ liệu vào file đó.

+ nhập từ file:

yêu cầu nhập vào tên file, đọc file Read (f,n,m) nạp các qt từ file vào hai mảng toạ độ do x, toạ độ y

For i = 1-> n

Read (f, toạ độ x[i], toạ độ y[i])

2.2 Tính mảng

-Tính toán các hệ số của mảng

a[i] [j], b[i] theo hệ pt (1)

2.3.Dùng phơng pháp gauss và thuật toán sytru giải hệ pt (1)

Thuật toán gauss (Đa ma trận về dạng tam giác )

no

2

Gauss

Input n, (ại)1n; (bi)1n

IER = 0

a

kk  0

P

i=a

ik/a

kk

k= 1, 2, ,n

i= k + 1, , n

j= k + 1, , n

a

ỵj = p

ia

kj

b

i = b

i - p

ib

k

Print (x

i)

1 n

Trang 4

yes

Trang 5

thuËt to¸n Sytru (gi¶i hÖ ph¬ng tr×nh d¹ng tam gi¸c)

no

yes

no

yes

2.4 X©y dùng hµm tÝnh gi¸ trÞ

2.4.1 Hµm tÝnh luü thõa

Fuction luü thõa (x: Real; n: integer): real.

S : Real

i : integer

S = 1

For i = 1  n

S = S*x

Return S.;

2.4.2 X©y dùng hµm tÝnh f(x)

IRE = 1

Procedure

Input n, {b

i}

1 n

, a

ij (1 i  j  n)

IER = 0

a

nn  0

x

n = b

n / a

nn

i = n-1, n-2, ,1

S = b

i

j = i + 1, , n

S = S - a

ijx

ij

a

ij  0

x

i = S/a

ij

Return

Procedure

Input n, {b

i}

1 n

, a

ij (1 i  j  n)

IER = 0

a

nn  0

x

n = b

n / a

nn

i = n-1, n-2, ,1

S = b

i

j = i + 1, , n

S = S - a

ijx

ij

a

ij  0

x

i = S/a

ij

Return

Trang 6

For i = m  0

S = S + C (i + 1) + luỹ thừa (x, i)

3 Vẽ đồ thị

3.1 Tìm xmin , xmax , ymin , ymax ,trong toàn đồ thị và các điểm nhập vào xác định

kx , xy

Kx = (Lmax - Lmin)/ (xmax - xmin)

K

y

=

vẽ đồ thị từ điểm

x1-> x2 , x = x1,

i = 0

while x<x2

i = i + 1

Begin

x = x1 + x2 i/ kx

yvẽ = H max- (f(x) - ymin)*xy

if'i = 1 -> move to (i + lmin, yvẽ)

ESC line to (i + lmin, yvẽ)

+ vẽ trục, toạ độ

+ vẽ các điểm nhập vào

For i = 1 -> n

Begin

x = kx + (toạ độ x[i]) - ymin)

y vẽ = Hmax - (Toado y[i]) - ymin)*ky

vẽ điểm (x+lmin, yvẽ, toạ độ x[i], toạ độ y[i]);

4 Chơng trình bằng phơng pháp bình phơng

Mã nguồn

uses crt,graph;

const Hmin=150;

Lmin=200;

Hmax=480-Hmin;

Lmax=640-Lmin;

Type mang2=array[1 20,1 20] of real;

mang1=array[1 20] of real;

mang_diem=array[1 20] of real;

var

a:mang2;

(ymax - ymin)

(Hmax - H min)

Trang 7

n,m:integer;

toadox,toadoy:mang_diem;

c:mang1;

ok:boolean;

r:real;

(* -*)

procedure hien_mang(so:integer;a:mang2;b:mang1);

var i,j:integer;

Begin

{for i:=1 to so do

begin

for j:=1 to so do

write(a[i,j]:0:2,' ');

write(' | ',b[i]:0:2);

writeln;

end; }

End;

(* -*)

function luythua(x:real;n:integer):real;

var

i:integer;

s:real;

Begin

s:=1;

if n>0 then

for i:=1 to n do

s:=s*x;

luythua:=s;

End;

(* -*)

procedure nhap_tu_ban_fim(var n,m:integer;var

toadox,toadoy:mang_diem);

var

i:integer;

x,y:real;

ch:char;

tenfile:string;

f:text;

Begin

textcolor(14);

textbackground(1);

window(1,1,80,24);

clrscr;

write('Nhap vao so diem:');readln(n);

writeln('Nhap vao cac diem:');

for i:=1 to n do

begin

write('vao toa do cua diem ',i,' x=');readln(toadox[i]); write('vao toa do cua diem ',i,' y=');readln(toadoy[i]); end;

write('Nhap vao so bac:');readln(m);

Trang 8

Writeln('Nhap Du Lieu OK !');

repeat

Write('Ban CO Muon Ghi Du Lieu Vao File Khong (C/K)?:'); ch:=readkey;

until upcase(ch) in['C','K'];

writeln;

if upcase(ch)='C' then

Begin

write('Moi nhap vao ten file:');

readln(tenfile);

assign(f,tenfile);

{$I-}

rewrite(f);

if IOResult <>0 then

begin

gotoxy(30,10);

Writeln('File not found');

readln;

exit;

end;

{$I+}

writeln(f,n,' ',m);

for i:=1 to n do

write(f,toadox[i],' ',toadoy[i],' ');

close(f);

Writeln('Nhap File OK !');

readkey;

end;

end;

(* -*)

procedure nhap_tu_file(var n,m:integer;

var toadox,toadoy:mang_diem);

var f:text;

tenfile:string;

i:integer;

Begin

n:=0;

m:=0;

write('Moi nhap vao ten file:');

readln(tenfile);

assign(f,tenfile);

{$I-}

reset(f);

if IOResult <>0 then

begin

gotoxy(30,10);

Writeln('File not found');

readln;

exit;

end;

{$I+}

readln(f,n,m);

Trang 9

for i:=1 to n do

read(f,toadox[i],toadoy[i]);

close(f);

Writeln(' Nhap Tu File Ok !');

readkey;

End;

(* -*)

procedure tinh_mang;

var i,j,dem:integer;

so:array[0 200] of real;

Begin

dem:=0;

for i:=0 to 2*m do

begin

so[i]:=0;

for j:=1 to n do

so[i]:=so[i]+luythua(toadox[j],i);

end;

for i:=0 to m do

begin

dem:=i*2-1;

for j:=i to m do

begin

dem:=dem+1;

a[i+1,j+1]:=so[dem];

a[j+1,i+1]:=so[dem];

end;

end;

for i:=0 to m do

begin

b[i+1]:=0;

for j:=1 to n do

b[i+1]:=b[i+1]+toadoy[j]*luythua(toadox[j],i);

end;

End;

(* - Giai Phuong Trinh -*) procedure gauss(m:integer;a:mang2;b:mang1;

var nghiem:mang1;var ok:boolean);

var

k,i,j:integer;

s:real;

mi:mang1;

Begin

ok:=true;

for i:=1 to m+1 do

Begin

if a[i,i]=0 then begin ok:=false;exit;end;

for j:=i+1 to m+1 do

mi[j]:=a[j,i]/a[i,i];

for j:=i+1 to m+1 do

begin

for k:=1 to m+1 do

Trang 10

a[j,k]:=a[j,k]-a[i,k]*mi[j];

b[j]:=b[j]-b[i]*mi[j];

end;

End;

(* -Sytru -*)

nghiem[m+1]:=b[m+1]/a[m+1,m+1];

for i:=m downto 1 do

Begin

s:=b[i];

for j:=i+1 to m+1 do

s:=s-a[i,j]*nghiem[j];

nghiem[i]:=s/a[i,i];

end;

End;

(* -*)

function f(x:real;n,m:integer;c:mang1):real; var s:real;

i:integer;

Begin

s:=0;

for i:=m downto 0 do

s:=s+c[i+1]*luythua(x,i);

f:=s;

End;

(* -*)

Procedure Tinh_Min_Max_X_Y_(n,m:integer;c:mang1; var kx:real;var xmin,xmax,ymin,ymax:real);

var i,j:integer;

x:real;

Begin

xmin:=toadox[1];

xmax:=toadox[1];

ymin:=toadoy[1];

ymax:=toadoy[1];

for i:=1 to n do

begin

if xmin>toadox[i] then xmin:=toadox[i];

if xmax<toadox[i] then xmax:=toadox[i];

if ymin>toadoy[i] then ymin:=toadoy[i];

if ymax<toadoy[i] then ymax:=toadoy[i];

end;

i:=0;

if xmax<>xmin then

begin

kx:=abs((lmax-lmin)/(xmax-xmin));

while x<xmax do

begin

i:=i+1;

x:=xmin+(i/kx);

if ymin>f(x,n,m,c) then ymin:=f(x,n,m,c);

if ymax<f(x,n,m,c) then ymax:=f(x,n,m,c);

end;

Trang 11

End;

(* -*)

procedure draw_point(x,y:integer;x1,y1:real); var i:integer;

s1,s2:string;

Begin

setcolor(13);

line(x-2,y-2,x+2,y+2);

line(x+2,y-2,x-2,y+2);

if(x>320) then i:=10 else i:=-100;

Str(x1:0:1,s1);

Str(y1:0:1,s2);

s1:='('+s1+','+s2+')';

outtextxy(x+i,y,s1);

End;

(* -*)

Procedure Ve_do_thi(n,m:integer;c:mang1);

Var

kx,ky:real;

x,yve,xmin,xmax,ymin,ymax:real;

i,j:integer;

gd,gm:integer;

s1,s2:string;

Begin

Tinh_Min_Max_X_Y_(n,m,c,kx,xmin,xmax,ymin,ymax); gd:=detect;

initgraph(gd,gm,'');

setfillstyle(1,0);

bar(0,0,getmaxx,getmaxy);

if ymin<>ymax then

begin

i:=0;

ky:=abs((hmax-hmin)/(ymax-ymin));

setcolor(13);

x:=xmin;

if xmin<>xmax then

begin

(* Ve do Thi *)

x:=xmin;

setcolor(14);

i:=0;

while x<xmax do

Begin

x:=xmin+i/kx;

yve:=hmax-(f(x,n,m,c)-ymin)*ky;

if i=0 then

moveto(lmin,round(yve));

lineto(lmin+i,round(yve));

inc(i);

end;

Trang 12

for i:=1 to n do

Begin

x:=kx*(toadox[i]-xmin);

yve:=hmax-(toadoy[i]-ymin)*ky;

draw_point(round(x+lmin),round(yve),toadox[i],toadoy[i]); end;

if round((-xmin)*kx)+lmin<640 then

if round((-xmin)*kx)+lmin>=0 then

begin

setcolor(15);

yve:=hmax-(ymax-ymin)*ky;

line(round((-xmin)*kx)+lmin,5,round((-xmin)*kx+lmin),480);

line(round((-xmin)*kx)+lmin,5,round((-xmin)*kx)+lmin-3,5+3);

line(round((-xmin)*kx)+lmin,5,round((-xmin)*kx)

+lmin+3,5+3);

setcolor(13);

outtextxy(round((-xmin)*kx)+lmin+10,20,'Y');

end;

yve:=hmax+(ymin)*ky;

(* Ve truc Hoanh *)

if (yve>0)and(yve<480) then

begin

setcolor(15);

line(5,round(yve),639,round(yve));

line(639,round(yve),639-3,round(yve)+3);

line(639,round(yve),639-3,round(yve)-3);

setcolor(13);

outtextxy(600,round(yve)-20,'X');

end;

End

else line(320,hmin,320,hmax);

end

else

Begin

if xmin<>xmax then

line(lmin+10,240,lmax-10,240)

else putpixel(320,240,14);

End;

readkey;

closegraph;

End;

(* -*)

procedure Menu;

var

ch:char;

i:integer;

Begin

gotoxy(10,3);

Writeln('Chuong Trinh Khop Ham so Bang Phuong Phap Binh Phuong Nho Nhat');

Trang 13

Writeln(' - =o0o= -');

gotoxy(30,5);

Writeln(' 1 Nhap Du Lieu Tu Ban Phim '); gotoxy(30,6);

Writeln(' 2 Nhap Tu File '); gotoxy(30,7);

Writeln(' 3 Xem Cac He So '); gotoxy(30,8);

Writeln(' 4 Ve Do Thi '); gotoxy(30,9);

Writeln(' 5 Thoat Khoi Chuong Trinh '); gotoxy(25,11);

Write('Ban Hay Chon Mot Trong Cac So:');

repeat

ch:=readkey;

case ch of

'1':begin

clrscr;

nhap_tu_ban_fim(n,m,toadox,toadoy); Writeln('Nap Du Lieu Ok !');

tinh_mang;

gauss(m,a,b,c,ok);

Readln;

exit;

end;

'2':begin

clrscr;

nhap_tu_file(n,m,toadox,toadoy);

Writeln('Nap Du Lieu Ok !');

tinh_mang;

gauss(m,a,b,c,ok);

Readln;

exit;

end;

'3':begin

clrscr;

if n>0 then

begin

hien_mang(m+1,a,b);

for i:=m+1 downto 1 do

writeln('c[',i,']:',c[i]:0:4);

end

else

Writeln('Ban Chua Vao Du Lieu !'); readkey;

exit;

end;

'4':begin

clrscr;

if (n>0)then

Trang 14

begin

if ok then

ve_do_thi(n,m,c)

else Writeln('Khong the khop ham'); end

else Writeln('Ban Chua Nap Du Lieu'); readkey;

exit;

end;

'5':halt(1);

end;

until false;

End;

(* - Chuong Trinh Chinh -*) Begin

n:=0;

m:=0;

repeat

textcolor(14);

textbackground(1);

clrscr;

menu;

until false;

End

Ngày đăng: 24/04/2013, 16:20

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w