Численные методы решения математических задач
МОСКОВСКИЙ
АВИАЦИОННЫЙ ИНСТИТУТ
(национальный
исследовательский университет)
Факультет №8
«Прикладная математика и физика»
Кафедра 806
«Вычислительная математика и программирование»
ОТЧЕТ
по
расчетно-графической
работе
по дисциплине
«Вычислительная
математика»
Выполнил:
Студент группы 03-325
Игнатенко А.В.
Преподаватель:
Кринецкий О.Е.
Москва 2012
ОГЛАВЛЕНИЕ
1. Постановка задачи
. Формулировка заданий РГР
. Выполнение расчетно-графической работы
.1 Метод Гаусса
.1.1 Листинг
.2 Метод прогонки
.2.1 Листинг
.3 Нелинейное уравнение
.3.1 Листинг
.4 Метод вращения Якоби
.4.1 Листинг
.5 Интерполяционный многочлен
.5.1 Интерполяционный многочлен Лагранжа
.5.2 Интерполяционный многочлен Ньютона
.6 Интерполяция сплайнами
.6.1 Листинг
.7 Метод наименьших квадратов
.7.1 Листинг
.8 Дифференцирование многочленами
.8.1 Листинг
.9 Метод Монте-Карло
.9.1 Листинг
.10 Метод Рунге-Кутты
.10.1 Листинг
.11 Краевая задача
.11.1 Листинг
. Заключение
1. Постановка задачи
Выполнить задания 1-11 расчетно-графической работы в соответствии с
вариантом. При выполнении заданий разрешается пользоваться различным
программным обеспечением, учитывая следующие требования:
) Алгоритм работы и листинг используемого программного обеспечения должен
быть понятен студенту. Студент должен предоставить необходимые разъяснения по
требованию преподавателя, либо усовершенствовать/дополнить программу, если это
необходимо;
) ПО не должно использовать никаких сторонних программ для проведения
математических вычислений, построения графиков и т.д. Весь функционал ПО должен
быть заключен в его собственном коде;
) При предоставлении собственноручно написанного ПО, студенту следует
разместить на носителе, содержащем ПО, дистрибутив той среды программирования,
в которой было написано ПО.
2. Формулировка заданий РГР
нелинейный уравнение интерполяционный многочлен
Расчетно-графическая работа состоит из нескольких заданий, для успешного
решения которых необходимо продемонстрировать владение численными методами
решения математических задач.
Формулировка всех заданий приведена ниже.
) Методом Гаусса с точностью ε=0,01 решить СЛАУ;
) Методом прогонки решить СЛАУ, ε=0,01;
) Методом простой итерации (или любым другим) с ε=0,01
уточнить один из корней
уравнения;
) Методом вращения с ε=0,01 вычислить собственные значения и
собственные вектора симметрической матрицы А;
) Выписать интерполяционные многочлены Лагранжа и Ньютона для узловых
значений {xi, yi}, заданных функцией y=f(x);
) Для таблицы задания 5 выписать кубические сплайны дефекта 1 на каждом
отрезке x∈[xi-1, xi], i=1..4;
) Методом наименьших квадратов аппроксимировать линейным и квадратичным
многочленом заданную таблицу.
) Используя таблицу задания 5 найти значение 1-й и 2-й производной в
заданной точке.
) Методом Рунге-Кутты с шагом h=0,1 и ε=0,01 решить задачу Коши.
) Методом прогонки с шагом h=0,1
и 0(h2) решить краевую задачу для ОДУ.
3. Выполнение расчетно-графической работы
Все задания, представленные в РГР, были выполнены с использованием
собственноручно разработанного ПО и в соответствии с требуемым вариантом.
Описание метода, описание алгоритма, скриншоты работы и листинг прилагаются.
3.1 Метод Гаусса
В ходе работы программы были подсчитаны корни СЛАУ:
Определитель введенной матрицы:
3.1.1 Листинг
unit Gauss;, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms,, StdCtrls, Grids, ExtCtrls, jpeg;= class(TForm): TStringGrid;:
TButton;: TEdit;: TLabel;: TButton;: TMemo;: TLabel;: TLabel;: TLabel;:
TLabel;: TLabel;: TLabel;: TLabel;: TLabel;: TBevel;: TBevel;: TStaticText;:
TButton;: TStringGrid;: TEdit;: TButton;: TLabel;: TEdit;: TImage;:
TLabel;Button1Click(Sender: TObject);Button2Click(Sender:
TObject);FormCreate(Sender: TObject);Button3Click(Sender:
TObject);Button4Click(Sender: TObject);
{ Private declarations }
{ Public declarations };=array [1..20,1..20] of
extended;=array [1..20] of extended;=array of Real;=array of Tmass;: TextFile;:
TForm1;,m,n,i,j,p,l: integer;, znak: integer;: Mat;: string;:Mat;,b:Vec;:real;:
string;: Integer;: Real;
begin('Заполните все поля матрицы');
exit;;i:=0 to StringGrid2.RowCount doj:=0 to
StringGrid2.ColCount do begin.Cells[i,j]:=StringGrid1.Cells[i,j];;i:=1 to n
doj:=1 to n+1 do[i,j]:=StrToFloat(StringGrid1.Cells[j-1,i-1]);:=n+1;k:=1 to n
do:=k+1;:=A[k,k];:=k;i:=k1 to n do:=a[i,k];abs(R)>abs(S)then:=R;:=I;;s=0.0
then('Определитель равен нулю!');;;j<>k theni:=k to n1
do:=A[k,i];[k,i]:=A[j,i];[j,i]:=R;;j:=k to n1 do {k}[k,j]:=A[k,j]/S;i:=k1 to n
do:=A[i,k];j:=k to n1 do {k}[i,j]:=A[i,j]-A[k,j]*R;;;s<>0.0 theni:=n
downto 1 do:=a[i,n1];j:=i+1 to n do:=s-a[i,j]*x[j];[i]:=s;;.Text:='';i:=1 to n
do.lines.Add('X['+FloatToStr(i)+']= '+FloatToStr(x[i]));;('Det[A]=0');;;.Visible:=True;;TForm1.FormCreate(Sender:
TObject);.text:='';;TForm1.Button3Click(Sender: TObject);Per(k,n:integer;var
a:Tmatrix; var p:integer);z:Real;j,i:integer;:=abs(a[k,k]);i:=k;p:=0;j:=k+1 to
n-1 doabs(a[j,k])>z then:=abs(a[j,k]);i:=j;:=p+1;;;i>k thenj:=k to n-1
do:=a[i,j];[i,j]:=a[k,j];[k,j]:=z;;;Znak(p:integer):integer;p mod 2=0 then:=1
else result:=-1;;Opr(n:integer;var a:tmatrix;var
det:real);k,i,j,p:integer;r:real;:=1.0;k:=0 to n-1 doa[k,k]=0 then
Per(k,n,a,p);:=znak(p)*det*a[k,k];j:=k+1 to n-1 do:=a[j,k]/a[k,k];i:=k to n-1
do[j,i]:=a[j,i]-r*a[k,i];;;;k,j,i:integer;:Tmatrix;:real;:=strtoint(edit1.Text);(a,n,n);k:=0
to n-1 doj:=0 to n-1
do[k,j]:=strtofloat(StringGrid2.Cells[j,k]);(n,a,det);.Text:=FloatToStrF(det,ffFixed,5,0);;TForm1.Button4Click(Sender:
TObject);lol: Integer;:=StrToInt(Edit3.Text);;p:= 0 to StringGrid1.RowCount
dol:= 0 to StringGrid1.ColCount do:=Random(2);znak=1 then znak:=-1 else
znak:=1;:=Random(100);:=IntToStr(tempint);:=StrToFloat(tempstr);.Cells[p,l]:=FloatToStr(znak*(Random(lol+1)+tempfloat*0.01));;;.
3.2 Метод прогонки
В ходе работы программы были подсчитаны корни СЛАУ:
Прогоночные коэффициенты:
3.2.1 Листинг
unit Progonka;, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms,, StdCtrls, Grids, ExtCtrls, jpeg;= class(TForm):
TStringGrid;: TButton;: TEdit;: TButton;: TLabel;: TMemo;: TLabel;: TBevel;:
TPanel;: TLabel;: TLabel;: TEdit;: TButton;: TButton;: TLabel;: TBevel;:
TButton;: TLabel;: TEdit;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;:
TLabel;: TLabel;: TImage;: TLabel;Button1Click(Sender:
TObject);Button2Click(Sender: TObject);Button3Click(Sender:
TObject);Button4Click(Sender: TObject);FormCreate(Sender:
TObject);Button5Click(Sender: TObject);
{ Private declarations }
{ Public declarations };=array [0..100] of extended;=array
[0..100] of extended;,P,x :MasEl;,b,c,d:MasExt;: TextFile;:
TForm1;,j,n,k,raz,p1,l1,znak : integer;: string;:real;: Integer;: String;:
Real;Unit2;
{$R
*.dfm}TForm1.Button1Click(Sender: TObject);:=StrToInt(Edit1.text);i:=1 to n
doj:=1 to n+1 do.Cells[j-1,i-1]:='';.ColCount:=n+1;.RowCount:=n;.Height:=n*26+1;.Width:=(n+1)*66+1;.Visible:=true;.visible:=true;.text:='';.memo1.text:='';.Enabled:=True;;TForm1.Button2Click(Sender:
TObject);,j,n,k,raz : integer;,P,x :MasEl;,b,c,d:MasExt;:string;,R:real;:
boolean;:=StrToInt(Edit1.text);.memo1.lines.Add('P[0]=
1');.memo1.lines.Add('Q[0]= 1');i:=1 to n
do[i]:=StrToFloat(StringGrid1.Cells[i-1,i-1]); //главная диагональi<n then[i]:=StrToFloat(StringGrid1.Cells[i,i-1]); //нижняя диагональ[i+1]:=StrToFloat(StringGrid1.Cells[i-1,i]); //верхняя диагональ;[i]:=StrToFloat(StringGrid1.Cells[n,i-1]) //свободные члены;
//P[i], Q[i] - метод прогонкиi:=1
to n
do[i]:=(-c[i])/(b[i]+a[i]*P[i-1]);[i]:=(d[i]-a[i]*Q[i-1])/(b[i]+a[i]*P[i-1]);.memo1.lines.Add('P['+IntToStr(i)+']=
'+FloatToStr(P[i]));.memo1.lines.Add('Q['+IntToStr(i)+']=
'+FloatToStr(Q[i]));;[n]:=Q[n];i:=(n-1) downto 1 do[i]:=P[i]*x[i+1]+Q[i];i:=1
to n do.lines.Add('X['+FloatToStr(i)+']=
'+FloatToStr(x[i]));.Visible:=true;;.Enabled:=False;.Visible:=True;;TForm1.Button3Click(Sender:
TObject);,j,n,k,raz : integer;,P,x :MasEl;,b,c,d:array[1..100] of integer;
begin
//случайное заполнение
матрицы:=StrToInt(Edit1.text);
Randomize;i:=1 to
n
do[i]:=(Random(2*StrToInt(Edit2.text)+1)-StrToInt(Edit2.text));b[i]<>0;.cells[i-1,i-1]:=FloatToStr(b[i]);i<n
then[i]:=Random(Abs(2*b[i]+1))-Abs(b[i]);.cells[i,i-1]:=FloatToStr(c[i]);c[i]:=0;i>1
then[i]:=Random(2*(Abs(b[i])-Abs(c[i]))+1)-(Abs(b[i])-Abs(c[i]));.cells[i-2,i-1]:=FloatToStr(a[i]);a[i]:=0;[i]:=a[i]+b[i]+c[i];.cells[n,i-1]:=FloatToStr(d[i]);;;TForm1.Button4Click(Sender:
TObject);.Show;;TForm1.FormCreate(Sender:
TObject);.Text:='';;TForm1.Button5Click(Sender: TObject);lol:
integer;:=StrToInt(Edit3.Text);;p1:= 0 to StringGrid1.RowCount dol1:= 0 to
StringGrid1.ColCount do:=Random(2);znak=1 then znak:=-1 else
znak:=1;:=Random(100);:=IntToStr(tempint);:=StrToFloat(tempstr);.Cells[p1,l1]:=FloatToStr(znak*(Random(lol+1)+tempfloat*0.01));
end;;.
3.3 Нелинейное уравнение
3.3.1 Листинг
unit Unit1;, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms,, StdCtrls, ExtCtrls,Math, jpeg;= class(TForm): TLabel;:
TLabel;: TLabel;: TPanel;: TLabel;: TLabel;: TLabel;: TLabel;: TButton;: TEdit;:
TPanel;: TLabel;: TImage;Button1Click(Sender: TObject);
{ Private declarations }
{ Public declarations };: TForm1;
{$R *.dfm}TForm1.Button1Click(Sender:
TObject);x:real;.Caption:='Результат Вычислений:';:=StrToFloat(Edit1.Text);:= x - (
((Cos(x)/sin(x)) - 2*x) / ( (-1*(1/sqr(sin(x))) - 2 )) );.Text:=FloatToStr(x);;
end.
3.4 Метод вращения Якоби
A =
Пошаговое выполнение программы (преобразование матриц):
3.4.1 Листинг
unit Unitmv;, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs,, Grids, jpeg, ExtCtrls, Math;= class(TForm):
TStringGrid;: TButton;: TEdit;: TButton;: TEdit;: TLabel;: TLabel;: TMemo;:
TButton;: TLabel;: TBevel;: TBevel;: TLabel;: TLabel;: TLabel;: TLabel;:
TLabel;: TLabel;: TLabel;: TImage;: TLabel;Button1Click(Sender:
TObject);Button2Click(Sender: TObject);FormCreate(Sender:
TObject);Button3Click(Sender: TObject);
{ Private declarations }
{ Public declarations };:
TForm1;Unit2;:extended;,i,j,i1,j1,l:integer;,pov,new,rez,povtr:array
[1..20,1..20] of extended;
{$R *.DFM}TForm1.Button1Click(Sender: TObject);,j:integer;:=StrToFloat(Edit2.text);:=StrToInt(Edit1.text);.RowCount:=n;
//устанавливаем размерность матрицы.ColCount:=n;matrix doi:=0
to RowCount do //очищаем еёj:=0 to ColCount do[j,
i]:='';.width:=matrix.DefaultColWidth*n+20;.height:=matrix.DefaultRowHeight*n+20;;TForm1.Button2Click(Sender:
TObject);sum,max,x,k:extended;:string;i:=1 to n doj:=1 to n
do[i,j]:=StrToFloat(matrix.Cells[j-1, i-1]);;;:=k+1;:=0;i:=1 to n doj:=1 to n
doi<>j then:=sum+a[i,j]*a[i,j];:=sqrt(sum);:=abs(a[1,2]);:=1;:=2;i:=1 to n
doj:=1 to n do begin[i,j]:=0;(i<>j) and (abs(A[i,j])>max) then
begin:=abs(A[i,j]);//запоминаем индекс максимального элемента
i1:=i;:=j;;;max=0 theni:=1 to n do.Lines.Add('Диагональный эл-т на позиции ['+IntToStr(i)+','+IntToStr(i)+']=
'+FloatToStr(a[i,i]));
break;;
{еси максимальный элемент ноль-значит всё обнулили выход}
//
showmessage(FloatToStr(a[i1,j1]));:=0.5*arctan(2*(a[i1,j1]/(a[i1,i1]-a[j1,j1])));.Lines.Add('tg(2Phi)='+FloatToStr(tan(2*x)));i:=1
to n do[i,i]:=1;[i1,i1]:=cos(x);[j1,j1]:=cos(x);[i1,j1]:=-sin(x);[j1,i1]:=sin(x);
for i:=1 to n doj:=1 to n do povtr[i,j]:=pov[j,i]; //транспонируем. т.к.
определитель равен единице это тоже самое что обратная
for i:=1 to n doj:=1 to n do
begin[i,j]:= 0;l:= 1 to n do //умножаем транспонированную м-цу поворота
на исходную
new[i,j]:= new[i,j] + povtr[i,l]*a[l,j];;i:=1 to n doj:=1 to
n do
rez[i,j]:= 0;l:= 1 to n do //то что получилось умножаем на м-цу поворота
rez[i,j]:= rez[i,j] + new[i,l]*pov[l,j];;i:=1 to n doj:=1 to
n do begin[i,j]:=rez[i,j];;.memo1.Lines.add('Матрица после '+FloatToStr(k)+'-го преобразования');i:=1 to n do:='';j:=1
to n do:=st+FloatToStrF(a[i,j],fffixed,3,2)+'
';.memo1.Lines.add(st);;.memo1.Lines.add('------------------');sum<=e;i:=1
to n do.Lines.Add('Диагональный эл-т на позиции ['+IntToStr(i)+','+IntToStr(i)+']=
'+FloatToStr(rez[i,i]));;TForm1.FormCreate(Sender:
TObject);.text:='';;TForm1.Button3Click(Sender: TObject);.Show;;.
3.5 Интерполяционный многочлен
3.5.1 Интерполяционный многочлен Лагранжа
3.5.1.1 Листинг
// кнопка найти после графикаUnit1;
interface, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms,, StdCtrls, Grids, ExtCtrls, jpeg;= class(TForm): TStringGrid;:
TEdit;: TImage;: TButton;: TButton;: TLabel;: TMemo;: TLabel;: TEdit;:
TButton;: TLabel;: TBevel;: TImage;: TLabel;: TLabel;: TLabel;: TLabel;:
TLabel;: TLabel;: TLabel;: TImage;: TLabel;Button2Click(Sender:
TObject);Button1Click(Sender: TObject);Button3Click(Sender:
TObject);Image1Click(Sender: TObject);FormCreate(Sender: TObject);
{ Private declarations }
{ Public declarations };=array[1..100] of Extended;:
TForm1;,Xmin,Ymax,Ymin:extended;,a,y:Mas;,j,n: integer;,yy:real;,PY:integer;:
Boolean;
{$R *.dfm}TForm1.Button1Click(Sender:
TObject);:=StrToInt(Edit1.text);.ColCount:=n;.Width:=(n)*67;.Visible:=true;;Ln(x:
Extended; a,y:Mas ; {передаём масштаб}var Xmax,Xmin,Ymax,Ymin:extended):Extended;, Mng: extended;
// формула Лагранжа:=0;i:=1 to n do:=1;j:=1 to n doi<>j
then:=((x-a[j])/(a[i]-a[j]))*Mng;;:=Mng*y[i]+Sum;;:=Sum;:=10;:=-10;:=10;:=-10;;TForm1.Button2Click(Sender:
TObject);
{x,yy:real;,PY:integer; }.Picture:=
nil;:=StrToInt(Edit1.text);j:=1 to n do[j]:=StrToFloat(StringGrid1.Cells[j-1,0]);[j]:=StrToFloat(StringGrid1.Cells[j-1,1]);
//оси.Canvas.MoveTo(0,Image1.height
div 2);.Canvas.LineTo(Image1.width,Image1.height div
2);.Canvas.MoveTo(Image1.width div 2,0);.Canvas.LineTo(Image1.width div
2,Image1.height);
// масштаб:=Xmin+0*(Xmax-Xmin)/Image1.Width;:=(Ln(x,a,y,Xmax,Xmin,Ymax,Ymin));.Canvas.MoveTo(0,trunc(Image1.Height-(yy-Ymin)*Image1.height/(Ymax-Ymin)));
//построение граффикаPX:=0 to Image1.Width
do:=Xmin+PX*(Xmax-Xmin)/Image1.Width;:=(Ln(x,a,y,Xmax,Xmin,Ymax,Ymin));:=trunc(Image1.Height-(yy-Ymin)*Image1.height/(Ymax-Ymin));.Canvas.Pen.Color:=clNavy;.Canvas.LineTo(PX,PY);;.Enabled:=False;
//Button2.Enabled:=False;.Enabled:=True;:=True;;TForm1.Button3Click(Sender:
TObject);:=StrToFloat(Edit2.text);:=(Ln(x,a,y,Xmax,Xmin,Ymax,Ymin));.Lines.Add('Значение функции
в точке '+FloatToStr(x)+' =
'+FloatToStr(yy));;TForm1.Image1Click(Sender: TObject);:
TMouse;,py:integer;,xx: Extended;Button2.Enabled=False then Exit;Edit1.Text=''
then:=0:=StrToInt(Edit1.text);koord=False
then:=n+1;.ColCount:=n;.Width:=(n)*67;.Visible:=true;.text:=IntToStr(n);:=10;:=-10;:=10;:=-10;
//захват координат точек в пикселях:=ScreenToClient(MyMouse.CursorPos).x-image1.Left;:=(ScreenToClient(MyMouse.CursorPos).y-image1.top);
{ Memo1.Lines.add(inttostr(px) + 'Х ' + inttostr(py)); }
//перевод координат в декарт:=(Ymax-(py*((Ymax-Ymin)/image1.height)));:=(Xmin+px*(Ymax-Ymin)/image1.width);koord=False
then
begin.Cells[n-1,0]:=FloatToStrF(xx,ffFixed,4,2);.Cells[n-1,1]:=FloatToStrF(yy,ffFixed,4,2);
end;koord=True then begin.Text:=FloatToStrF(xx,ffFixed,4,2);;koord=False
then.Lines.add('x: '+FloatToStrF(xx,ffFixed,4,2)+'
y:'+FloatToStrF(yy,ffFixed,4,2));
//рисуем точки.Canvas.Ellipse(px-2,py-2,px+2,py+2);;TForm1.FormCreate(Sender:
TObject);.Canvas.MoveTo(0,Image1.height div
2);.Canvas.LineTo(Image1.width,Image1.height div 2);.Canvas.MoveTo(Image1.width
div 2,0);.Canvas.LineTo(Image1.width div 2,Image1.height);
koord:=False;;.
3.5.2 Интерполяционный многочлен Ньютона
3.5.2.1 Листинг
unit Unit1;, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms,, StdCtrls, Grids, ExtCtrls, jpeg;= class(TForm): TImage;:
TLabel;: TLabel;: TLabel;: TBevel;: TImage;: TStringGrid;: TEdit;: TButton;:
TButton;: TMemo;: TEdit;: TButton;: TLabel;: TLabel;: TLabel;: TLabel;:
TLabel;: TLabel;: TLabel;: TImage;: TLabel;Button2Click(Sender:
TObject);Button1Click(Sender: TObject);Button3Click(Sender:
TObject);Image1Click(Sender: TObject);FormCreate(Sender: TObject);
{ Private declarations }
{ Public declarations };=array[1..100] of Extended;:
TForm1;,Xmin,Ymax,Ymin,Fx:extended;,a,y:Mas;,j,n,k: integer;,yy:real;: Boolean;
{$R *.dfm}TForm1.Button1Click(Sender:
TObject);:=StrToInt(Edit1.text);.ColCount:=n;.Width:=(n)*67;.Visible:=true;.Enabled:=True;;PH(x:
Extended; a,y:Mas ; var Xmax,Xmin,Ymax,Ymin:extended):Extended;, Mng, Pn,Pr:
extended;:=0;i:=1 to n do:=1;:=0;k:=1 to i doj:=1 to i dok<>j
then:=1/(a[k]-a[j])*Fx;;:=Fx*y[k];:=Sum+Fx;:=1;;:=1;i>1 thenk:=1 to i-1
do:=Pr*(x-a[k]);:=sum*pr;:=Pn+Sum;;:=Pn;:=10;:=-10;:=10;:=-10;;TForm1.Button2Click(Sender:
TObject);x,yy:real;,PY:integer;,Apx,Ypx: Integer;.Picture:=
nil;:=StrToInt(Edit1.text);:=10;:=-10;:=10;:=-10;j:=1 to n
do[j]:=StrToFloat(StringGrid1.Cells[j-1,0]);[j]:=StrToFloat(StringGrid1.Cells[j-1,1]);j:=1
to n
do:=trunc((a[j]-Xmin)*Image1.Width/(Xmax-Xmin));:=trunc(Image1.Height-(y[j]-Ymin)*Image1.height/(Ymax-Ymin));.Canvas.Pixels[Apx,Ypx]:=clBlack;;.Canvas.MoveTo(0,Image1.height
div 2);.Canvas.LineTo(Image1.width,Image1.height div
2);.Canvas.MoveTo(Image1.width div 2,0);.Canvas.LineTo(Image1.width div
2,Image1.height);:=Xmin+0*(Xmax-Xmin)/Image1.Width;:=(PH(x,a,y,Xmax,Xmin,Ymax,Ymin));.Canvas.MoveTo(0,trunc(Image1.Height-(yy-Ymin)*Image1.height/(Ymax-Ymin)));PX:=0
to Image1.Width
do:=Xmin+PX*(Xmax-Xmin)/Image1.Width;:=(PH(x,a,y,Xmax,Xmin,Ymax,Ymin));:=trunc(Image1.Height-(yy-Ymin)*Image1.height/(Ymax-Ymin));.Canvas.Pen.Color:=clGreen;.Canvas.LineTo(PX,PY);;.Enabled:=False;
//button2.Enabled:=False;.Enabled:=True;:=True;;TForm1.Button3Click(Sender:
TObject);:=StrToFloat(Edit2.text);:=(PH(x,a,y,Xmax,Xmin,Ymax,Ymin));.Lines.add('Значение функции
в точке '+FloatToStr(x)+' =
'+FloatToStr(yy));;TForm1.Image1Click(Sender: TObject);:
TMouse;,py:integer;,xx: Extended;Button2.Enabled=False then Exit;Edit1.Text=''
then:=0:=StrToInt(Edit1.text);koord=False
then:=n+1;.ColCount:=n;.Width:=(n)*67;.Visible:=true;.text:=IntToStr(n);:=10;:=-10;:=10;:=-10;:=ScreenToClient(MyMouse.CursorPos).x-image1.left;:=(ScreenToClient(MyMouse.CursorPos).y-image1.top);
{ Memo1.Lines.add(inttostr(px) + 'Х ' + inttostr(py));
}:=(Ymax-(py*((Ymax-Ymin)/image1.height)));:=(Xmin+px*(Ymax-Ymin)/image1.width);koord=False
then begin.Cells[n-1,0]:=FloatToStrF(xx,ffFixed,4,2);.Cells[n-1,1]:=FloatToStrF(yy,ffFixed,4,2);
end;koord=True then Edit2.Text:=FloatToStrF(xx,ffFixed,4,2);koord=False
then.Lines.add('x: '+FloatToStrF(xx,ffFixed,4,2)+'
y:'+FloatToStrF(yy,ffFixed,4,2));.Canvas.Ellipse(px-2,py-2,px+2,py+2);;TForm1.FormCreate(Sender:
TObject);.Canvas.MoveTo(0,Image1.height div
2);.Canvas.LineTo(Image1.width,Image1.height div 2);.Canvas.MoveTo(Image1.width
div 2,0);.Canvas.LineTo(Image1.width div 2,Image1.height);:=False;;.
3.6.1 Листинг
unit Unit1;, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms,, StdCtrls, Grids, ExtCtrls, jpeg;= class(TForm): TStringGrid;:
TEdit;: TImage;: TButton;: TButton;: TMemo;: TLabel;: TLabel;: TEdit;:
TButton;: TPanel;: TPanel;: TLabel;: TLabel;: TLabel;: TBevel;: TImage;:
TLabel;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;: TImage;:
TLabel;Button2Click(Sender: TObject);Button1Click(Sender:
TObject);Button3Click(Sender: TObject);FormCreate(Sender: TObject);
{ Private declarations }
{ Public declarations };=array[0..100] of Extended;:
TForm1;,Xmin,Ymax,Ymin:extended;,j,n,k,raz,nn : integer;,P
:Mas;,a,b,c,d,y,cc,h,aa,bb:Mas;:string;:real;:real;,PY,Lg,Rg:integer;,XXmax,XXmin:
extended;
{$R *.dfm}TForm1.Button1Click(Sender: TObject);:=StrToInt(Edit1.text);.ColCount:=n;.Width:=(n)*67;.Visible:=true;;S(x:
Extended; i:Integer; a,y,xx,c,b,d:Mas ; var
Xmax,Xmin,Ymax,Ymin:extended):Extended;, Mng:
extended;:=0;:=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]);:=Sum;:=10;:=-10;:=10;:=-10;;TForm1.Button2Click(Sender:
TObject);.Text:='';.Visible:=true;.Visible:=true;:=StrToInt(Edit1.text);:=nn-1;j:=0
to n
do[j]:=StrToFloat(StringGrid1.Cells[j,0]);[j]:=StrToFloat(StringGrid1.Cells[j,1]);;i:=1
to n do[i]:=xx[i]-xx[i-1];[1]:=0;[2]:=0;[1]:=0;[1]:=0;i:=2 to n do
begin // Нахождение коэф с[i] методом прогонки
bb[i]:=2*(h[i-1]+h[i]);[i]:=h[i];[i+1]:=h[i];[i]:=3*((y[i]-y[i-1])/h[i]-(y[i-1]-y[i-2])/h[i-1]);
{y[0]}[i]:=(-cc[i])/(bb[i]+aa[i]*P[i-1]);[i]:=(d[i]-aa[i]*Q[i-1])/(bb[i]+aa[i]*P[i-1]);;[n+1]:=0;i:=n
downto 2 do[i]:=P[i]*c[i+1]+Q[i];;[n+1]:=0;i:=1 to n
do[i]:=((y[i]-y[i-1])/h[i]-(1/3)*h[i]*(c[i+1]+2*c[i]));[i]:=(c[i+1]-c[i])/(3*h[i]);[i]:=y[i-1];;i:=1
to n doForm1.Memo1.Lines do('a = '+FloatToStrF(a[i],fffixed,4,2));('b =
'+FloatToStrF(b[i],fffixed,4,2));('c = '+FloatToStrF(c[i],fffixed,4,2));('d =
'+FloatToStrF(d[i],fffixed,4,2));('----------------');;;.Canvas.MoveTo(0,Image1.height
div 2);.Canvas.LineTo(Image1.width,Image1.height div 2);.Canvas.MoveTo(Image1.width
div 2,0);.Canvas.LineTo(Image1.width div 2,Image1.height);i:=1 to n
do:=xx[i];:=xx[i-1];:=XXmin;:=(S(x,i,a,y,xx,c,b,d,Xmax,Xmin,Ymax,Ymin));.Canvas.MoveTo(Trunc((XXmin-Xmin)*(Image1.Width/(Xmax-Xmin))),trunc(Image1.Height-(yy-Ymin)*Image1.height/(Ymax-Ymin)));.Canvas.Pixels[Trunc((XXmin-Xmin)*(Image1.Width/(Xmax-Xmin))),trunc(Image1.Height-(yy-Ymin)*Image1.height/(Ymax-Ymin))]:=clRed;:=trunc((xx[i]-xx[i-1])*(Image1.Width/(Xmax-Xmin)));PX:=0
to Rg do:=XXmin+PX*(Xmax-Xmin)/Image1.Width;:=(S(x,i,a,y,xx,c,b,d,Xmax,Xmin,Ymax,Ymin));:=trunc(Image1.Height-(yy-Ymin)*Image1.height/(Ymax-Ymin));.Canvas.Pen.Color:=clRed;:=trunc((x-Xmin)*(Image1.Width/(Xmax-Xmin)));.Canvas.LineTo(Lg,PY);;;.Visible:=TRUE;;TForm1.Button3Click(Sender:
TObject);:=StrToFloat(Edit2.text);i:=1 to n do(x>=xx[i-1]) and (x<=xx[i])
then:=(S(x,i,a,y,xx,c,b,d,Xmax,Xmin,Ymax,Ymin));.memo1.lines.add('Значение функции в точке
'+FloatToStr(x)+'= '+FloatToStr(yy));;;;TForm1.FormCreate(Sender: TObject);
{
image1.Canvas.MoveTo(0,Image1.height div 2);.Canvas.LineTo(Image1.width,Image1.height
div 2);.Canvas.MoveTo(Image1.width div 2,0);.Canvas.LineTo(Image1.width div
2,Image1.height); }
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;, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs,, StdCtrls, ExtCtrls, jpeg,Math;= class(TForm):
TStringGrid;: TButton;: TImage;: TButton;: TButton;: TButton;: TButton;: TLabel;:
TBevel;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;:
TImage;: TLabel;: TEdit;: TEdit;: TLabel;: TLabel;Button1Click(Sender:
TObject);Button2Click(Sender: TObject);Button3Click(Sender:
TObject);Button4Click(Sender: TObject);Image1MouseDown(Sender: TObject; Button:
TMouseButton;: TShiftState; X, Y: Integer);FormCreate(Sender:
TObject);Button5Click(Sender: TObject);Button6Click(Sender: TObject);
{ Private declarations }f(m:extended; var
Xmax,Xmin,Ymax,Ymin:extended):extended;f2(m:extended; var
Xmax,Xmin,Ymax,Ymin:extended):extended;
{ Public declarations };:
TForm1;kol,i,j,k,l,k1,n1,n,rcnt,check,check2:integer;,fk,t:array [1..50] of
extended;,xsum,a,b,v,w:extended;,Xmin,Ymax,Ymin,summa,summa2:extended;: array
[1..10,1..11] of extended;,s,xsumkv,xsumkub,xsum4,fksum1, fksum2,
fksum3:extended;
{$R *.DFM}Tform1.f(m:extended; var
Xmax,Xmin,Ymax,Ymin:extended):extended;i:=1 to kol do
begin[i]:=StrToFloat(SG1.Cells[0,i-1]);[i]:=StrToFloat(SG1.Cells[1,i-1]);;:=0;:=0;i:=1
to kol do begin:=fksum+fk[i];:=xsum+x[i];;:=fksum/(kol);:=xsum/(kol);:=0;:=0;:=0;i:=1
to kol do begin:=v+(x[i]-xsum)*(fk[i]-fksum); //верхняя сумма:=w+sqr(x[i]-xsum); //нижняя сумма;:=v/w;:=fksum-b*xsum;:=a+b*m;;Tform1.f2(m:extended;
var Xmax,Xmin,Ymax,Ymin:extended):extended;i:=1 to kol do
begin[i]:=StrToFloat(SG1.Cells[0,i-1]);[i]:=StrToFloat(SG1.Cells[1,i-1]);;
{ФУНКЦИЯ!!!!}:=0;:=0;:=0;:=0;:=0;:=0;:=0;i:=1
to kol do
begin:=xsum+x[i];:=xsumkv+sqr(x[i]);:=xsumkub+sqr(x[i])*x[i];:=xsum4+sqr(sqr(x[i]));:=fksum1+fk[i];:=fksum2+fk[i]*x[i];:=fksum3+fk[i]*sqr(x[i]);;[1,1]:=kol+1;[1,2]:=xsum;[1,3]:=xsumkv;[1,4]:=fksum1;[2,1]:=xsum;[2,2]:=xsumkv;[2,3]:=xsumkub;[2,4]:=fksum2;[3,1]:=xsumkv;[3,2]:=xsumkub;[3,3]:=xsum4;[3,4]:=fksum3;:=3;:=n+1;k:=1
to n do begin k1:=k+1;:=matrix[k,k];j:=k1 to n1 do
matrix[k,j]:=matrix[k,j]/s;i:=k1 to n do begin r:=matrix[i,k];j:=k1 to n1 do
matrix[i,j]:=matrix[i,j]-matrix[k,j]*r;;;i:=n downto 1 do begin
s:=matrix[i,n1];j:=i+1 to n do
s:=s-matrix[i,j]*t[j];[i]:=s;;:=t[1]+t[2]*m+t[3]*sqr(m);;TForm1.Button1Click(Sender:
TObject);.Visible:=true;.Visible:=true;.Visible:=true;.Visible:=true;.rowcount:=kol;SG1
doi:=0 to RowCount do //очищаем еёj:=0 to ColCount do[j,
i]:='';.height:=SG1.DefaultRowHeight*kol+10;;TForm1.Button2Click(Sender:
TObject);x,y:real;,PY:longInt;:Integer;.Canvas.MoveTo(0,Image1.height div
2);.Canvas.LineTo(Image1.width,Image1.height div 2);.Canvas.MoveTo(Image1.width
div 2,0);.Canvas.LineTo(Image1.width div
2,Image1.height);.Canvas.MoveTo(0,Image1.height);PX:=0 to Image1.Width do:=Xmin+PX*(Xmax-Xmin)/Image1.Width;:=F(x,Xmax,Xmin,Ymax,Ymin);o:=0
to SG1.RowCount-1 do begin(round(x)=round(StrToFloat(SG1.Cells[0,o]))) then
begin:=summa2+Power((y-StrToFloat(SG1.Cells[1,o])),2);
// ShowMessage('Сумма квадратов отклонений для полинома 1 '+FloatToStr(summa2));
check2:=check2+1;check2=1 thencheck2=5 then
check2:=0;;;:=round(Image1.Height-(y-Ymin)*Image1.height/(Ymax-Ymin));.Canvas.LineTo(PX,PY);
{image1.Canvas.Pixels[PX,PY]:=clRed; }
//Button2.Enabled:=FALSE;;('Сумма квадратов отклонений для полинома первой степени
'+FloatToStr(summa2));.Text:=FloatToStr(summa2);;TForm1.Button3Click(Sender:
TObject);y:extended;,PY:longInt;.Canvas.MoveTo(0,Image1.height div
2);.Canvas.LineTo(Image1.width,Image1.height div 2);.Canvas.MoveTo(Image1.width
div 2,0);.Canvas.LineTo(Image1.width div
2,Image1.height);.Canvas.MoveTo(0,Image1.height);i:=1 to kol do
begin[i]:=StrToFloat(SG1.Cells[0,i-1]);[i]:=StrToFloat(SG1.Cells[1,i-1]);;i:=1
to kol do begin:=round(Image1.width div
2+x[i]*Image1.width/(Xmax-Xmin));:=round(Image1.height div
2-fk[i]*Image1.width/(Xmax-Xmin));.Canvas.Ellipse(px-5, py-5, px+5,
py+5);;;TForm1.Button4Click(Sender:
TObject);x,y,m,b:real;:string;,PY:longInt;:Integer;
{image1.Canvas.MoveTo(0,Image1.height div
2);.Canvas.LineTo(Image1.width,Image1.height div 2);.Canvas.MoveTo(Image1.width
div 2,0);.Canvas.LineTo(Image1.width div
2,Image1.height);.Canvas.MoveTo(0,Image1.height);}PX:=0 to Image1.Width
do:=Xmin+PX*(Xmax-Xmin)/Image1.Width;:=F2(x,Xmax,Xmin,Ymax,Ymin);o:=0 to
SG1.RowCount-1 do begin(round(x)=round(StrToFloat(SG1.Cells[0,o]))) then
begin:=summa+Power((y-StrToFloat(SG1.Cells[1,o])),2);:=check+1;check=1
thencheck=5 then
check:=0;;;:=round(Image1.Height-(y-Ymin)*Image1.height/(Ymax-Ymin));.Canvas.LineTo(PX,PY);
{image1.Canvas.Pixels[PX,PY]:=clRed; }
//Button4.Enabled:=FALSE;;('Сумма квадратов отклонений для полинома второй степени =
'+FloatToStr(summa));.Text:=FloatToStr(summa);;TForm1.Image1MouseDown(Sender:
TObject; Button: TMouseButton;: TShiftState; X, Y:
Integer);x1,y1:extended;,PY:longInt;.Visible:=True;:=Xmin+x*(Xmax-Xmin)/Image1.Width;
//переводим из пикселей в наши координаты:=(Xmax-Xmin)*(Image1.Height div 2-y)/Image1.Width;rcnt<>0 then
SG1.rowcount:=SG1.rowcount+1;.Cells[0,SG1.rowcount-1]:=FloatToStr(x1);.Cells[1,SG1.rowcount-1]:=FloatToStr(y1);.height:=SG1.DefaultRowHeight*SG1.rowcount+15;:=round(Image1.width
div 2+x1*Image1.width/(Xmax-Xmin));:=round(Image1.height div
2-y1*Image1.width/(Xmax-Xmin));.Canvas.Ellipse(px-5, py-5, px+5,
py+5);:=kol+1;:=1;;TForm1.FormCreate(Sender: TObject);.Canvas.MoveTo(0,Image1.height
div 2);.Canvas.LineTo(Image1.width,Image1.height div
2);.Canvas.MoveTo(Image1.width div 2,0);.Canvas.LineTo(Image1.width div
2,Image1.height);.Canvas.MoveTo(0,Image1.height);
//SG1.Visible:=false;:=0;:=40;:=-40;:=40;:=-40;:=0;:=0;:=0;:=0;:=0;;TForm1.Button5Click(Sender:
TObject);.visible:=true;.visible:=true;.visible:=true;.visible:=true;.Canvas.MoveTo(0,Image1.height
div 2);.Canvas.LineTo(Image1.width,Image1.height div
2);.Canvas.MoveTo(Image1.width div 2,0);.Canvas.LineTo(Image1.width div
2,Image1.height);.Canvas.MoveTo(0,Image1.height);.Visible:=true;:=kol+1;.rowcount:=kol;.height:=SG1.DefaultRowHeight*kol+15;
//Button5.Enabled:=FALSE;;TForm1.Button6Click(Sender:
TObject);.Canvas.FillRect(Rect(0,0,Width,Height));.Canvas.MoveTo(0,Image1.height
div 2);.Canvas.LineTo(Image1.width,Image1.height div
2);.Canvas.MoveTo(Image1.width div 2,0);.Canvas.LineTo(Image1.width div
2,Image1.height);.Canvas.MoveTo(0,Image1.height);;
{procedure TForm1.Button8Click(Sender:
TObject);.Text:=FloatToStr(xsumkv)
end;}.
3.8 Дифференцирование многочленами
3.8.1 Листинг
unit DifNiut;, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms,, StdCtrls, Grids, ExtCtrls, jpeg;= class(TForm):
TStringGrid;: TEdit;: TImage;: TButton;: TButton;: TMemo;: TLabel;: TEdit;:
TButton;: TPanel;: TLabel;: TEdit;: TButton;: TLabel;: TButton;: TLabel;:
TBevel;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;:
TLabel;: TImage;: TLabel;Button2Click(Sender: TObject);Button1Click(Sender:
TObject);Button3Click(Sender: TObject);Button4Click(Sender:
TObject);Image1Click(Sender: TObject);FormCreate(Sender:
TObject);Button5Click(Sender: TObject);
{ Private declarations }
{ Public declarations };=array[1..100] of Extended;:
TForm1;,Xmin,Ymax,Ymin,Fx:extended;,a,y:Mas;,j,n,k,kk: integer;,yy:real;
{$R *.dfm}TForm1.Button1Click(Sender:
TObject);:=StrToInt(Edit1.text);.ColCount:=n;.Width:=(n)*67;.Visible:=true;;PH(x:
Extended; a,y:Mas ; var Xmax,Xmin,Ymax,Ymin:extended):Extended;, Mng, Pn,Pr:
extended;:=0;i:=1 to n do:=1;:=0;k:=1 to i doj:=1 to i dok<>j
then:=1/(a[k]-a[j])*Fx;;:=Fx*y[k];:=Sum+Fx;:=1;;:=1;i>1 thenk:=1 to i-1
do:=Pr*(x-a[k]);:=sum*pr;:=Pn+Sum;;:=Pn;:=10;:=-10;:=10;:=-10;;TForm1.Button2Click(Sender:
TObject);x,yy:real;,PY:integer;,Apx,Ypx:
Integer;:=0;:=StrToInt(Edit1.text);:=10;:=-10;:=10;:=-10;j:=1 to n
do[j]:=StrToFloat(StringGrid1.Cells[j-1,0]);[j]:=StrToFloat(StringGrid1.Cells[j-1,1]);j:=1
to n do:=trunc((a[j]-Xmin)*Image1.Width/(Xmax-Xmin));:=trunc(Image1.Height-(y[j]-Ymin)*Image1.height/(Ymax-Ymin));.Canvas.Pixels[Apx,Ypx]:=clBlack;;.Canvas.MoveTo(0,Image1.height
div 2);.Canvas.LineTo(Image1.width,Image1.height div
2);.Canvas.MoveTo(Image1.width div 2,0);.Canvas.LineTo(Image1.width div
2,Image1.height);:=Xmin+0*(Xmax-Xmin)/Image1.Width;:=(PH(x,a,y,Xmax,Xmin,Ymax,Ymin));.Canvas.MoveTo(0,trunc(Image1.Height-(yy-Ymin)*Image1.height/(Ymax-Ymin)));PX:=0
to Image1.Width do:=Xmin+PX*(Xmax-Xmin)/Image1.Width;:=(PH(x,a,y,Xmax,Xmin,Ymax,Ymin));:=trunc(Image1.Height-(yy-Ymin)*Image1.height/(Ymax-Ymin));.Canvas.Pen.Color:=clRed;.Canvas.LineTo(PX,PY);;;Pr1(x,h:Extended):Extended;:extended;:=(PH(x+h,a,y,Xmax,Xmin,Ymax,Ymin)-PH(x,a,y,Xmax,Xmin,Ymax,Ymin))/h;:=pr;;Pr2(x,h:Extended):Extended;:extended;:=(Pr1(x+h,h)-Pr1(x,h))/h;:=pr;;Pr3(x,h:Extended):Extended;:extended;:=(Pr2(x+h,h)-Pr2(x,h))/h;:=pr;;Pr4(x,h:Extended):Extended;:extended;:=(Pr3(x+h,h)-Pr3(x,h))/h;:=pr;;TForm1.Button3Click(Sender:
TObject);,Py: integer;:=StrToFloat(Edit2.text);:=(PH(x,a,y,Xmax,Xmin,Ymax,Ymin));.Lines.add('Значение функции
в точке '+FloatToStr(x)+' =
'+FloatToStr(yy));:=round(Image1.Width/2+x*Image1.width/(Xmax-Xmin));:=round(Image1.Height/2-yy*Image1.height/(Ymax-Ymin));.Canvas.Ellipse(px-5,
py-5, px+5, py+5);;TForm1.Button4Click(Sender:
TObject);,Sum:Extended;:integer;.text:='';:=0;:=1;i:=n-1 downto 2
do:=k*(i);p:=1 to n do:=1;i:=1 to n doi<>p
then:=Pr/(a[p]-a[i]);;:=Sum+Pr*k*y[p];;.Memo1.Lines.add('Производная 1-ого порядка =
'+FloatToStr(Pr1(StrToFloat(Edit4.text),0.1)));.Memo1.Lines.add('Производная 2-ого порядка =
'+FloatToStr(Pr2(StrToFloat(Edit4.text),0.1)));.Memo1.Lines.add('Производная 3-ого порядка =
'+FloatToStr(Pr3(StrToFloat(Edit4.text),0.1)));.Memo1.Lines.add('Производная 4-ого порядка =
'+FloatToStr(Pr4(StrToFloat(Edit4.text),0.1)));.Memo1.Lines.add('Производная '+FloatToStr(n-1)+' ого порядка Многочлена степени :'+FloatToStr(n-1)+'
='+FloatToStr(sum));;TForm1.Image1Click(Sender: TObject);:
TMouse;,py:integer;,xx: Extended;Edit1.Text=''
then:=0:=StrToInt(Edit1.text);:=n+1;.ColCount:=n;.Width:=(n)*67;.Visible:=true;.text:=IntToStr(n);:=10;:=-10;:=10;:=-10;:=ScreenToClient(MyMouse.CursorPos).x-image1.left;:=(ScreenToClient(MyMouse.CursorPos).y-image1.top);
{ Memo1.Lines.add(inttostr(px) + 'Х ' + inttostr(py));
}:=(Ymax-(py*((Ymax-Ymin)/image1.height)));:=(Xmin+px*(Ymax-Ymin)/image1.width);.Cells[n-1,0]:=FloatToStrF(xx,ffFixed,4,2);.Cells[n-1,1]:=FloatToStrF(yy,ffFixed,4,2);.Lines.add('x:
'+FloatToStrF(xx,ffFixed,4,2)+'
y:'+FloatToStrF(yy,ffFixed,4,2));.Canvas.Ellipse(px-2,py-2,px+2,py+2);;TForm1.FormCreate(Sender:
TObject);.Canvas.MoveTo(0,Image1.height div
2);.Canvas.LineTo(Image1.width,Image1.height div 2);.Canvas.MoveTo(Image1.width
div 2,0);.Canvas.LineTo(Image1.width div
2,Image1.height);.Text:='';;TForm1.Button5Click(Sender: TObject);.text:='';i:=0
to StringGrid1.ColCount-1 do.Cols[i].Clear;.Picture:=
nil;.Width:=StringGrid1.DefaultColWidth;:=0;.Canvas.MoveTo(0,Image1.height div
2);.Canvas.LineTo(Image1.width,Image1.height div 2);.Canvas.MoveTo(Image1.width
div 2,0);.Canvas.LineTo(Image1.width div 2,Image1.height);.Clear;.ColCount:=0;;
end.
3.9 Метод Монте-Карло
3.9.1 Листинг
unit Unit1;, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms,, StdCtrls, jpeg, ExtCtrls;= class(TForm): TEdit;: TEdit;:
TLabel;: TLabel;: TButton;: TEdit;: TLabel;: TEdit;: TEdit;: TLabel;: TLabel;:
TMemo;: TLabel;: TBevel;: TLabel;: TImage;: TLabel;: TLabel;: TLabel;: TLabel;:
TLabel;: TLabel;: TLabel;: TImage;: TLabel;Button1Click(Sender: TObject);
{ Private declarations }
{ Public declarations };: TForm1;
{$R *.dfm}TForm1.Button1Click(Sender: TObject);
var:integer; //Количество попавших точек
N,i:integer;,x,y,alfa,betta,S,a,Sigma,h:extended;:=
StrToFloat(Edit2.text);:= StrToFloat(Edit3.text);:= StrToFloat(Edit4.text);:=
StrToInt(Edit5.text); //Количество точек:= StrToFloat(Edit1.text);:= 1/(sqrt(2*3.14159265)*Sigma);:=
(betta-alfa)*(1/(sqrt(2*3.14159265)*Sigma));:=0; Ver:=0;i:=1 to N do();:=
alfa+(betta-alfa)*Random;:= Random*h;y <=
(1/(sqrt(2*3.14159265)*Sigma))*exp((-1)*((x-a)*(x-a))/(2*Sigma*Sigma))
then:=Pop+1;;Pop <> 0 then:=((Pop/N)*S);.Lines.add(IntToStr(Pop)+' - Кол-во попавших точек '+FloatToStr(Ver)+' - Площадь
под кривой');('Нет попавших точек');
end;.
3.10 Метод Рунге-Кутты
3.10.1 Листинг
unit UnitChInt11;, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms,, StdCtrls, Grids, Math, ExtCtrls, TeeProcs,
TeEngine, Chart,, jpeg;= class(TForm): TStringGrid;: TButton;: TLabel;: TEdit;:
TLabel;: TLabel;: TEdit;: TLabel;: TEdit;: TEdit;: TLabel;: TEdit;: TChart;:
TLineSeries;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;:
TImage;: TLabel;: TBevel;: TStaticText;: TStaticText;: TStaticText;:
TStaticText;: TStaticText;: TBevel;: TImage;Button1Click(Sender: TObject);
{ Private declarations }
{ Public declarations };: TForm1;
{$R *.dfm}f(x,y:double):double;:=x*x -
y*y;;TForm1.Button1Click(Sender: TObject);i: integer;,Xb,Xe,h: double;,Xi:
double;,Ki2,Ki3,Ki4,DeltaYi: double;,Yk:
double;:=StrToFloat(Edit1.Text);:=StrToFloat(Edit4.Text);
Xe:=StrToFloat(Edit3.Text);:=StrToFloat(Edit2.Text);.Cells[0,0]:='i'; SG1.Cells[1,0]:='Xi';
SG1.Cells[2,0]:='Xi+h/2';.Cells[3,0]:='Xi+1';
SG1.Cells[4,0]:='Yi';:=SG1.RowCount-2;.RowCount:=SG1.RowCount+1;:=Xb;
Yi:=Y0;i=0 then begin.Cells[0,i+1]:=IntToStr(i);
SG1.Cells[1,i+1]:=FloatToStr(Xb);.Cells[2,i+1]:=FloatToStr(Xb+h/2); SG1.Cells[3,i+1]:=FloatToStr(Xb+h);.Cells[4,i+1]:=FloatToStr(Y0);.AddXY(Xb,Y0,'',clRed);begin:=StrToFloat(SG1.Cells[1,i])+h;
Yi:=StrToFloat(Edit6.Text);.Cells[0,i+1]:=IntToStr(i);
SG1.Cells[1,i+1]:=FloatToStr(Xi);.Cells[2,i+1]:=FloatToStr(Xi+h/2); SG1.Cells[3,i+1]:=FloatToStr(Xi+h);.Cells[4,i+1]:=FloatToStr(Yi);;:=h*f(Xi,Yi);:=Xi+h/2;
Yk:=Yi+Ki1/2;:=h*f(Xk,Yk);:=Yi+Ki2/2;:=h*f(Xk,Yk);:=Xi+h;
Yk:=Yi+Ki3;:=h*f(Xk,Yk);:=(Ki1+2*Ki2+2*Ki3+Ki4)/6;:=Yi+DeltaYi;.Caption:='Y'+IntToStr(i);
Edit6.Text:=FloatToStr(Yi);.AddXY(Xi,Yi,'',clRed);Xi=Xe then
Button1.Enabled:=false;
end;.
3.11 Краевая задача
.11.1
Листинг
unit UnitKrZ11;, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms,, StdCtrls, Grids, Math, ExtCtrls, TeeProcs,
TeEngine, Chart,, jpeg, Menus;= class(TForm): TStringGrid;: TButton;: TEdit;:
TLabel;: TLabel;: TLabel;: TEdit;: TChart;: TLineSeries;: TEdit;: TEdit;:
TEdit;: TEdit;: TEdit;: TEdit;: TEdit;: TStringGrid;: TButton;: TLabel;:
TLabel;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;: TImage;: TLabel;:
TLabel;: TBevel;: TStaticText;: TStaticText;: TStaticText;: TStaticText;:
TStaticText;: TStaticText;: TStaticText;: TStaticText;: TImage;bt2Click(Sender:
TObject);bt1Click(Sender: TObject);
{ Private declarations }
{ Public declarations };max=50;vector=array[0..max] of
double;,beta1,alfa2,beta2,c1,c2,h,x,y: double;,b,n,i,j:
integer;,Bm,Cm,Dm,Pm,Qm,Xm: vector;: TForm1;
ShowMessage('Выбранный шаг не позволяет поделить заданный отрезок на
четное колличество отрезков!');
h:=(b-a)/trunc((b-a)/h);:=round((b-a)/h);('Шаг изменнен на h = '+FloatToStr(h));;('Колличество отрезков n = '+IntToStr(n));.Text:=FloatToStr(h);.RowCount:=n+1;
sg1.ColCount:=n+3;.RowCount:=n+2;.Cells[0,0]:='X'+IntToStr(0)+'='+IntToStr(a);
sg1.Cells[0,n]:='X'+IntToStr(n)+'='+IntToStr(b);.Cells[1,0]:=FloatToStr(beta1*h-alfa1);.Cells[2,0]:=FloatToStr(alfa1);.Cells[n+2,0]:=FloatToStr(c1*h);.Cells[n,n]:=FloatToStr(-2*alfa2);.Cells[n+1,n]:=FloatToStr(beta2*(h*h)+alfa2);.Cells[n+2,n]:=FloatToStr(c2*(h*h));:=a+h;i:=1
to n-1 do
begin.Cells[0,i]:='X'+IntToStr(i)+'='+FloatToStr(x);.Cells[n+2,i]:=FloatToStr(0);.Cells[i,i]:=FloatToStr(2);.Cells[i+1,i]:=FloatToStr((-4)-(x*h)-(2*h*h));.Cells[i+2,i]:=FloatToStr(2-(x*h));:=x+h;;i:=0
to sg1.ColCount-1 doj:=0 to sg1.RowCount-1 dosg1.Cells[i,j]='' then
sg1.Cells[i,j]:='0';;TForm1.bt2Click(Sender: TObject); //Кнопка Решитьokr:
double;.Visible:=true; ch1.Visible:=true;.Enabled:=false; i:=0 to n do begin //заполняем векторы исходными данными
Dm[i]:=StrToFloat(sg1.Cells[n+2,i]);:=i+1;j=1 then
Am[i]:=0Am[i]:=StrToFloat(sg1.Cells[j-1,i]);[i]:=-(StrToFloat(sg1.Cells[j,i]));j=n+1
then Cm[i]:=0Cm[i]:=StrToFloat(sg1.Cells[j+1,i]);;i:=0 to sg1.RowCount-1
do.Rows[i].Clear;.FixedCols:=0; sg1.FixedRows:=1;
sg1.ColCount:=8;.RowCount:=n+2;.Cells[0,0]:='i'; sg1.Cells[1,0]:='Ai';
sg1.Cells[2,0]:='Bi'; sg1.Cells[3,0]:='i';.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);i:=1 to n
do[i]:=Cm[i]/(Bm[i]-Am[i]*Pm[i-1]);:=Pm[i];[i]:=RoundTo(okr,
-5);[i]:=(Am[i]*Qm[i-1]-Dm[i])/(Bm[i]-Am[i]*Pm[i-1]);:=Qm[i];[i]:=RoundTo(okr,
-5);
end;[n]:=Qm[n];//вычисление корней
for i:=n-1 downto 0
do[i]:=Pm[i]*Xm[i+1]+Qm[i];:=Xm[i];[i]:=RoundTo(okr, -5);;i:=0 to n+1 do //печать таблицы.Cells[0,i+1]:=IntToStr(i);.Cells[1,i+1]:=FloatToStr(Am[i]);.Cells[2,i+1]:=FloatToStr(Bm[i]);.Cells[3,i+1]:=FloatToStr(Cm[i]);.Cells[4,i+1]:=FloatToStr(Dm[i]);.Cells[5,i+1]:=FloatToStr(Pm[i]);.Cells[6,i+1]:=FloatToStr(Qm[i]);.Cells[7,i+1]:=FloatToStr(Xm[i]);;:=a;
Series1.Clear;.Cells[0,0]:='X'; sg2.Cells[1,0]:='Y';i:=0 to n+1 do begin //печать корней.Cells[0,i+1]:=FloatToStr(x);.Cells[1,i+1]:=FloatToStr(Xm[i]);.AddXY(x,Xm[i],'',clRed);:=x+h;;;.
4. Заключение
Поставленные задачи были успешно решены с помощью самостоятельно
разработанного ПО. Конфликтов, сбоев, ошибок и противоречий в работе программ
выявлено не было.