- •«Челябинский государственный университет» (фгбоу впо «ЧелГу»)
- •«Интерполирование алгебраическими многочленами»
- •2014 Оглавление
- •1. Введение
- •2. Задача интерполирования алгебраическими многочленами
- •3. Интерполяционная формула лагранжа
- •4. Интерполяционная формула ньютона
- •5. Применение интерполяционных формул к данному примеру
- •6. Заключение
- •7. Использованная литература
- •1) Монастырский п.И. Сборник задач по методам вычислений 1-е издание.
- •8. Приложение
6. Заключение
В данной курсовой работе были рассмотрены интерполирования алгебраическими многочленами методами Лагранжа и Ньютона, пути решения которых совершенно разные, но результаты работы были одинаковыми, и также был рассчитан гиперболический синус по данной точке, результат которой меньше, но весьма близок к результатам методов.
Мною было рассчитано значение в точке по интерполяционным формулам Лагранжа и Ньютона и была создана демонстративная программа на Delphi 7, которая наглядно показывает достоверность решения методов.
7. Использованная литература
1) Монастырский п.И. Сборник задач по методам вычислений 1-е издание.
2) Монастырский П.И. Сборник задач по методам вычислений 2-е издание.
3) Тынкевич М. А.. Глава 7.6.1. Интерполяционный многочлен Лагранжа. Численные методы анализа.
8. Приложение
Используя все выше перечисленные интерполяционные формулы Лагранжа и Ньютона, внесем их в программу Delphi 7 через язык программирования Паскаль.
Результат по интерполяционной формуле Лагранжа:
Результат по интерполяционной формуле Ньютона:
Вывод: все значения в программе Delphi 7 совпадают со значениями из пункта 5.
Код программы Паскаль по интерполяционной формуле Ньютона:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, XPMan, unit2, Buttons, TeEngine, Series,
ExtCtrls, TeeProcs, Chart;
type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Button1: TButton;
StringGrid1: TStringGrid;
XPManifest1: TXPManifest;
Button2: TButton;
Memo1: TMemo;
Chart1: TChart;
Series1: TLineSeries;
BitBtn1: TBitBtn;
Label2: TLabel;
RadioGroup1: TRadioGroup;
Label3: TLabel;
Edit2: TEdit;
Button3: TButton;
Edit3: TEdit;
Memo2: TMemo;
LabeledEdit1: TLabeledEdit;
Label4: TLabel;
Edit4: TEdit;
Edit5: TEdit;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Meth:Methods;
flag:bool;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Meth:=Methods.Create;
RadioGroup1.ItemIndex:=0;
StringGrid1.Cells[0,0]:='№ узла';
StringGrid1.Cells[0,1]:='x[i]';
StringGrid1.Cells[0,2]:='y[i]';
StringGrid1.Cells[1,0]:=IntToStr(1);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
Meth.N:=StrToInt(Edit1.Text);
StringGrid1.ColCount:=Meth.N+1;
for i:=1 to Meth.N do
begin
StringGrid1.Cells[i,0]:=IntToStr(i);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i: integer;
begin
Memo1.Clear;
Memo2.Clear;
Series1.Clear;
Meth.Step:=StrToFloat(LabeledEdit1.Text);
for i:=1 to Meth.N do
begin
Meth.x[i]:=StrToFloat(StringGrid1.Cells[i,1]);
Meth.y[i]:=StrToFloat(StringGrid1.Cells[i,2]);
end;
for i:=0 to Meth.N-1 do
begin
Meth.x1[i]:=StrToFloat(StringGrid1.Cells[i+1,1]);
Meth.y1[i]:=StrToFloat(StringGrid1.Cells[i+1,2]);
end;
if RadioGroup1.ItemIndex = 0 then
Meth.Graf;
if RadioGroup1.ItemIndex = 1 then
Meth.Newton;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if RadioGroup1.ItemIndex = 0 then
Edit3.Text:=FloatToStr(Meth.PointLag(StrToFloat(Edit2.Text)))
else
Edit3.Text:=FloatToStr(Meth.PointNew(StrToFloat(Edit2.Text)));
end;
end.
Код программы Паскаль по интерполяционной формуле Лагранжа:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls,Math;
type
Tvector = array [1..10] of real;
Tvector1 = array [0..9] of real;
TMatr = array [1..10] of array[1..10] of real;
Methods = class
N:integer;
x,y,a:Tvector;
y1,x1:Tvector1;
mas:TMatr;
Step:real;
Polinom: string;
// function Lagrange(q:real):real;
procedure Graf;
function PointLag(point:real):real;
procedure Razn();
function RealD(xk:real;x0:real):real;
function Factorial(Number:integer): integer;
procedure Newton();
function PointNew(point:real):real;
end;
implementation
uses Unit1;
{function Methods.Lagrange(q:real):real;
var
i,j:integer;
L,s:real;
begin
L:=0;
for i:=1 to n do
begin
s:=1;
for j:=1 to N do
if j<>i then
s:=s*(q-x[j])/(x[i]-x[j]);
L:=L+y[i]*s;
end;
Form1.Memo1.Lines.Add('x= '+FloatToStr(q)+' y= '+FloatToStr(L));
//Form1.Series1.AddXY(q,l);
Lagrange:=l
end; }
procedure Methods.Graf();
Var
MassivA: array [1..10]of array [1..10]of real;
MassivB: array[1..10] of real;
MassivX: array[1..10] of real;
i,j,k:byte;
h, step, count:real;
Mx,My:real;
begin
for i:=1 to N do
begin
MassivB[i]:=y[i];
for j:=1 to N do
MassivA[j,i]:=Power(x[j],i-1);
end;
{Прямой ход - исключение переменных}
for k:=1 to n-1 do
for i:=k+1 to n do
begin
MassivA[i,k]:=-MassivA[i,k]/MassivA[k,k];
for j:=k+1 to n do
begin
MassivA[i,j]:=MassivA[i,j]+MassivA[i,k]*MassivA[k,j];
end;
MassivB[i]:=MassivB[i]+MassivA[i,k]*MassivB[k];
end;
MassivX[n]:=MassivB[n]/MassivA[n,n];
{Обратный ход - нахождение корней}
for k:=n-1 downto 1 do
begin
h:=MassivB[k];
for j:=k+1 to n do
h:=h-MassivX[j]*MassivA[k,j];
MassivX[k]:=h/MassivA[k,k];
end;
for i:=1 to n do
a[i]:=MassivX[i];
Polinom:='';
// построение многочлена
for i:=0 to N-1 do
begin
if ((i=N-1) or (i=0)) then
begin
if (i=N-1) then
begin
if(a[N-i]<0) then
Polinom:=Polinom+FloatToStr(a[N-i])
else
Polinom:=Polinom+ '+'+FloatToStr(a[N-i]);
end
else
Polinom:=Polinom+FloatToStr(a[N-i])+'x^'+IntToStr(N-i-1);
end
else
begin
if(a[N-i]<0) then
Polinom:=Polinom+FloatToStr(a[N-i])+'x^'+IntToStr(N-i-1)
else
Polinom:=Polinom + '+'+FloatToStr(a[N-i])+'x^'+IntToStr(N-i-1);
end;
end;
Form1.Memo2.Lines.Add(Polinom);
// построение графика
step:=x[1];
while step<=x[N] do
begin
Mx:=step;
My:=0;
for i:=1 to N do
begin
My:=My+a[i]*Power(Mx,i-1);
end;
Form1.Series1.AddXY(Mx,My);
step:=step + 0.001;
end;
//уплотнение таблицы
step:=x[1];
count:= StrToFloat(Form1.LabeledEdit1.Text);
while step<=x[N] do
begin
Mx:=step;
My:=0;
for i:=1 to N do
begin
My:=My+a[i]*Power(Mx,i-1);
end;
Form1.Memo1.Lines.Add('x= '+Format('%.3f',[Mx])+' y= '+Format('%.4f',[My]));
step:=step + count;
end;
end;
function Methods.PointLag(point:real):real;
var
i:byte;
begin
for i:=1 to N do
result:=result+a[i]*Power(point,i-1);
end;
// конечнее разности
procedure Methods.Razn();
var
i, j: byte;
begin
for j:=1 to N-1 do
mas[j,1]:= y[j+1]-y[j];
for i:=2 to N do
for j:=1 to N-i+1 do
mas[j,i]:= mas[j+1,i-1]-mas[j,i-1];
end;
// вывод D
function Methods.RealD(xk:real;x0:real):real;
begin
result:=(xk-x0)/(x[2]-x[1]);
end;
function Methods.Factorial(Number:integer):integer;
var
i:integer;
begin
result:=1;
for i:=1 to Number do
Result:= Result*Number;
end;
procedure Methods.Newton();
var
i,j:integer;
New, Ndop, d:real;
xn, xk, point:real;
begin
xn:= x[1];
xk:= StrToFloat(Form1.Edit5.Text);
point:= StrToFloat(Form1.Edit4.Text);
// d:= RealD(xk,xn);
Razn;
while (point<=xk) do
begin
New:=y[1];
for i:=1 to N-1 do
begin
d:= RealD(point,xn);
Ndop:=d*mas[1,i]/Factorial(i);
if (i>1) then
begin
for j:=1 to i-1 do
Ndop:=Ndop*(d-j);
end;
New:=New+Ndop;
end;
Form1.Series1.AddXY(point,New);
Form1.Memo1.Lines.Add('x= '+Format('%.3f',[point])+' y= '+Format('%.4f',[New]));
point:=point+Step;
end;
Form1.Memo2.Lines.Add(Polinom);
end;
function Methods.PointNew(point:real):real;
var
New, Ndop, d:real;
i, j: byte;
begin
New:=y[1];
for i:=1 to N-1 do
begin
d:= RealD(point,x[1]);
Ndop:=d*mas[1,i]/Factorial(i);
if (i>1) then
begin
for j:=1 to i-1 do
Ndop:=Ndop*(d-j);
end;
result:=New+Ndop;
end;
end;
end.