Численные методы решения математических задач

Метод Гаусса, метод прогонки, нелинейное уравнение. Метод вращения Якоби. Интерполяционный многочлен Лагранжа и Ньютона. Метод наименьших квадратов, интерполяция сплайнами. Дифференцирование многочленами, метод Монте-Карло и Рунге-Кутты, краевая задача.

Рубрика Математика
Вид курсовая работа
Язык русский
Дата добавления 23.05.2013
Размер файла 4,8 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

МОСКОВСКИЙ АВИАЦИОННЫЙ ИНСТИТУТ

(национальный исследовательский университет)

Факультет №8 «Прикладная математика и физика»

Кафедра 806 «Вычислительная математика и программирование»

ОТЧЕТ

по

расчетно-графической работе

по дисциплине

«Вычислительная математика»

Выполнил:

Студент группы 03-325

Игнатенко А.В.

Преподаватель:

Кринецкий О.Е.

Москва 2012

ОГЛАВЛЕНИЕ

1. Постановка задачи

2. Формулировка заданий РГР

3. Выполнение расчетно-графической работы

3.1 Метод Гаусса

3.1.1 Листинг

3.2 Метод прогонки

3.2.1 Листинг

3.3 Нелинейное уравнение

3.3.1 Листинг

3.4 Метод вращения Якоби

3.4.1 Листинг

3.5 Интерполяционный многочлен

3.5.1 Интерполяционный многочлен Лагранжа

3.5.2 Интерполяционный многочлен Ньютона

3.6 Интерполяция сплайнами

3.6.1 Листинг

3.7 Метод наименьших квадратов

3.7.1 Листинг

3.8 Дифференцирование многочленами

3.8.1 Листинг

3.9 Метод Монте-Карло

3.9.1 Листинг

3.10 Метод Рунге-Кутты

3.10.1 Листинг

3.11 Краевая задача

3.11.1 Листинг

4. Заключение

1. Постановка задачи

Выполнить задания 1-11 расчетно-графической работы в соответствии с вариантом. При выполнении заданий разрешается пользоваться различным программным обеспечением, учитывая следующие требования:

1) Алгоритм работы и листинг используемого программного обеспечения должен быть понятен студенту. Студент должен предоставить необходимые разъяснения по требованию преподавателя, либо усовершенствовать/дополнить программу, если это необходимо;

2) ПО не должно использовать никаких сторонних программ для проведения математических вычислений, построения графиков и т.д. Весь функционал ПО должен быть заключен в его собственном коде;

3) При предоставлении собственноручно написанного ПО, студенту следует разместить на носителе, содержащем ПО, дистрибутив той среды программирования, в которой было написано ПО.

2. Формулировка заданий РГР

нелинейный уравнение интерполяционный многочлен

Расчетно-графическая работа состоит из нескольких заданий, для успешного решения которых необходимо продемонстрировать владение численными методами решения математических задач.

Формулировка всех заданий приведена ниже.

1) Методом Гаусса с точностью е=0,01 решить СЛАУ;

2) Методом прогонки решить СЛАУ, е=0,01;

3) Методом простой итерации (или любым другим) с е=0,01 уточнить один из корней уравнения;

4) Методом вращения с е=0,01 вычислить собственные значения и собственные вектора симметрической матрицы А;

5) Выписать интерполяционные многочлены Лагранжа и Ньютона для узловых значений {xi, yi}, заданных функцией y=f(x);

6) Для таблицы задания 5 выписать кубические сплайны дефекта 1 на каждом отрезке x?[xi-1, xi], i=1..4;

7) Методом наименьших квадратов аппроксимировать линейным и квадратичным многочленом заданную таблицу.

8) Используя таблицу задания 5 найти значение 1-й и 2-й производной в заданной точке.

9) Методом Рунге-Кутты с шагом h=0,1 и е=0,01 решить задачу Коши.

10) Методом прогонки с шагом h=0,1 и 0(h2) решить краевую задачу для ОДУ.

3. Выполнение расчетно-графической работы

Все задания, представленные в РГР, были выполнены с использованием собственноручно разработанного ПО и в соответствии с требуемым вариантом. Описание метода, описание алгоритма, скриншоты работы и листинг прилагаются.

3.1 Метод Гаусса

В ходе работы программы были подсчитаны корни СЛАУ:

Определитель введенной матрицы:

3.1.1 Листинг

unit Gauss;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Grids, ExtCtrls, jpeg;

type

TForm1 = class(TForm)

StringGrid1: TStringGrid;

Button1: TButton;

Edit1: TEdit;

Label3: TLabel;

Button2: TButton;

mmo1: TMemo;

Label8: TLabel;

lbl1: TLabel;

lbl2: TLabel;

lbl3: TLabel;

lbl4: TLabel;

lbl5: TLabel;

lbl6: TLabel;

lbl7: TLabel;

bvl1: TBevel;

bvl2: TBevel;

Label1: TStaticText;

Button3: TButton;

StringGrid2: TStringGrid;

Edit2: TEdit;

Button4: TButton;

lbl8: TLabel;

Edit3: TEdit;

Image1: TImage;

lbl9: TLabel;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

type

MAT=array [1..20,1..20] of extended;

Vec=array [1..20] of extended;

Tmass=array of Real;

Tmatrix=array of Tmass;

var

f: TextFile;

Form1: TForm1;

k,m,n,i,j,p,l: integer;

lol, znak: integer;

Mas1: Mat;

st: string;

a:Mat;

x,b:Vec;

S:real;

tempstr: string;

tempint: Integer;

tempfloat: Real;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin

n:=StrToInt(Edit1.text);

if n>8 then begin showmessage('Слишком большой размер'); Exit; end;

StringGrid2.ColCount:=n;

StringGrid2.RowCount:=n;

st:='';

for i:=1 to n do

for j:=1 to n+1 do

StringGrid1.Cells[j-1,i-1]:='';

st:='';

StringGrid1.ColCount:=n+1;

StringGrid1.RowCount:=n;

StringGrid1.Height:=n*26+1;

StringGrid1.Width:=(n+1)*66+1;

StringGrid1.Visible:=true;

Button2.Enabled:=true;

mmo1.Enabled:=True;

end;

procedure TForm1.Button2Click(Sender: TObject);

Var i,j,k,l,k1,n1,prov: integer;

st:string;

a:Mat;

x,b:vec;

S,R:real;

f:TextFile;

Begin

n:=StrToInt(Edit1.text);

for i:=1 to n do

for j:=1 to n+1 do

if StringGrid1.Cells[j-1,i-1]='' then

begin

ShowMessage('Заполните все поля матрицы');

exit;

end;

for i:=0 to StringGrid2.RowCount do

for j:=0 to StringGrid2.ColCount do begin

StringGrid2.Cells[i,j]:=StringGrid1.Cells[i,j];

end;

for i:=1 to n do

for j:=1 to n+1 do

a[i,j]:=StrToFloat(StringGrid1.Cells[j-1,i-1]);

n1:=n+1;

for k:=1 to n do

Begin

k1:=k+1;

s:=A[k,k];

j:=k;

for i:=k1 to n do

begin

R:=a[i,k];

if abs(R)>abs(S)then

Begin

S:=R;

j:=I

end;

end;

if s=0.0 then

begin

ShowMessage('Определитель равен нулю!');

Exit;

end;

if j<>k then

for i:=k to n1 do

Begin

R:=A[k,i];

A[k,i]:=A[j,i];

A[j,i]:=R;

end;

for j:=k to n1 do {k}

A[k,j]:=A[k,j]/S;

for i:=k1 to n do

Begin

R:=A[i,k];

for j:=k to n1 do {k}

A[i,j]:=A[i,j]-A[k,j]*R;

end;

end;

if s<>0.0 then

begin

for i:=n downto 1 do

begin

s:=a[i,n1];

for j:=i+1 to n do

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

x[i]:=s;

end;

mmo1.Text:='';

for i:=1 to n do

mmo1.lines.Add('X['+FloatToStr(i)+']= '+FloatToStr(x[i]));

Exit;

end

else

begin

ShowMessage('Det[A]=0');

Exit;

end;

Button2.Visible:=True;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

mmo1.text:='';

end;

procedure TForm1.Button3Click(Sender: TObject);

procedure Per(k,n:integer;var a:Tmatrix; var p:integer);

var z:Real;j,i:integer;

begin

z:=abs(a[k,k]);i:=k;p:=0;

for j:=k+1 to n-1 do

begin

if abs(a[j,k])>z then

begin

z:=abs(a[j,k]);i:=j;

p:=p+1;

end;

end;

if i>k then

for j:=k to n-1 do

begin

z:=a[i,j];

a[i,j]:=a[k,j];

a[k,j]:=z;

end;

end;

function Znak(p:integer):integer;

begin

if p mod 2=0 then

result:=1 else result:=-1;

end;

procedure Opr(n:integer;var a:tmatrix;var det:real);

var k,i,j,p:integer;r:real;

begin

det:=1.0;

for k:=0 to n-1 do

begin

if a[k,k]=0 then Per(k,n,a,p);

det:=znak(p)*det*a[k,k];

for j:=k+1 to n-1 do

begin

r:=a[j,k]/a[k,k];

for i:=k to n-1 do

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

end;

end;

end;

var k,j,i:integer;

a:Tmatrix;

det:real;

begin

n:=strtoint(edit1.Text);

SetLength(a,n,n);

for k:=0 to n-1 do

for j:=0 to n-1 do

a[k,j]:=strtofloat(StringGrid2.Cells[j,k]);

