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