
- •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.1.1 Листинг
- •3.5.2 Интерполяционный многочлен Ньютона
- •3.5.2.1 Листинг
- •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. Заключение
МОСКОВСКИЙ АВИАЦИОННЫЙ ИНСТИТУТ
(национальный исследовательский университет)
Факультет №8 «Прикладная математика и физика»
Кафедра 806 «Вычислительная математика и программирование»
ОТЧЕТ
по
расчетно-графической работе
по дисциплине
«Вычислительная математика»
Выполнил:
Студент группы 03-325
Игнатенко А.В.
Преподаватель:
Кринецкий О.Е.
Москва 2012
ОГЛАВЛЕНИЕ
1. Постановка задачи 3
2. Формулировка заданий РГР 3
3. Выполнение расчетно-графической работы 4
3.1 Метод Гаусса 4
3.1.1 Листинг 5
3.2 Метод прогонки 7
3.2.1 Листинг 8
3.3 Нелинейное уравнение 10
3.3.1 Листинг 11
3.4 Метод вращения Якоби 11
3.4.1 Листинг 12
3.5. Интерполяционный многочлен 25
3.5.1 Интерполяционный многочлен Лагранжа 25
3.5.2 Интерполяционный многочлен Ньютона 28
3.6 Интерполяция сплайнами 31
3.6.1 Листинг 31
3.7 Метод наименьших квадратов 33
3.7.1 Листинг 34
3.8 Дифференцирование многочленами 37
3.8.1 Листинг 38
3.9 Метод Монте-Карло 41
3.9.1 Листинг 41
3.10 Метод Рунге-Кутты 43
3.10.1 Листинг 43
3.11 Краевая задача 44
3.11.1 Листинг 45
4. Заключение 90
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)
10) Методом Рунге-Кутты с шагом h=0,1 и ε=0,01 решить задачу Коши.
11) Методом прогонки с шагом 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.