Opr(n,a,det);

Edit2.Text:=FloatToStrF(det,ffFixed,5,0);

end;

procedure TForm1.Button4Click(Sender: TObject);

var lol: Integer;

begin

lol:=StrToInt(Edit3.Text);

Randomize;

for p:= 0 to StringGrid1.RowCount do

for l:= 0 to StringGrid1.ColCount do

begin

znak:=Random(2);

if znak=1 then znak:=-1 else znak:=1;

tempint:=Random(100);

tempstr:=IntToStr(tempint);

tempfloat:=StrToFloat(tempstr);

StringGrid1.Cells[p,l]:=FloatToStr(znak*(Random(lol+1)+tempfloat*0.01));

end;

end;

end.

3.2 Метод прогонки

В ходе работы программы были подсчитаны корни СЛАУ:

Прогоночные коэффициенты:

3.2.1 Листинг

unit Progonka;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Grids, ExtCtrls, jpeg;

type

TForm1 = class(TForm)

StringGrid1: TStringGrid;

Button1: TButton;

Edit1: TEdit;

Button2: TButton;

Korni: TLabel;

mmo1: TMemo;

Label1: TLabel;

Bevel1: TBevel;

Panel: TPanel;

Label4: TLabel;

Label5: TLabel;

Edit2: TEdit;

Button3: TButton;

Button4: TButton;

lbl7: TLabel;

bvl1: TBevel;

Button5: TButton;

lbl8: TLabel;

Edit3: TEdit;

lbl10: TLabel;

lbl1: TLabel;

lbl2: TLabel;

lbl3: TLabel;

lbl4: TLabel;

lbl5: TLabel;

lbl6: TLabel;

Image1: TImage;

lbl9: TLabel;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure Button5Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

type

MasEl=array [0..100] of extended;

MasExt=array [0..100] of extended;

var

Q,P,x :MasEl;

a,b,c,d:MasExt;

f: TextFile;

Form1: TForm1;

i,j,n,k,raz,p1,l1,znak : integer;

st: string;

S:real;

tempint: Integer;

tempstr: String;

Tempfloat: Real;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin

n:=StrToInt(Edit1.text);

for i:=1 to n do

for j:=1 to n+1 do

StringGrid1.Cells[j-1,i-1]:='';

StringGrid1.ColCount:=n+1;

StringGrid1.RowCount:=n;

StringGrid1.Height:=n*26+1;

StringGrid1.Width:=(n+1)*66+1;

StringGrid1.Visible:=true;

Button2.visible:=true;

mmo1.text:='';

Form2.memo1.text:='';

Button2.Enabled:=True;

end;

procedure TForm1.Button2Click(Sender: TObject);

Var

i,j,n,k,raz : integer;

Q,P,x :MasEl;

a,b,c,d:MasExt;

st:string;

S,R:real;

flag: boolean;

Begin

n:=StrToInt(Edit1.text);

Form2.memo1.lines.Add('P[0]= 1');

Form2.memo1.lines.Add('Q[0]= 1');

for i:=1 to n do

begin

b[i]:=StrToFloat(StringGrid1.Cells[i-1,i-1]); //главная диагональ

if i<n then

begin

c[i]:=StrToFloat(StringGrid1.Cells[i,i-1]); //нижняя диагональ

a[i+1]:=StrToFloat(StringGrid1.Cells[i-1,i]); //верхняя диагональ

end;

d[i]:=StrToFloat(StringGrid1.Cells[n,i-1]) //свободные члены

end;

//P[i], Q[i] - метод прогонки

for i:=1 to n do

begin

P[i]:=(-c[i])/(b[i]+a[i]*P[i-1]);

Q[i]:=(d[i]-a[i]*Q[i-1])/(b[i]+a[i]*P[i-1]);

form2.memo1.lines.Add('P['+IntToStr(i)+']= '+FloatToStr(P[i]));

form2.memo1.lines.Add('Q['+IntToStr(i)+']= '+FloatToStr(Q[i]));

end;

x[n]:=Q[n];

for i:=(n-1) downto 1 do

x[i]:=P[i]*x[i+1]+Q[i];

for i:=1 to n do

mmo1.lines.Add('X['+FloatToStr(i)+']= '+FloatToStr(x[i]));

Button4.Visible:=true;

Exit;

Button2.Enabled:=False;

Button4.Visible:=True;

end;

procedure TForm1.Button3Click(Sender: TObject);

Var

i,j,n,k,raz : integer;

Q,P,x :MasEl;

a,b,c,d:array[1..100] of integer;

begin

//случайное заполнение матрицы

n:=StrToInt(Edit1.text);

Randomize;

for i:=1 to n do

begin

repeat

b[i]:=(Random(2*StrToInt(Edit2.text)+1)-StrToInt(Edit2.text));

until b[i]<>0;

StringGrid1.cells[i-1,i-1]:=FloatToStr(b[i]);

if i<n then

begin

c[i]:=Random(Abs(2*b[i]+1))-Abs(b[i]);

StringGrid1.cells[i,i-1]:=FloatToStr(c[i]);

end

else c[i]:=0;

if i>1 then

begin

a[i]:=Random(2*(Abs(b[i])-Abs(c[i]))+1)-(Abs(b[i])-Abs(c[i]));

StringGrid1.cells[i-2,i-1]:=FloatToStr(a[i]);

end

else a[i]:=0;

d[i]:=a[i]+b[i]+c[i];

StringGrid1.cells[n,i-1]:=FloatToStr(d[i]);

end;

end;

procedure TForm1.Button4Click(Sender: TObject);

begin

Form2.Show;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

mmo1.Text:='';

end;

procedure TForm1.Button5Click(Sender: TObject);

var lol: integer;

begin

lol:=StrToInt(Edit3.Text);

Randomize;

for p1:= 0 to StringGrid1.RowCount do

for l1:= 0 to StringGrid1.ColCount do

begin

znak:=Random(2);

if znak=1 then znak:=-1 else znak:=1;

tempint:=Random(100);

tempstr:=IntToStr(tempint);

tempfloat:=StrToFloat(tempstr);

StringGrid1.Cells[p1,l1]:=FloatToStr(znak*(Random(lol+1)+tempfloat*0.01));

end;

end;

end.

3.3 Нелинейное уравнение

3.3.1 Листинг

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ExtCtrls,Math, jpeg;

type

TForm1 = class(TForm)

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

pnl1: TPanel;

Label5: TLabel;

Label6: TLabel;

Label7: TLabel;

Label8: TLabel;

Button1: TButton;

Edit1: TEdit;

pnl2: TPanel;

Label4: TLabel;

img1: TImage;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var x:real;

begin

Label1.Caption:='Результат Вычислений:';

x:=StrToFloat(Edit1.Text);

x:= x - ( ((Cos(x)/sin(x)) - 2*x) / ( (-1*(1/sqr(sin(x))) - 2 )) );

Edit1.Text:=FloatToStr(x);

end;

end.

3.4 Метод вращения Якоби

A =

Пошаговое выполнение программы (преобразование матриц):

3.4.1 Листинг

unit Unitmv;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, Grids, jpeg, ExtCtrls, Math;

type

TForm1 = class(TForm)

matrix: TStringGrid;

Button1: TButton;

Edit1: TEdit;

Button2: TButton;

Edit2: TEdit;

Label2: TLabel;

Label3: TLabel;

Memo1: TMemo;

Button3: TButton;

lbl7: TLabel;

bvl1: TBevel;

bvl2: TBevel;

lbl10: TLabel;

lbl1: TLabel;

lbl2: TLabel;

lbl3: TLabel;

lbl4: TLabel;

lbl5: TLabel;

lbl6: TLabel;

Image1: TImage;

lbl9: TLabel;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure Button3Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

uses Unit2;

var

e:extended;

n,i,j,i1,j1,l:integer;

a,pov,new,rez,povtr:array [1..20,1..20] of extended;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);

var

i,j:integer;

begin

e:=StrToFloat(Edit2.text);

n:=StrToInt(Edit1.text);

matrix.RowCount:=n; //устанавливаем размерность матрицы

matrix.ColCount:=n;

with matrix do

for i:=0 to RowCount do //очищаем её

for j:=0 to ColCount do

Cells[j, i]:='';

matrix.width:=matrix.DefaultColWidth*n+20;

matrix.height:=matrix.DefaultRowHeight*n+20;

end;

procedure TForm1.Button2Click(Sender: TObject);

var sum,max,x,k:extended;

st:string;

begin

for i:=1 to n do

begin

for j:=1 to n do

begin

a[i,j]:=StrToFloat(matrix.Cells[j-1, i-1]);

end;

end;

repeat

k:=k+1;

sum:=0;

for i:=1 to n do

for j:=1 to n do

if i<>j then

sum:=sum+a[i,j]*a[i,j];

sum:=sqrt(sum);

max:=abs(a[1,2]);

i1:=1;

j1:=2;

for i:=1 to n do

for j:=1 to n do begin

pov[i,j]:=0;

if (i<>j) and (abs(A[i,j])>max) then

begin

max:=abs(A[i,j]);//запоминаем индекс максимального элемента

i1:=i;

j1:=j;

end;

end;

if max=0 then

begin

for i:=1 to n do

Memo1.Lines.Add('Диагональный эл-т на позиции ['+IntToStr(i)+','+IntToStr(i)+']= '+FloatToStr(a[i,i]));

break;

end;

{еси максимальный элемент ноль-значит всё обнулили выход}

// showmessage(FloatToStr(a[i1,j1]));

