Автор работы: Пользователь скрыл имя, 15 Декабря 2013 в 15:13, курсовая работа
В данной курсовой работе представлены алгоритмы и программное обеспечение, реализующее решение полиномиального интерполирования методами Ньютона, Гаусса и Стирлинга.
Программное обеспечение разработано в среде программирования Delphi.
Аннотация 3
Введение 4
1. Постановка задачи 5
2. Описание метода полиномиальной интерполяции 6
3. Блок-схема программного обеспечения 7
4. Исходные тексты основных процедур программы. 7
5. Результаты численных экспериментов. 9
Заключение 11
Список используемых источников 12
Министерство образования Российской Федерации
Сибирский Государственный Технологический Университет
Факультет: Автоматизации и информационных технологий
Кафедра: Системотехники
Курсовая работа
Полиномиальная интерполяция
Гаусса, Ньютона, Стирлинга
Руководитель:
____________ Ващенко Г.В.
(подпись)
_______________________
(оценка, дата)
Разработал:
студент гр. 22-6
____________ Русинов Д.В.
(подпись)
____________ Коннов Е.А.
(подпись)
_______________________
Содержание
В данной курсовой работе представлены алгоритмы и программное обеспечение, реализующее решение полиномиального интерполирования методами Ньютона, Гаусса и Стирлинга.
Программное обеспечение
разработано в среде
В данной курсовой работе были разработаны алгоритм и программа для решения задачи полиномиального интерполирования. В общем виде задача интерполирования формулируется следующим образом:
для таблично заданной функции f требуется найти достаточно простую известную функцию p, удовлетворяющую соотношениям
p(xi)=yi (i=0,1,2, …, n)
Для таблично задаваемых функций требуется составить алгоритм и программное обеспечение для реализации конечноразностных интерполяционных формул Ньютона, Гаусса и Стирлинга.
Пусть функция y=f(x) задана на сетке равноотстоящих узлов xi=xo+ih, где i=0, 1,…, n, и для неё построена таблица конечных разностей.
Будем строить интерполяционный многочлен Pn(x) в форме:
Pn(x)=a0+a1(x-x0)+a2(x-x0)(x-x
Можно показать, что ak=
Позволяет пользователю задавать размерность таблицы, выбирать крайние точки и
задавать табличную функцию.
procedure TForm1.Button1Click(Sender: TObject);
begin
x0:=strtofloat(EditXo.text);
h:=(Strtofloat(EditXn.Text)-
For i:=0 to n do
y[i]:=strtofloat(setka.Cells[
PN1:=PolyNuton1;
PN2:=PolyNuton2;
for i:=0 to n do
y[i-(n div 2)]:=y[i];
x0:=x0+(n div 2)*h;
PG1:=PolyGauss1;
PG2:=PolyGauss2;
PS:=PolyStirling;
With Polynoms do
begin
Cells[1,0]:=PN1; Cells[1,1]:=PN2;
Cells[1,2]:=PG1; Cells[1,3]:=PG2;
Cells[1,4]:=PS;
end;
DrawGraph;
end;
Function PolyNuton1:string;
Function PolyNuton2:string;
Function PolyGauss1:string; функции вычисления полиномов в текстовом виде
Function PolyGauss2:string;
Function PolyStirling:string;
Function PolyN1(x:extended):extended;
Function PolyN2(x:extended):extended;
Function PolyG1(x:extended):extended;
Function PolyG2(x:extended):extended;
Function PolyS(x:extended):extended;
procedure TForm1.Button1Click(Sender: TObject);
begin
x0:=strtofloat(EditXo.text);
h:=(Strtofloat(EditXn.Text)-
For i:=0 to n do
y[i]:=strtofloat(setka.Cells[
PN1:=PolyNuton1;
PN2:=PolyNuton2;
for i:=0 to n do
y[i-(n div 2)]:=y[i];
x0:=x0+(n div 2)*h;
PG1:=PolyGauss1;
PG2:=PolyGauss2;
PS:=PolyStirling;
With Polynoms do
begin
Cells[1,0]:=PN1; Cells[1,1]:=PN2;
Cells[1,2]:=PG1; Cells[1,3]:=PG2;
Cells[1,4]:=PS;
end;
DrawGraph;
end;
Procedure DrawGraph - процедура рисования графиков
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, Math, StdCtrls, Spin,StrUtils, ExtCtrls;
type
TArray=array[-100..200] of extended;
TForm1 = class(TForm)
Setka: TStringGrid;
SpinEditn: TSpinEdit;
Label1: TLabel;
Label2: TLabel;
EditXo: TEdit;
Label3: TLabel;
EditXn: TEdit;
Button1: TButton;
Polynoms: TStringGrid;
Image1: TImage;
CheckN1: TCheckBox;
CheckN2: TCheckBox;
CheckG1: TCheckBox;
CheckG2: TCheckBox;
CheckS: TCheckBox;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure EditXnExit(Sender: TObject);
procedure EditXoExit(Sender: TObject);
procedure SpinEditnKeyPress(Sender: TObject; var Key: Char);
procedure SpinEditnExit(Sender: TObject);
procedure PolynomsKeyPress(Sender: TObject; var Key: Char);
procedure CheckN1Click(Sender: TObject);
private
Function Fact(n:longint):longint; //ôàêòîðèàë
Function C(n,k:integer):extended; //Ñ èç n ïî k
Function Delta(k:integer;y:Tarray;i:
Procedure ZapX; //çàïîëíèòü ñòðîêó ñ x-ìè
Function PolyNuton1:string;
Function PolyNuton2:string;
Function PolyGauss1:string;
Function PolyGauss2:string;
Function PolyStirling:string;
Function PolyN1(x:extended):extended;
Function PolyN2(x:extended):extended;
Function PolyG1(x:extended):extended;
Function PolyG2(x:extended):extended;
Function PolyS(x:extended):extended;
Procedure DrawGraph;
public
{ Public declarations }
end;
var
Form1: TForm1;
y:TArray;
n,i,j,k:integer;
h,x0,z,x,r:extended;
PN1,PN2,PG1,PG2,PS:string;
implementation
{$R *.dfm}
Procedure TForm1.DrawGraph;
var
scx,scy,miny,maxy:extended;
i:integer;
begin
x0:=strtofloat(EditXo.text);
h:=(Strtofloat(EditXn.Text)-
For i:=0 to n do
y[i]:=strtofloat(setka.Cells[
scx:=(image1.Width-30)/n;
miny:=y[0];
maxy:=miny;
for i:=1 to n do
begin
If miny>y[i] then miny:=y[i];
If maxy<y[i] then maxy:=y[i];
end;
scy:=(Image1.Height-30)/(maxy-
Image1.Canvas.FillRect(Rect(0,
With Image1.Canvas do
begin
Pen.Color:=clLime;
Pen.Style:=psSolid;
Pen.Width:=1;
for i:=0 to n do
begin
Moveto(20+round(scx*i),Image1.
Lineto(20+round(scx*i),0);
TextOut(15+round(scx*i),
Moveto(15,Image1.Height-20-
LineTo(Image1.Width,Image1.
TextOut(5,Image1.Height-27-
end;
end;
With Image1.Canvas do
begin
Pen.Color:=clblack;
Pen.Width:=3;
Moveto(20,Image1.Height-20-
for i:=1 to n do
LineTo(20+round(scx*i),Image1.
pen.Width:=2;
For i:=21 to Image1.Width-10 do
begin
If CheckN1.Checked then
begin
Pen.Color:=clBlue;
Moveto(i-1,Image1.Height-20-
Lineto(i,Image1.Height-20-
end;
If CheckN2.Checked then
begin
Pen.Color:=clGreen;
Moveto(i-1,Image1.Height-20-
Lineto(i,Image1.Height-20-
end;
end;
for i:=0 to n do
y[i-(n div 2)]:=y[i];
x0:=x0+(n div 2)*h;
For i:=21 to Image1.Width-10 do
begin
If CheckG1.Checked then
begin
Pen.Color:=clRed;
Moveto(i-1,Image1.Height-20-
Lineto(i,Image1.Height-20-
end;
If CheckG2.Checked then
begin
Pen.Color:=rgb(50,200,150);
Moveto(i-1,Image1.Height-20-
Lineto(i,Image1.Height-20-
end;
If CheckS.Checked then
begin
Pen.Color:=clgray;
Moveto(i-1,Image1.Height-20-
Lineto(i,Image1.Height-20-
end;
end;
end;
end;
Procedure TForm1.ZapX;
begin
x0:=strtofloat(EditXo.text);
h:=(Strtofloat(EditXn.Text)-
For i:=1 to n+1 do
Setka.Cells[i,0]:=floattostr(
end;
Function TForm1.Fact(n:integer):
var i:integer;
begin
Result:=1;
For i:=1 to n do
Result:=Result*i;
end;
function Tform1.C(n,k:integer):
begin
Result:=fact(n)/(fact(k)*fact(
end;
Function Tform1.Delta(k:integer;y:
var j:integer;
begin
result:=0;
For j:=0 to k do
Result:=result+intpower(-1,j)*
end;
Function TForm1.PolyNuton1:string;
begin
Result:=floattostr(y[0]);
For i:=1 to n do
begin
z:=Delta(i,y,0)/(fact(i)*
if z=0 then continue;
If (z>0) then Result:=Result+'+';
If z<>1 then Result:=Result+floattostr(z);
For j:=1 to i do
begin
z:=x0+pred(j)*h;
if z=0
then Result:=Result+'x'
else if z>0 then Result:=Result+'(x-'+
else Result:=Result+'(x'+
end;
end;
end;
Function Tform1.PolyN1(x:extended):
begin
Result:=(y[0]);
For i:=1 to n do
begin
z:=Delta(i,y,0)/(fact(i)*
if z=0 then continue;
r:=z;
For j:=1 to i do
begin
z:=x0+pred(j)*h;
r:=r*(x-z)
end;
Result:=Result+r;
end;
end;
function TForm1.PolyNuton2:string;
begin
Result:=floattostr(y[n]);
For i:=1 to n do
begin
z:=Delta(i,y,n-i)/(fact(i)*
if z=0 then continue;
If (z>0) then Result:=Result+'+';
If z<>1 then Result:=Result+floattostr(z);
For j:=n downto n-pred(i) do
begin
z:=x0+j*h;
if z=0
then Result:=Result+'x'
else if z>0 then Result:=Result+'(x-'+
else Result:=Result+'(x'+
end;
end;
end;
Function Tform1.PolyN2(x:extended):exte
begin
Result:=(y[n]);
For i:=1 to n do
begin
z:=Delta(i,y,n-i)/(fact(i)*
if z=0 then continue;
r:=z;
For j:=n downto n-pred(i) do
begin
z:=x0+j*h;
r:=r*(x-z)
end;
Result:=Result+r;
end;
end;
function TForm1.PolyGauss1:string;
begin
Result:=floattostr(y[0]);
For i:=1 to n do
begin
z:=Delta(i,y,-(i div 2))/(fact(i)*IntPower(h,i));
if z=0 then continue;
If (z>0) then Result:=Result+'+';
If z<>1 then Result:=Result+floattostr(z);
For j:=-(i div 2)+1-i mod 2 to (i div 2) do
begin
z:=x0+j*h;
if z=0
then Result:=Result+'x'
else if z>0 then Result:=Result+'(x-'+
else Result:=Result+'(x'+
end;
end;
end;
Function Tform1.PolyG1(x:extended):
begin
Result:=(y[0]);
For i:=1 to n do
begin
z:=Delta(i,y,-(i div 2))/(fact(i)*IntPower(h,i));
if z=0 then continue;
r:=z;
For j:=-(i div 2)+1-i mod 2 to (i div 2) do
begin
z:=x0+j*h;
r:=r*(x-z)
end;
Result:=Result+r;
end;
end;
function TForm1.PolyGauss2:string;
begin
Result:=floattostr(y[0]);
For i:=1 to n do
begin
z:=Delta(i,y,-(succ(i) div 2))/(fact(i)*IntPower(h,i));
if z=0 then continue;
If (z>0) then Result:=Result+'+';
If z<>1 then Result:=Result+floattostr(z);
For j:=-(i div 2) to (i div 2)-1+i mod 2 do
begin
z:=x0+j*h;
if z=0
then Result:=Result+'x'
else if z>0 then Result:=Result+'(x-'+
else Result:=Result+'(x'+
end;
end;
end;
Function Tform1.PolyG2(x:extended):
begin
Result:=(y[0]);
For i:=1 to n do
begin
z:=Delta(i,y,-(succ(i) div 2))/(fact(i)*IntPower(h,i));
if z=0 then continue;
r:=z;
For j:=-(i div 2) to (i div 2)-1+i mod 2 do
begin
z:=x0+j*h;
r:=r*(x-z)
end;
Result:=Result+r;
end;
end;
function TForm1.PolyStirling:string;
begin
Result:=floattostr(y[0]);
For i:=1 to n do
begin
z:=(Delta(i,y,-(i
div 2))+Delta(i,y,-(succ(i) div 2)))/(2*fact(i)*IntPower(h,i))
If not(odd(i)) then z:=z/2;
if z=0 then continue;
If (z>0) then Result:=Result+'+';
If z<>1 then Result:=Result+floattostr(z);
For j:=-(i div 2)+1-i mod 2 to (i div 2)-1+i mod 2 do
begin
z:=x0+j*h;
if z=0
then Result:=Result+'x'
else if z>0 then Result:=Result+'(x-'+
else Result:=Result+'(x'+
end;
If not(odd(i)) then
begin
z:=-2*x0;
If z=0 then Result:=result+'2x'
else
if z<0
then Result:=Result+'(2x'+
else Result:=Result+'(2x+'+
end;
end;
end;
Function Tform1.PolyS(x:extended):
begin
Result:=(y[0]);
For i:=1 to n do
begin
z:=(Delta(i,y,-(i div 2))+Delta(i,y,-(succ(i)
div 2)))/(2*fact(i)*IntPower(h,i))
If not(odd(i)) then z:=z/2;
if z=0 then continue;
r:=z;
For j:=-(i div 2)+1-i mod 2 to (i div 2)-1+i mod 2 do
begin
z:=x0+j*h;
r:=r*(x-z)
end;
If not(odd(i)) then r:=r*(2*(x-x0));
Result:=Result+r;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
x0:=strtofloat(EditXo.text);
h:=(Strtofloat(EditXn.Text)-
For i:=0 to n do
y[i]:=strtofloat(setka.Cells[
PN1:=PolyNuton1;
PN2:=PolyNuton2;
for i:=0 to n do
y[i-(n div 2)]:=y[i];
x0:=x0+(n div 2)*h;
PG1:=PolyGauss1;
PG2:=PolyGauss2;
PS:=PolyStirling;
With Polynoms do
begin
Cells[1,0]:=PN1; Cells[1,1]:=PN2;
Cells[1,2]:=PG1; Cells[1,3]:=PG2;
Cells[1,4]:=PS;
end;
DrawGraph;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
n:=4;
With Polynoms do
begin
ColWidths[1]:=1593;
Cells[0,0]:='I ïîëèíîì Íüþòîíà';
Cells[0,1]:='II ïîëèíîì Íüþòîíà';
Cells[0,2]:='I ïîëèíîì Ãàóññà';
Cells[0,3]:='II ïîëèíîì Ãàóññà';
Cells[0,4]:='ïîëèíîì Ñòèðëèíãà';
end;
With setka do
begin
Cells[0,0]:=' x';
Cells[0,1]:=' y';
zapX
end;
end;
procedure TForm1.EditXnExit(Sender: TObject);
begin
If StrTofloat(EditXn.Text)<
EditXn.Undo;
ZapX;
end;
procedure TForm1.EditXoExit(Sender: TObject);
begin
If StrTofloat(EditXn.Text)<
EditXo.Undo;
ZapX;
end;
Информация о работе Полиномиальная интерполяция Гаусса, Ньютона, Стирлинга