x:=0.5*arctan(2*(a[i1,j1]/(a[i1,i1]-a[j1,j1])));

Memo1.Lines.Add('tg(2Phi)='+FloatToStr(tan(2*x)));

for i:=1 to n do

pov[i,i]:=1;

pov[i1,i1]:=cos(x);

pov[j1,j1]:=cos(x);

pov[i1,j1]:=-sin(x);

pov[j1,i1]:=sin(x);

for i:=1 to n do

for j:=1 to n do povtr[i,j]:=pov[j,i]; //транспонируем. т.к. определитель равен единице это тоже самое что обратная

for i:=1 to n do

for j:=1 to n do

begin

new[i,j]:= 0;

for l:= 1 to n do //умножаем транспонированную м-цу поворота на исходную

new[i,j]:= new[i,j] + povtr[i,l]*a[l,j];

end;

for i:=1 to n do

for j:=1 to n do

begin

rez[i,j]:= 0;

for l:= 1 to n do //то что получилось умножаем на м-цу поворота

rez[i,j]:= rez[i,j] + new[i,l]*pov[l,j];

end;

for i:=1 to n do

for j:=1 to n do begin

a[i,j]:=rez[i,j];

end;

Form2.memo1.Lines.add('Матрица после '+FloatToStr(k)+'-го преобразования');

for i:=1 to n do

begin

st:='';

for j:=1 to n do

st:=st+FloatToStrF(a[i,j],fffixed,3,2)+' ';

Form2.memo1.Lines.add(st);

end;

Form2.memo1.Lines.add('------------------');

until sum<=e;

for i:=1 to n do

Memo1.Lines.Add('Диагональный эл-т на позиции ['+IntToStr(i)+','+IntToStr(i)+']= '+FloatToStr(rez[i,i]));

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

Memo1.text:='';

end;

procedure TForm1.Button3Click(Sender: TObject);

begin

Form2.Show;

end;

end.

3.5 Интерполяционный многочлен

3.5.1 Интерполяционный многочлен Лагранжа

3.5.1.1 Листинг

// кнопка найти после графика

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Grids, ExtCtrls, jpeg;

type

TForm1 = class(TForm)

StringGrid1: TStringGrid;

Edit1: TEdit;

Image1: TImage;

Button2: TButton;

Button1: TButton;

Label1: TLabel;

Memo1: TMemo;

Label2: TLabel;

Edit2: TEdit;

Button3: TButton;

lbl7: TLabel;

bvl1: TBevel;

img2: TImage;

lbl8: TLabel;

lbl1: TLabel;

lbl2: TLabel;

lbl3: TLabel;

lbl4: TLabel;

lbl5: TLabel;

lbl6: TLabel;

Image2: TImage;

lbl9: TLabel;

procedure Button2Click(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Image1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

type

Mas=array[1..100] of Extended;

var

Form1: TForm1;

Xmax,Xmin,Ymax,Ymin:extended;

L,a,y:Mas;

i,j,n: integer;

x,yy:real;

PX,PY:integer;

koord: Boolean;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin

n:=StrToInt(Edit1.text);

StringGrid1.ColCount:=n;

StringGrid1.Width:=(n)*67;

StringGrid1.Visible:=true;

end;

function Ln(x: Extended; a,y:Mas ; {передаём масштаб}var Xmax,Xmin,Ymax,Ymin:extended):Extended;

var

Sum, Mng: extended;

begin

// формула Лагранжа

Sum:=0;

for i:=1 to n do

begin

Mng:=1;

for j:=1 to n do

if i<>j then

begin

Mng:=((x-a[j])/(a[i]-a[j]))*Mng;

end;

Sum:=Mng*y[i]+Sum;

end;

Ln:=Sum;

Xmax:=10;

Xmin:=-10;

Ymax:=10;

Ymin:=-10;

end;

procedure TForm1.Button2Click(Sender: TObject);

{

var x,yy:real;

PX,PY:integer; }

begin

Image1.Picture:= nil;

n:=StrToInt(Edit1.text);

for j:=1 to n do

begin

a[j]:=StrToFloat(StringGrid1.Cells[j-1,0]);

y[j]:=StrToFloat(StringGrid1.Cells[j-1,1])

end;

//оси

image1.Canvas.MoveTo(0,Image1.height div 2);

image1.Canvas.LineTo(Image1.width,Image1.height div 2);

image1.Canvas.MoveTo(Image1.width div 2,0);

image1.Canvas.LineTo(Image1.width div 2,Image1.height);

// масштаб

x:=Xmin+0*(Xmax-Xmin)/Image1.Width;

yy:=(Ln(x,a,y,Xmax,Xmin,Ymax,Ymin));

image1.Canvas.MoveTo(0,trunc(Image1.Height-(yy-Ymin)*Image1.height/(Ymax-Ymin)));

//построение граффика

for PX:=0 to Image1.Width do

begin

x:=Xmin+PX*(Xmax-Xmin)/Image1.Width;

yy:=(Ln(x,a,y,Xmax,Xmin,Ymax,Ymin));

PY:=trunc(Image1.Height-(yy-Ymin)*Image1.height/(Ymax-Ymin));

Image1.Canvas.Pen.Color:=clNavy;

Image1.Canvas.LineTo(PX,PY);

end;

Button1.Enabled:=False;

//Button2.Enabled:=False;

Button3.Enabled:=True;

koord:=True;

end;

procedure TForm1.Button3Click(Sender: TObject);

begin

x:=StrToFloat(Edit2.text);

yy:=(Ln(x,a,y,Xmax,Xmin,Ymax,Ymin));

Memo1.Lines.Add('Значение функции в точке '+FloatToStr(x)+' = '+FloatToStr(yy));

end;

procedure TForm1.Image1Click(Sender: TObject);

var

MyMouse: TMouse;

px,py:integer;

yy,xx: Extended;

begin

if Button2.Enabled=False then Exit;

if Edit1.Text='' then

n:=0

else

n:=StrToInt(Edit1.text);

if koord=False then

n:=n+1;

StringGrid1.ColCount:=n;

StringGrid1.Width:=(n)*67;

StringGrid1.Visible:=true;

Edit1.text:=IntToStr(n);

Xmax:=10;

Xmin:=-10;

Ymax:=10;

Ymin:=-10;

//захват координат точек в пикселях

px:=ScreenToClient(MyMouse.CursorPos).x-image1.Left;

py:=(ScreenToClient(MyMouse.CursorPos).y-image1.top);

{ Memo1.Lines.add(inttostr(px) + 'Х ' + inttostr(py)); }

//перевод координат в декарт

yy:=(Ymax-(py*((Ymax-Ymin)/image1.height)));

xx:=(Xmin+px*(Ymax-Ymin)/image1.width);

if koord=False then begin

StringGrid1.Cells[n-1,0]:=FloatToStrF(xx,ffFixed,4,2);

StringGrid1.Cells[n-1,1]:=FloatToStrF(yy,ffFixed,4,2); end;

if koord=True then begin

Edit2.Text:=FloatToStrF(xx,ffFixed,4,2);

end;

if koord=False then

Memo1.Lines.add('x: '+FloatToStrF(xx,ffFixed,4,2)+' y:'+FloatToStrF(yy,ffFixed,4,2));

//рисуем точки

Image1.Canvas.Ellipse(px-2,py-2,px+2,py+2);

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

image1.Canvas.MoveTo(0,Image1.height div 2);

image1.Canvas.LineTo(Image1.width,Image1.height div 2);

image1.Canvas.MoveTo(Image1.width div 2,0);

image1.Canvas.LineTo(Image1.width div 2,Image1.height);

koord:=False;

end;

end.

3.5.2 Интерполяционный многочлен Ньютона

3.5.2.1 Листинг

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Grids, ExtCtrls, jpeg;

type

TForm1 = class(TForm)

Image1: TImage;

lbl9: TLabel;

lbl10: TLabel;

lbl7: TLabel;

bvl1: TBevel;

img2: TImage;

StringGrid1: TStringGrid;

Edit1: TEdit;

Button2: TButton;

Button1: TButton;

Memo1: TMemo;

Edit2: TEdit;

Button3: TButton;

lbl8: TLabel;

lbl1: TLabel;

lbl2: TLabel;

lbl3: TLabel;

lbl4: TLabel;

lbl5: TLabel;

lbl6: TLabel;

Image2: TImage;

lbl11: TLabel;

procedure Button2Click(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Image1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

type

Mas=array[1..100] of Extended;

var

Form1: TForm1;

Xmax,Xmin,Ymax,Ymin,Fx:extended;

L,a,y:Mas;

i,j,n,k: integer;

x,yy:real;

koord: Boolean;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin

n:=StrToInt(Edit1.text);

StringGrid1.ColCount:=n;

StringGrid1.Width:=(n)*67;

StringGrid1.Visible:=true;

Button2.Enabled:=True;

end;

function PH(x: Extended; a,y:Mas ; var Xmax,Xmin,Ymax,Ymin:extended):Extended;

var

Sum, Mng, Pn,Pr: extended;

begin

Pn:=0;

For i:=1 to n do

begin

Fx:=1;

Sum:=0;

for k:=1 to i do

begin

for j:=1 to i do

begin

if k<>j then

Fx:=1/(a[k]-a[j])*Fx;

end;

Fx:=Fx*y[k];

Sum:=Sum+Fx;

Fx:=1;

end;

Pr:=1;

if i>1 then

for k:=1 to i-1 do

Pr:=Pr*(x-a[k]);

sum:=sum*pr;

Pn:=Pn+Sum;

end;

PH:=Pn;

Xmax:=10;

Xmin:=-10;

Ymax:=10;

Ymin:=-10;

end;

procedure TForm1.Button2Click(Sender: TObject);

var x,yy:real;

PX,PY:integer;

i,Apx,Ypx: Integer;

begin

Image1.Picture:= nil;

n:=StrToInt(Edit1.text);

Xmax:=10;

Xmin:=-10;

Ymax:=10;

Ymin:=-10;

for j:=1 to n do

begin

a[j]:=StrToFloat(StringGrid1.Cells[j-1,0]);

y[j]:=StrToFloat(StringGrid1.Cells[j-1,1])

end;

for j:=1 to n do

begin

Apx:=trunc((a[j]-Xmin)*Image1.Width/(Xmax-Xmin));

Ypx:=trunc(Image1.Height-(y[j]-Ymin)*Image1.height/(Ymax-Ymin));

Image1.Canvas.Pixels[Apx,Ypx]:=clBlack;

end;

image1.Canvas.MoveTo(0,Image1.height div 2);

image1.Canvas.LineTo(Image1.width,Image1.height div 2);

image1.Canvas.MoveTo(Image1.width div 2,0);

image1.Canvas.LineTo(Image1.width div 2,Image1.height);

x:=Xmin+0*(Xmax-Xmin)/Image1.Width;

yy:=(PH(x,a,y,Xmax,Xmin,Ymax,Ymin));

image1.Canvas.MoveTo(0,trunc(Image1.Height-(yy-Ymin)*Image1.height/(Ymax-Ymin)));

for PX:=0 to Image1.Width do

begin

x:=Xmin+PX*(Xmax-Xmin)/Image1.Width;

yy:=(PH(x,a,y,Xmax,Xmin,Ymax,Ymin));

PY:=trunc(Image1.Height-(yy-Ymin)*Image1.height/(Ymax-Ymin));

Image1.Canvas.Pen.Color:=clGreen;

Image1.Canvas.LineTo(PX,PY);

end;

button1.Enabled:=False;

//button2.Enabled:=False;

Button3.Enabled:=True;

koord:=True;

end;

procedure TForm1.Button3Click(Sender: TObject);

begin

x:=StrToFloat(Edit2.text);

yy:=(PH(x,a,y,Xmax,Xmin,Ymax,Ymin));

Memo1.Lines.add('Значение функции в точке '+FloatToStr(x)+' = '+FloatToStr(yy));

end;

procedure TForm1.Image1Click(Sender: TObject);

var

MyMouse: TMouse;

px,py:integer;

yy,xx: Extended;

begin

if Button2.Enabled=False then Exit;

if Edit1.Text='' then

n:=0

else

n:=StrToInt(Edit1.text);

if koord=False then

n:=n+1;

StringGrid1.ColCount:=n;

StringGrid1.Width:=(n)*67;

StringGrid1.Visible:=true;

Edit1.text:=IntToStr(n);

Xmax:=10;

Xmin:=-10;

Ymax:=10;

Ymin:=-10;

px:=ScreenToClient(MyMouse.CursorPos).x-image1.left;

py:=(ScreenToClient(MyMouse.CursorPos).y-image1.top);

{ Memo1.Lines.add(inttostr(px) + 'Х ' + inttostr(py)); }

yy:=(Ymax-(py*((Ymax-Ymin)/image1.height)));

xx:=(Xmin+px*(Ymax-Ymin)/image1.width);

if koord=False then begin

StringGrid1.Cells[n-1,0]:=FloatToStrF(xx,ffFixed,4,2);

StringGrid1.Cells[n-1,1]:=FloatToStrF(yy,ffFixed,4,2); end;

if koord=True then Edit2.Text:=FloatToStrF(xx,ffFixed,4,2);

if koord=False then

Memo1.Lines.add('x: '+FloatToStrF(xx,ffFixed,4,2)+' y:'+FloatToStrF(yy,ffFixed,4,2));

Image1.Canvas.Ellipse(px-2,py-2,px+2,py+2);

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

image1.Canvas.MoveTo(0,Image1.height div 2);

image1.Canvas.LineTo(Image1.width,Image1.height div 2);

image1.Canvas.MoveTo(Image1.width div 2,0);

image1.Canvas.LineTo(Image1.width div 2,Image1.height);

koord:=False;

end;

end.

3.6 Интерполяция сплайнами

3.6.1 Листинг

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Grids, ExtCtrls, jpeg;

type

TForm1 = class(TForm)

StringGrid1: TStringGrid;

Edit1: TEdit;

Image1: TImage;

Button2: TButton;

Button1: TButton;

Memo1: TMemo;

Label1: TLabel;

Label2: TLabel;

Edit2: TEdit;

Button3: TButton;

Panel1: TPanel;

Panel2: TPanel;

Label3: TLabel;

Label4: TLabel;

lbl7: TLabel;

bvl1: TBevel;

Image2: TImage;

lbl10: TLabel;

lbl1: TLabel;

lbl2: TLabel;

lbl3: TLabel;

lbl4: TLabel;

lbl5: TLabel;

lbl6: TLabel;

Image3: TImage;

lbl9: TLabel;

procedure Button2Click(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

type

Mas=array[0..100] of Extended;

var

Form1: TForm1;

Xmax,Xmin,Ymax,Ymin:extended;

i,j,n,k,raz,nn : integer;

Q,P :Mas;

xx,a,b,c,d,y,cc,h,aa,bb:Mas;

st:string;

R:real;

yy:real;

PX,PY,Lg,Rg:integer;

x,XXmax,XXmin: extended;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin

n:=StrToInt(Edit1.text);

StringGrid1.ColCount:=n;

StringGrid1.Width:=(n)*67;

StringGrid1.Visible:=true;

end;

function S(x: Extended; i:Integer; a,y,xx,c,b,d:Mas ; var Xmax,Xmin,Ymax,Ymin:extended):Extended;

var

Sum, Mng: extended;

begin

Sum:=0;

Sum:=a[i]+b[i]*(x-xx[i-1])+c[i]*(x-xx[i-1])*(x-xx[i-1])+d[i]*(x-xx[i-1])*(x-xx[i-1])*(x-xx[i-1]);

S:=Sum;

Xmax:=10;

Xmin:=-10;

Ymax:=10;

Ymin:=-10;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

memo1.Text:='';

Panel1.Visible:=true;

Panel2.Visible:=true;

nn:=StrToInt(Edit1.text);

n:=nn-1;

for j:=0 to n do

begin

xx[j]:=StrToFloat(StringGrid1.Cells[j,0]);

y[j]:=StrToFloat(StringGrid1.Cells[j,1]);

end;

for i:=1 to n do

h[i]:=xx[i]-xx[i-1];

c[1]:=0;

aa[2]:=0;

Q[1]:=0;

p[1]:=0;

for i:=2 to n do

begin // Нахождение коэф с[i] методом прогонки

bb[i]:=2*(h[i-1]+h[i]);

cc[i]:=h[i];

aa[i+1]:=h[i];

d[i]:=3*((y[i]-y[i-1])/h[i]-(y[i-1]-y[i-2])/h[i-1]); {y[0]}

P[i]:=(-cc[i])/(bb[i]+aa[i]*P[i-1]);

Q[i]:=(d[i]-aa[i]*Q[i-1])/(bb[i]+aa[i]*P[i-1]);

end;

c[n+1]:=0;

for i:=n downto 2 do

begin

c[i]:=P[i]*c[i+1]+Q[i];

end;

c[n+1]:=0;

for i:=1 to n do

begin

b[i]:=((y[i]-y[i-1])/h[i]-(1/3)*h[i]*(c[i+1]+2*c[i]));

d[i]:=(c[i+1]-c[i])/(3*h[i]);

a[i]:=y[i-1];

end;

for i:=1 to n do

begin

With Form1.Memo1.Lines do

begin

Add('a = '+FloatToStrF(a[i],fffixed,4,2));

Add('b = '+FloatToStrF(b[i],fffixed,4,2));

Add('c = '+FloatToStrF(c[i],fffixed,4,2));

Add('d = '+FloatToStrF(d[i],fffixed,4,2));

Add('----------------');

end;

end;

image1.Canvas.MoveTo(0,Image1.height div 2);

image1.Canvas.LineTo(Image1.width,Image1.height div 2);

image1.Canvas.MoveTo(Image1.width div 2,0);

image1.Canvas.LineTo(Image1.width div 2,Image1.height);

for i:=1 to n do

begin

XXmax:=xx[i];

XXmin:=xx[i-1];

x:=XXmin;

yy:=(S(x,i,a,y,xx,c,b,d,Xmax,Xmin,Ymax,Ymin));

image1.Canvas.MoveTo(Trunc((XXmin-Xmin)*(Image1.Width/(Xmax-Xmin))),trunc(Image1.Height-(yy-Ymin)*Image1.height/(Ymax-Ymin)));

Image1.Canvas.Pixels[Trunc((XXmin-Xmin)*(Image1.Width/(Xmax-Xmin))),trunc(Image1.Height-(yy-Ymin)*Image1.height/(Ymax-Ymin))]:=clRed;

Rg:=trunc((xx[i]-xx[i-1])*(Image1.Width/(Xmax-Xmin)));

for PX:=0 to Rg do

Begin

x:=XXmin+PX*(Xmax-Xmin)/Image1.Width;

yy:=(S(x,i,a,y,xx,c,b,d,Xmax,Xmin,Ymax,Ymin));

PY:=trunc(Image1.Height-(yy-Ymin)*Image1.height/(Ymax-Ymin));

Image1.Canvas.Pen.Color:=clRed;

Lg:=trunc((x-Xmin)*(Image1.Width/(Xmax-Xmin)));

Image1.Canvas.LineTo(Lg,PY);

end;

end;

memo1.Visible:=TRUE;

end;

procedure TForm1.Button3Click(Sender: TObject);

begin

x:=StrToFloat(Edit2.text);

for i:=1 to n do

if (x>=xx[i-1]) and (x<=xx[i]) then

begin

yy:=(S(x,i,a,y,xx,c,b,d,Xmax,Xmin,Ymax,Ymin));

Form1.memo1.lines.add('Значение функции в точке '+FloatToStr(x)+'= '+FloatToStr(yy));

Exit;

end;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

{ image1.Canvas.MoveTo(0,Image1.height div 2);

image1.Canvas.LineTo(Image1.width,Image1.height div 2);

image1.Canvas.MoveTo(Image1.width div 2,0);

image1.Canvas.LineTo(Image1.width div 2,Image1.height); }

end;

end.

3.7 Метод наименьших квадратов

x

0

1

2

3

4

5

y

2,1

5,9

12,2

19,8

30,3

41,6

3.7.1 Листинг

unit Unitmnk;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

Grids, StdCtrls, ExtCtrls, jpeg,Math;

type

TForm1 = class(TForm)

SG1: TStringGrid;

Button2: TButton;

Image1: TImage;

Button3: TButton;

Button4: TButton;

Button5: TButton;

Button6: TButton;

lbl7: TLabel;

bvl1: TBevel;

lbl10: TLabel;

lbl1: TLabel;

lbl2: TLabel;

lbl3: TLabel;

lbl4: TLabel;

lbl5: TLabel;

lbl6: TLabel;

Image2: TImage;

lbl9: TLabel;

Edit1: TEdit;

Edit2: TEdit;

lbl8: TLabel;

lbl11: TLabel;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure FormCreate(Sender: TObject);

procedure Button5Click(Sender: TObject);

procedure Button6Click(Sender: TObject);

private

{ Private declarations }

public

function f(m:extended; var Xmax,Xmin,Ymax,Ymin:extended):extended;

function f2(m:extended; var Xmax,Xmin,Ymax,Ymin:extended):extended;

{ Public declarations }

end;

var

Form1: TForm1;

implementation

var kol,i,j,k,l,k1,n1,n,rcnt,check,check2:integer;

x,fk,t:array [1..50] of extended;

fksum,xsum,a,b,v,w:extended;

Xmax,Xmin,Ymax,Ymin,summa,summa2:extended;

matrix: array [1..10,1..11] of extended;

r,s,xsumkv,xsumkub,xsum4,fksum1, fksum2, fksum3:extended;

{$R *.DFM}

function Tform1.f(m:extended; var Xmax,Xmin,Ymax,Ymin:extended):extended;

Begin

for i:=1 to kol do begin

x[i]:=StrToFloat(SG1.Cells[0,i-1]);

fk[i]:=StrToFloat(SG1.Cells[1,i-1]);

end;

fksum:=0;

xsum:=0;

for i:=1 to kol do begin

fksum:=fksum+fk[i];

xsum:=xsum+x[i];

end;

fksum:=fksum/(kol);

xsum:=xsum/(kol);

b:=0;

v:=0;

w:=0;

for i:=1 to kol do begin

v:=v+(x[i]-xsum)*(fk[i]-fksum); //верхняя сумма

w:=w+sqr(x[i]-xsum); //нижняя сумма

end;

b:=v/w;

a:=fksum-b*xsum;

f:=a+b*m;

End;

function Tform1.f2(m:extended; var Xmax,Xmin,Ymax,Ymin:extended):extended;

Begin

for i:=1 to kol do begin

x[i]:=StrToFloat(SG1.Cells[0,i-1]);

fk[i]:=StrToFloat(SG1.Cells[1,i-1]);

end;

{ФУНКЦИЯ!!!!}

xsum:=0;

xsumkv:=0;

xsumkub:=0;

xsum4:=0;

fksum1:=0;

fksum2:=0;

fksum3:=0;

for i:=1 to kol do begin

xsum:=xsum+x[i];

xsumkv:=xsumkv+sqr(x[i]);

xsumkub:=xsumkub+sqr(x[i])*x[i];

xsum4:=xsum4+sqr(sqr(x[i]));

fksum1:=fksum1+fk[i];

fksum2:=fksum2+fk[i]*x[i];

fksum3:=fksum3+fk[i]*sqr(x[i]);

end;

matrix[1,1]:=kol+1;

matrix[1,2]:=xsum;

matrix[1,3]:=xsumkv;

matrix[1,4]:=fksum1;

matrix[2,1]:=xsum;

matrix[2,2]:=xsumkv;

matrix[2,3]:=xsumkub;

matrix[2,4]:=fksum2;

matrix[3,1]:=xsumkv;

matrix[3,2]:=xsumkub;

matrix[3,3]:=xsum4;

matrix[3,4]:=fksum3;

n:=3;

n1:=n+1;

for k:=1 to n do begin k1:=k+1;

s:=matrix[k,k];

for j:=k1 to n1 do matrix[k,j]:=matrix[k,j]/s;

for i:=k1 to n do begin r:=matrix[i,k];

for j:=k1 to n1 do matrix[i,j]:=matrix[i,j]-matrix[k,j]*r;

end;

end;

for i:=n downto 1 do begin s:=matrix[i,n1];

for j:=i+1 to n do s:=s-matrix[i,j]*t[j];

t[i]:=s;

end;

f2:=t[1]+t[2]*m+t[3]*sqr(m);

End;

procedure TForm1.Button1Click(Sender: TObject);

begin

button2.Visible:=true;

button3.Visible:=true;

button4.Visible:=true;

SG1.Visible:=true;

SG1.rowcount:=kol;

with SG1 do

for i:=0 to RowCount do //очищаем её

for j:=0 to ColCount do

Cells[j, i]:='';

SG1.height:=SG1.DefaultRowHeight*kol+10;

end;

procedure TForm1.Button2Click(Sender: TObject);

var x,y:real;

PX,PY:longInt;

o:Integer;

begin

image1.Canvas.MoveTo(0,Image1.height div 2);

image1.Canvas.LineTo(Image1.width,Image1.height div 2);

image1.Canvas.MoveTo(Image1.width div 2,0);

image1.Canvas.LineTo(Image1.width div 2,Image1.height);

image1.Canvas.MoveTo(0,Image1.height);

for PX:=0 to Image1.Width do

begin

x:=Xmin+PX*(Xmax-Xmin)/Image1.Width;

y:=F(x,Xmax,Xmin,Ymax,Ymin);

for o:=0 to SG1.RowCount-1 do begin

if (round(x)=round(StrToFloat(SG1.Cells[0,o]))) then begin

summa2:=summa2+Power((y-StrToFloat(SG1.Cells[1,o])),2);

// ShowMessage('Сумма квадратов отклонений для полинома 1 '+FloatToStr(summa2));

check2:=check2+1;

if check2=1 then

if check2=5 then check2:=0;

end;

end;

PY:=round(Image1.Height-(y-Ymin)*Image1.height/(Ymax-Ymin));

Image1.Canvas.LineTo(PX,PY);

{image1.Canvas.Pixels[PX,PY]:=clRed; }

//Button2.Enabled:=FALSE;

end;

ShowMessage('Сумма квадратов отклонений для полинома первой степени '+FloatToStr(summa2));

Edit2.Text:=FloatToStr(summa2);

end;

procedure TForm1.Button3Click(Sender: TObject);

var y:extended;

px,PY:longInt;

begin

image1.Canvas.MoveTo(0,Image1.height div 2);

image1.Canvas.LineTo(Image1.width,Image1.height div 2);

image1.Canvas.MoveTo(Image1.width div 2,0);

image1.Canvas.LineTo(Image1.width div 2,Image1.height);

image1.Canvas.MoveTo(0,Image1.height);

for i:=1 to kol do begin

x[i]:=StrToFloat(SG1.Cells[0,i-1]);

fk[i]:=StrToFloat(SG1.Cells[1,i-1]);

end;

for i:=1 to kol do begin

px:=round(Image1.width div 2+x[i]*Image1.width/(Xmax-Xmin));

py:=round(Image1.height div 2-fk[i]*Image1.width/(Xmax-Xmin));

image1.Canvas.Ellipse(px-5, py-5, px+5, py+5);

end;

end;

procedure TForm1.Button4Click(Sender: TObject);

var x,y,m,b:real;

n:string;

PX,PY:longInt;

o:Integer;

begin

{image1.Canvas.MoveTo(0,Image1.height div 2);

image1.Canvas.LineTo(Image1.width,Image1.height div 2);

image1.Canvas.MoveTo(Image1.width div 2,0);

image1.Canvas.LineTo(Image1.width div 2,Image1.height);

image1.Canvas.MoveTo(0,Image1.height);}

for PX:=0 to Image1.Width do

begin

x:=Xmin+PX*(Xmax-Xmin)/Image1.Width;

y:=F2(x,Xmax,Xmin,Ymax,Ymin);

for o:=0 to SG1.RowCount-1 do begin

if (round(x)=round(StrToFloat(SG1.Cells[0,o]))) then begin

summa:=summa+Power((y-StrToFloat(SG1.Cells[1,o])),2);

check:=check+1;

if check=1 then

if check=5 then check:=0;

end;

end;

PY:=round(Image1.Height-(y-Ymin)*Image1.height/(Ymax-Ymin));

Image1.Canvas.LineTo(PX,PY);

{image1.Canvas.Pixels[PX,PY]:=clRed; }

//Button4.Enabled:=FALSE;

end;

ShowMessage('Сумма квадратов отклонений для полинома второй степени = '+FloatToStr(summa));

Edit1.Text:=FloatToStr(summa);

end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

var x1,y1:extended;

PX,PY:longInt;

begin

SG1.Visible:=True;

x1:=Xmin+x*(Xmax-Xmin)/Image1.Width; //переводим из пикселей в наши координаты

y1:=(Xmax-Xmin)*(Image1.Height div 2-y)/Image1.Width;

if rcnt<>0 then SG1.rowcount:=SG1.rowcount+1;

SG1.Cells[0,SG1.rowcount-1]:=FloatToStr(x1);

SG1.Cells[1,SG1.rowcount-1]:=FloatToStr(y1);

SG1.height:=SG1.DefaultRowHeight*SG1.rowcount+15;

px:=round(Image1.width div 2+x1*Image1.width/(Xmax-Xmin));

py:=round(Image1.height div 2-y1*Image1.width/(Xmax-Xmin));

image1.Canvas.Ellipse(px-5, py-5, px+5, py+5);

kol:=kol+1;

rcnt:=1;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

image1.Canvas.MoveTo(0,Image1.height div 2);

image1.Canvas.LineTo(Image1.width,Image1.height div 2);

image1.Canvas.MoveTo(Image1.width div 2,0);

image1.Canvas.LineTo(Image1.width div 2,Image1.height);

image1.Canvas.MoveTo(0,Image1.height);

//SG1.Visible:=false;

kol:=0;

Xmax:=40;

Xmin:=-40;

Ymax:=40;

Ymin:=-40;

rcnt:=0;

summa:=0;

summa2:=0;

check:=0;

check2:=0;

end;

procedure TForm1.Button5Click(Sender: TObject);

begin

Button3.visible:=true;

Button6.visible:=true;

Button4.visible:=true;

Button2.visible:=true;

image1.Canvas.MoveTo(0,Image1.height div 2);

image1.Canvas.LineTo(Image1.width,Image1.height div 2);

image1.Canvas.MoveTo(Image1.width div 2,0);

image1.Canvas.LineTo(Image1.width div 2,Image1.height);

image1.Canvas.MoveTo(0,Image1.height);

SG1.Visible:=true;

kol:=kol+1;

SG1.rowcount:=kol;

SG1.height:=SG1.DefaultRowHeight*kol+15;

//Button5.Enabled:=FALSE;

end;

procedure TForm1.Button6Click(Sender: TObject);

begin

Image1.Canvas.FillRect(Rect(0,0,Width,Height));

image1.Canvas.MoveTo(0,Image1.height div 2);

image1.Canvas.LineTo(Image1.width,Image1.height div 2);

image1.Canvas.MoveTo(Image1.width div 2,0);

image1.Canvas.LineTo(Image1.width div 2,Image1.height);

image1.Canvas.MoveTo(0,Image1.height);

end;

{procedure TForm1.Button8Click(Sender: TObject);

begin

Edit1.Text:=FloatToStr(xsumkv)

end;}

end.

3.8 Дифференцирование многочленами

3.8.1 Листинг

unit DifNiut;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Grids, ExtCtrls, jpeg;

type

TForm1 = class(TForm)

StringGrid1: TStringGrid;

Edit1: TEdit;

Image1: TImage;

Button2: TButton;

Button1: TButton;

Memo1: TMemo;

Label3: TLabel;

Edit2: TEdit;

Button3: TButton;

Panel1: TPanel;

Label5: TLabel;

Edit4: TEdit;

Button4: TButton;

Label6: TLabel;

Button5: TButton;

lbl7: TLabel;

bvl1: TBevel;

lbl8: TLabel;

lbl10: TLabel;

lbl1: TLabel;

lbl2: TLabel;

lbl3: TLabel;

lbl4: TLabel;

lbl5: TLabel;

lbl6: TLabel;

Image2: TImage;

lbl9: TLabel;

procedure Button2Click(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure Image1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure Button5Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

type

Mas=array[1..100] of Extended;

var

Form1: TForm1;

Xmax,Xmin,Ymax,Ymin,Fx:extended;

L,a,y:Mas;

i,j,n,k,kk: integer;

x,yy:real;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin

n:=StrToInt(Edit1.text);

StringGrid1.ColCount:=n;

StringGrid1.Width:=(n)*67;

StringGrid1.Visible:=true;

end;

function PH(x: Extended; a,y:Mas ; var Xmax,Xmin,Ymax,Ymin:extended):Extended;

var

Sum, Mng, Pn,Pr: extended;

begin

Pn:=0;

For i:=1 to n do

begin

Fx:=1;

Sum:=0;

for k:=1 to i do

begin

for j:=1 to i do

begin

if k<>j then

Fx:=1/(a[k]-a[j])*Fx;

end;

Fx:=Fx*y[k];

Sum:=Sum+Fx;

Fx:=1;

end;

Pr:=1;

if i>1 then

for k:=1 to i-1 do

Pr:=Pr*(x-a[k]);

sum:=sum*pr;

Pn:=Pn+Sum;

end;

PH:=Pn;

Xmax:=10;

Xmin:=-10;

Ymax:=10;

Ymin:=-10;

end;

procedure TForm1.Button2Click(Sender: TObject);

var x,yy:real;

PX,PY:integer;

i,Apx,Ypx: Integer;

begin

k:=0;

n:=StrToInt(Edit1.text);

Xmax:=10;

Xmin:=-10;

Ymax:=10;

Ymin:=-10;

for j:=1 to n do

begin

a[j]:=StrToFloat(StringGrid1.Cells[j-1,0]);

y[j]:=StrToFloat(StringGrid1.Cells[j-1,1])

end;

for j:=1 to n do

begin

Apx:=trunc((a[j]-Xmin)*Image1.Width/(Xmax-Xmin));

Ypx:=trunc(Image1.Height-(y[j]-Ymin)*Image1.height/(Ymax-Ymin));

Image1.Canvas.Pixels[Apx,Ypx]:=clBlack;

end;

image1.Canvas.MoveTo(0,Image1.height div 2);

image1.Canvas.LineTo(Image1.width,Image1.height div 2);

image1.Canvas.MoveTo(Image1.width div 2,0);

image1.Canvas.LineTo(Image1.width div 2,Image1.height);

x:=Xmin+0*(Xmax-Xmin)/Image1.Width;

yy:=(PH(x,a,y,Xmax,Xmin,Ymax,Ymin));

image1.Canvas.MoveTo(0,trunc(Image1.Height-(yy-Ymin)*Image1.height/(Ymax-Ymin)));

for PX:=0 to Image1.Width do

begin

x:=Xmin+PX*(Xmax-Xmin)/Image1.Width;

yy:=(PH(x,a,y,Xmax,Xmin,Ymax,Ymin));

PY:=trunc(Image1.Height-(yy-Ymin)*Image1.height/(Ymax-Ymin));

Image1.Canvas.Pen.Color:=clRed;

Image1.Canvas.LineTo(PX,PY);

end;

end;

function Pr1(x,h:Extended):Extended;

Var

Pr:extended;

begin

Pr:=(PH(x+h,a,y,Xmax,Xmin,Ymax,Ymin)-PH(x,a,y,Xmax,Xmin,Ymax,Ymin))/h;

Pr1:=pr;

end;

function Pr2(x,h:Extended):Extended;

Var

Pr:extended;

begin

Pr:=(Pr1(x+h,h)-Pr1(x,h))/h;

Pr2:=pr;

end;

function Pr3(x,h:Extended):Extended;

Var

Pr:extended;

begin

Pr:=(Pr2(x+h,h)-Pr2(x,h))/h;

Pr3:=pr;

end;

function Pr4(x,h:Extended):Extended;

Var

Pr:extended;

begin

Pr:=(Pr3(x+h,h)-Pr3(x,h))/h;

Pr4:=pr;

end;

procedure TForm1.Button3Click(Sender: TObject);

Var

Px,Py: integer;

begin

x:=StrToFloat(Edit2.text);

yy:=(PH(x,a,y,Xmax,Xmin,Ymax,Ymin));

Memo1.Lines.add('Значение функции в точке '+FloatToStr(x)+' = '+FloatToStr(yy));

px:=round(Image1.Width/2+x*Image1.width/(Xmax-Xmin));

py:=round(Image1.Height/2-yy*Image1.height/(Ymax-Ymin));

image1.Canvas.Ellipse(px-5, py-5, px+5, py+5);

end;

procedure TForm1.Button4Click(Sender: TObject);

Var

Pr,Sum:Extended;

p:integer;

begin

memo1.text:='';

Sum:=0;

k:=1;

for i:=n-1 downto 2 do

k:=k*(i);

for p:=1 to n do

begin

Pr:=1;

for i:=1 to n do

begin

if i<>p then

Pr:=Pr/(a[p]-a[i]);

end;

Sum:=Sum+Pr*k*y[p];

end;

Form1.Memo1.Lines.add('Производная 1-ого порядка = '+FloatToStr(Pr1(StrToFloat(Edit4.text),0.1)));

Form1.Memo1.Lines.add('Производная 2-ого порядка = '+FloatToStr(Pr2(StrToFloat(Edit4.text),0.1)));

Form1.Memo1.Lines.add('Производная 3-ого порядка = '+FloatToStr(Pr3(StrToFloat(Edit4.text),0.1)));

Form1.Memo1.Lines.add('Производная 4-ого порядка = '+FloatToStr(Pr4(StrToFloat(Edit4.text),0.1)));

Form1.Memo1.Lines.add('Производная '+FloatToStr(n-1)+' ого порядка Многочлена степени :'+FloatToStr(n-1)+' ='+FloatToStr(sum));

end;

procedure TForm1.Image1Click(Sender: TObject);

var

MyMouse: TMouse;

px,py:integer;

yy,xx: Extended;

begin

if Edit1.Text='' then

n:=0

else

n:=StrToInt(Edit1.text);

n:=n+1;

StringGrid1.ColCount:=n;

StringGrid1.Width:=(n)*67;

StringGrid1.Visible:=true;

Edit1.text:=IntToStr(n);

Xmax:=10;

Xmin:=-10;

Ymax:=10;

Ymin:=-10;

px:=ScreenToClient(MyMouse.CursorPos).x-image1.left;

py:=(ScreenToClient(MyMouse.CursorPos).y-image1.top);

{ Memo1.Lines.add(inttostr(px) + 'Х ' + inttostr(py)); }

yy:=(Ymax-(py*((Ymax-Ymin)/image1.height)));

xx:=(Xmin+px*(Ymax-Ymin)/image1.width);

StringGrid1.Cells[n-1,0]:=FloatToStrF(xx,ffFixed,4,2);

StringGrid1.Cells[n-1,1]:=FloatToStrF(yy,ffFixed,4,2);

Memo1.Lines.add('x: '+FloatToStrF(xx,ffFixed,4,2)+' y:'+FloatToStrF(yy,ffFixed,4,2));

Image1.Canvas.Ellipse(px-2,py-2,px+2,py+2);

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

image1.Canvas.MoveTo(0,Image1.height div 2);

image1.Canvas.LineTo(Image1.width,Image1.height div 2);

image1.Canvas.MoveTo(Image1.width div 2,0);

image1.Canvas.LineTo(Image1.width div 2,Image1.height);

Memo1.Text:='';

end;

procedure TForm1.Button5Click(Sender: TObject);

begin

Edit1.text:='';

For i:=0 to StringGrid1.ColCount-1 do

StringGrid1.Cols[i].Clear;

Image1.Picture:= nil;

StringGrid1.Width:=StringGrid1.DefaultColWidth;

i:=0;

image1.Canvas.MoveTo(0,Image1.height div 2);

image1.Canvas.LineTo(Image1.width,Image1.height div 2);

image1.Canvas.MoveTo(Image1.width div 2,0);

image1.Canvas.LineTo(Image1.width div 2,Image1.height);

Memo1.Clear;

StringGrid1.ColCount:=0;

end;

end.

3.9 Метод Монте-Карло

3.9.1 Листинг

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, jpeg, ExtCtrls;

type

TForm1 = class(TForm)

Edit1: TEdit;

Edit2: TEdit;

Label1: TLabel;

Label2: TLabel;

Button1: TButton;

Edit3: TEdit;

Label3: TLabel;

Edit4: TEdit;

Edit5: TEdit;

Label4: TLabel;

Label5: TLabel;

Memo1: TMemo;

lbl7: TLabel;

bvl1: TBevel;

lbl8: TLabel;

img2: TImage;

lbl10: TLabel;

lbl1: TLabel;

lbl2: TLabel;

lbl3: TLabel;

lbl4: TLabel;

lbl5: TLabel;

lbl6: TLabel;

Image1: TImage;

lbl9: TLabel;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var

Pop:integer; //Количество попавших точек

N,i:integer;

Ver,x,y,alfa,betta,S,a,Sigma,h:extended;

begin

a := StrToFloat(Edit2.text);

alfa := StrToFloat(Edit3.text);

betta := StrToFloat(Edit4.text);

N := StrToInt(Edit5.text); //Количество точек

Sigma := StrToFloat(Edit1.text);

h := 1/(sqrt(2*3.14159265)*Sigma);

S := (betta-alfa)*(1/(sqrt(2*3.14159265)*Sigma));

Pop:=0; Ver:=0;

For i:=1 to N do

begin

Randomize();

x := alfa+(betta-alfa)*Random;

y := Random*h;

If y <= (1/(sqrt(2*3.14159265)*Sigma))*exp((-1)*((x-a)*(x-a))/(2*Sigma*Sigma)) then

Pop:=Pop+1;

end;

If Pop <> 0 then

begin

Ver:=((Pop/N)*S);

Memo1.Lines.add(IntToStr(Pop)+' - Кол-во попавших точек '+FloatToStr(Ver)+' - Площадь под кривой');

end

else

ShowMessage('Нет попавших точек');

end;

end.

3.10 Метод Рунге-Кутты

3.10.1 Листинг

unit UnitChInt11;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Grids, Math, ExtCtrls, TeeProcs, TeEngine, Chart,

Series, jpeg;

type

TForm1 = class(TForm)

SG1: TStringGrid;

Button1: TButton;

Label5: TLabel;

Edit1: TEdit;

Label1: TLabel;

Label2: TLabel;

Edit2: TEdit;

Label3: TLabel;

Edit3: TEdit;

Edit4: TEdit;

Label10: TLabel;

Edit6: TEdit;

Chart1: TChart;

Series1: TLineSeries;

lbl10: TLabel;

lbl1: TLabel;

lbl2: TLabel;

lbl3: TLabel;

lbl4: TLabel;

lbl5: TLabel;

lbl6: TLabel;

Image1: TImage;

lbl9: TLabel;

bvl1: TBevel;

Label9: TStaticText;

Label7: TStaticText;

Label4: TStaticText;

Label6: TStaticText;

Label8: TStaticText;

bvl2: TBevel;

Image2: TImage;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

function f(x,y:double):double;

begin

result:=x*x - y*y;

end;

procedure TForm1.Button1Click(Sender: TObject);

var i: integer;

Y0,Xb,Xe,h: double;

Yi,Xi: double;

Ki1,Ki2,Ki3,Ki4,DeltaYi: double;

Xk,Yk: double;

begin

Y0:=StrToFloat(Edit1.Text);

Xb:=StrToFloat(Edit4.Text); Xe:=StrToFloat(Edit3.Text);

h:=StrToFloat(Edit2.Text);

SG1.Cells[0,0]:='i'; SG1.Cells[1,0]:='Xi'; SG1.Cells[2,0]:='Xi+h/2';

SG1.Cells[3,0]:='Xi+1'; SG1.Cells[4,0]:='Yi';

i:=SG1.RowCount-2;

SG1.RowCount:=SG1.RowCount+1;

Xi:=Xb; Yi:=Y0;

if i=0 then begin

SG1.Cells[0,i+1]:=IntToStr(i); SG1.Cells[1,i+1]:=FloatToStr(Xb);

SG1.Cells[2,i+1]:=FloatToStr(Xb+h/2); SG1.Cells[3,i+1]:=FloatToStr(Xb+h);

SG1.Cells[4,i+1]:=FloatToStr(Y0);

Series1.AddXY(Xb,Y0,'',clRed);

end

else begin

Xi:=StrToFloat(SG1.Cells[1,i])+h; Yi:=StrToFloat(Edit6.Text);

SG1.Cells[0,i+1]:=IntToStr(i); SG1.Cells[1,i+1]:=FloatToStr(Xi);

SG1.Cells[2,i+1]:=FloatToStr(Xi+h/2); SG1.Cells[3,i+1]:=FloatToStr(Xi+h);

SG1.Cells[4,i+1]:=FloatToStr(Yi);

end;

Ki1:=h*f(Xi,Yi);

Xk:=Xi+h/2; Yk:=Yi+Ki1/2;

Ki2:=h*f(Xk,Yk);

Yk:=Yi+Ki2/2;

Ki3:=h*f(Xk,Yk);

Xk:=Xi+h; Yk:=Yi+Ki3;

Ki4:=h*f(Xk,Yk);

DeltaYi:=(Ki1+2*Ki2+2*Ki3+Ki4)/6;

Yi:=Yi+DeltaYi;

Label10.Caption:='Y'+IntToStr(i); Edit6.Text:=FloatToStr(Yi);

Series1.AddXY(Xi,Yi,'',clRed);

if Xi=Xe then Button1.Enabled:=false;

end;

end.

3.11 Краевая задача

3.11.1 Листинг

unit UnitKrZ11;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Grids, Math, ExtCtrls, TeeProcs, TeEngine, Chart,

Series, jpeg, Menus;

type

TForm1 = class(TForm)

sg1: TStringGrid;

bt2: TButton;

ed3: TEdit;

Label7: TLabel;

Label1: TLabel;

Label2: TLabel;

ed9: TEdit;

ch1: TChart;

Series1: TLineSeries;

ed2: TEdit;

ed1: TEdit;

ed4: TEdit;

ed5: TEdit;

ed6: TEdit;

ed7: TEdit;

ed8: TEdit;

sg2: TStringGrid;

bt1: TButton;

lbl10: TLabel;

lbl1: TLabel;

lbl2: TLabel;

lbl3: TLabel;

lbl4: TLabel;

lbl5: TLabel;

lbl6: TLabel;

Image1: TImage;

lbl9: TLabel;

lbl7: TLabel;

bvl1: TBevel;

Label3: TStaticText;

Label4: TStaticText;

Label5: TStaticText;

Label6: TStaticText;

Label8: TStaticText;

Label9: TStaticText;

Label10: TStaticText;

Label11: TStaticText;

Image2: TImage;

procedure bt2Click(Sender: TObject);

procedure bt1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

const max=50;

type vector=array[0..max] of double;

var

alfa1,beta1,alfa2,beta2,c1,c2,h,x,y: double;

a,b,n,i,j: integer;

Am,Bm,Cm,Dm,Pm,Qm,Xm: vector;

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.bt1Click(Sender: TObject); //Кнопка ОК

begin

bt1.Enabled:=false; bt2.Visible:=true; sg1.Visible:=true;

a:=StrToInt(ed1.Text); b:=StrToInt(ed2.Text);

alfa1:=StrToFloat(ed3.Text); beta1:=StrToFloat(ed4.Text);

c1:=StrToFloat(ed5.Text);

alfa2:=StrToFloat(ed6.Text); beta2:=StrToFloat(ed7.Text);

c2:=StrToFloat(ed8.Text);

h:=StrToFloat(ed9.Text);

if frac((b-a)/h)>0.999999999999 then

n:=round((b-a)/h)

else begin

ShowMessage('Выбранный шаг не позволяет поделить заданный отрезок на четное колличество отрезков!');

h:=(b-a)/trunc((b-a)/h);

n:=round((b-a)/h);

ShowMessage('Шаг изменнен на h = '+FloatToStr(h));

end;

ShowMessage('Колличество отрезков n = '+IntToStr(n));

ed9.Text:=FloatToStr(h);

sg1.RowCount:=n+1; sg1.ColCount:=n+3;

sg2.RowCount:=n+2;

sg1.Cells[0,0]:='X'+IntToStr(0)+'='+IntToStr(a); sg1.Cells[0,n]:='X'+IntToStr(n)+'='+IntToStr(b);

sg1.Cells[1,0]:=FloatToStr(beta1*h-alfa1);

sg1.Cells[2,0]:=FloatToStr(alfa1);

sg1.Cells[n+2,0]:=FloatToStr(c1*h);

sg1.Cells[n,n]:=FloatToStr(-2*alfa2);

sg1.Cells[n+1,n]:=FloatToStr(beta2*(h*h)+alfa2);

sg1.Cells[n+2,n]:=FloatToStr(c2*(h*h));

x:=a+h;

for i:=1 to n-1 do begin

sg1.Cells[0,i]:='X'+IntToStr(i)+'='+FloatToStr(x);

sg1.Cells[n+2,i]:=FloatToStr(0);

sg1.Cells[i,i]:=FloatToStr(2);

sg1.Cells[i+1,i]:=FloatToStr((-4)-(x*h)-(2*h*h));

sg1.Cells[i+2,i]:=FloatToStr(2-(x*h));

x:=x+h;

end;

for i:=0 to sg1.ColCount-1 do

for j:=0 to sg1.RowCount-1 do

if sg1.Cells[i,j]='' then sg1.Cells[i,j]:='0';

end;

procedure TForm1.bt2Click(Sender: TObject); //Кнопка Решить

var okr: double;

begin

sg2.Visible:=true; ch1.Visible:=true;

bt2.Enabled:=false;

for i:=0 to n do begin //заполняем векторы исходными данными

Dm[i]:=StrToFloat(sg1.Cells[n+2,i]);

j:=i+1;

if j=1 then Am[i]:=0

else Am[i]:=StrToFloat(sg1.Cells[j-1,i]);

Bm[i]:=-(StrToFloat(sg1.Cells[j,i]));

if j=n+1 then Cm[i]:=0

else Cm[i]:=StrToFloat(sg1.Cells[j+1,i]);

end;

for i:=0 to sg1.RowCount-1 do

sg1.Rows[i].Clear;

sg1.FixedCols:=0; sg1.FixedRows:=1; sg1.ColCount:=8;

sg1.RowCount:=n+2;

sg1.Cells[0,0]:='i'; sg1.Cells[1,0]:='Ai'; sg1.Cells[2,0]:='Bi'; sg1.Cells[3,0]:='i';

sg1.Cells[4,0]:='Di'; sg1.Cells[5,0]:='Pi'; sg1.Cells[6,0]:='Qi'; sg1.Cells[7,0]:='Yi';

okr:=Cm[0]/Bm[0]; Pm[0]:=RoundTo(okr, -5); //подсчет прогоночных коэффициентов

okr:=-Dm[0]/Bm[0]; Qm[0]:=RoundTo(okr, -5);

for i:=1 to n do

begin

Pm[i]:=Cm[i]/(Bm[i]-Am[i]*Pm[i-1]);

okr:=Pm[i];

Pm[i]:=RoundTo(okr, -5);

Qm[i]:=(Am[i]*Qm[i-1]-Dm[i])/(Bm[i]-Am[i]*Pm[i-1]);

okr:=Qm[i];

Qm[i]:=RoundTo(okr, -5);

end;

Xm[n]:=Qm[n];//вычисление корней

for i:=n-1 downto 0 do

begin

Xm[i]:=Pm[i]*Xm[i+1]+Qm[i];

okr:=Xm[i];

Xm[i]:=RoundTo(okr, -5);

end;

for i:=0 to n+1 do //печать таблицы

begin

sg1.Cells[0,i+1]:=IntToStr(i);

sg1.Cells[1,i+1]:=FloatToStr(Am[i]);

sg1.Cells[2,i+1]:=FloatToStr(Bm[i]);

sg1.Cells[3,i+1]:=FloatToStr(Cm[i]);

sg1.Cells[4,i+1]:=FloatToStr(Dm[i]);

sg1.Cells[5,i+1]:=FloatToStr(Pm[i]);

sg1.Cells[6,i+1]:=FloatToStr(Qm[i]);

sg1.Cells[7,i+1]:=FloatToStr(Xm[i]);

end;

x:=a; Series1.Clear;

sg2.Cells[0,0]:='X'; sg2.Cells[1,0]:='Y';

for i:=0 to n+1 do begin //печать корней

sg2.Cells[0,i+1]:=FloatToStr(x);

sg2.Cells[1,i+1]:=FloatToStr(Xm[i]);

Series1.AddXY(x,Xm[i],'',clRed);

x:=x+h;

end;

end;

end.

4. Заключение

Поставленные задачи были успешно решены с помощью самостоятельно разработанного ПО. Конфликтов, сбоев, ошибок и противоречий в работе программ выявлено не было.

Размещено на Allbest.ru


Подобные документы

  • Метод решения задачи, при котором коэффициенты a[i], определяются непосредственным решением системы - метод неопределенных коэффициентов. Интерполяционная формула Ньютона и ее варианты. Построение интерполяционного многочлена Лагранжа по заданной функции.

    лабораторная работа [147,4 K], добавлен 16.11.2015

  • Преобразование коэффициентов полиномов Чебышева. Функции, применяемые в численном анализе. Интерполяция многочленами, метод аппроксимации - сплайн-аппроксимация, ее отличия от полиномиальной аппроксимации Лагранжем и Ньютоном. Метод наименьших квадратов.

    реферат [21,5 K], добавлен 27.01.2011

  • Вычислительные методы линейной алгебры. Интерполяция функций. Интерполяционный многочлен Ньютона. Узлы интерполяции. Интерполяционный многочлен Лагранжа. Интерполяция сплайнами. Коэффициенты кубических сплайнов.

    лабораторная работа [70,5 K], добавлен 06.02.2004

  • Особенности решения алгебраических, нелинейных, трансцендентных уравнений. Метод половинного деления (дихотомия). Метод касательных (Ньютона), метод секущих. Численные методы вычисления определённых интегралов. Решение различными методами прямоугольников.

    курсовая работа [473,4 K], добавлен 15.02.2010

  • Численные методы представляют собой набор алгоритмов, позволяющих получать приближенное (численное) решение математических задач. Два вида погрешностей, возникающих при решении задач. Нахождение нулей функции. Метод половинного деления. Метод хорд.

    курс лекций [81,2 K], добавлен 06.03.2009

  • Некоторые сведения теории вероятностей. Математическое ожидание, дисперсия. Точность оценки, доверительная вероятность. Доверительный интервал. Нормальное распределение. Метод Монте-Карло. Вычисление интегралов методом Монте-Карло. Алгоритмы метода.

    курсовая работа [112,9 K], добавлен 20.12.2002

  • Задачи Коши и методы их решения. Общие понятия, сходимость явных способов типа Рунге-Кутты, практическая оценка погрешности приближенного решения. Автоматический выбор шага интегрирования, анализ брюсселятора и метод Зонневельда для его расчета.

    курсовая работа [1,7 M], добавлен 03.11.2011

  • Метод Монте-Карло як метод моделювання випадкових величин з метою обчислення характеристик їхнього розподілу, оцінка похибки. Обчислення кратних інтегралів методом Монте-Карло, його принцип роботи. Приклади складання програми для роботи цим методом.

    контрольная работа [41,6 K], добавлен 22.12.2010

  • Построить интерполяционный многочлен Ньютона. Начертить график и отметить на нем узлы интерполяции. Построить интерполяционный многочлен Лагранжа. Выполнить интерполяцию сплайнами третьей степени.

    лабораторная работа [70,8 K], добавлен 06.02.2004

  • Методы хорд и итераций, правило Ньютона. Интерполяционные формулы Лагранжа, Ньютона и Эрмита. Точечное квадратичное аппроксимирование функции. Численное дифференцирование и интегрирование. Численное решение обыкновенных дифференциальных уравнений.

    курс лекций [871,5 K], добавлен 11.02.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.