Вычислит.мат_лаб.р
..pdfЛабораторная работа № 4 Решение нелинейных уравнений и систем нелинейных уравнений
Метод простых итераций Порядок выполнения лабораторной работы:
1.Найти нулевое приближение решения;
2.Преобразовать систему f(x) = 0 к виду х = Ф(х);
3.Проверить условие сходимости метода. Схема алгоритма приведена на рисунке 20.
Пример. Решить методом простых итераций систему
ln( y / z) |
1 x |
0 |
10z 2 10y |
20x 2 |
4 0 |
xy 20z 40 0
В качестве нулевого приближения выберем точку х=1, у = 2.2, z = 2. Преобразуем систему к виду
x |
ln( y / z) |
1 |
|
y |
0,4 |
z 2 |
2x 2 |
z |
2 |
0,05xy |
Текст программы: PROCEDURE Iteraz; Var I,J,K,J1 : Integer;
S,U,U1 : Real; X2,X3,Eps : Real;
R |
: tvector; |
Begin |
|
Eps:=0.01; X2:=0.0; K:=1; |
|
Repeat |
|
For J:=1 To Nn Do Begin |
|
S:=0.0; |
|
For I:=1 To Nn Do Begin S:=S+Aa[i,j]*Xx[i]; End; |
|
R[j]:=S; |
End; |
For J1:=1 To Nn Do Begin Xx[j1]:=R[j1]; End; X3:=Xx[1]; For I:=1 To Nn Do Begin If (Xx[i]>=X3) Then X3:=Xx[i]; Еnd; For I:=1 To Nn Do Begin Xx[i]:=Xx[i]/X3; End;
X1:=X3; U:=Abs(X2-X1); U1:=U/Abs(X1); If (U1>=Eps) Then X2:=X1;
K:=K+1;
Until ((K>=50)or(U1<=1e-4)) End;
Вычисления по программе привели к следующим результатам:
X(1)= 1.1132 Х(2)= 2.3718 Х(3)= 2.1365
31
Количество итераций:5
procedure Iteraz
eps=0.01
x2=0.0
k=1
K
J
I>Nn
S=0.0
I
I>Nn
S=S+aa[i,j]*Xx[i]
I=I+1
I
R[j]=s
J=J+1
J
J1
I>Nn
Xx[j1]=R[j1]
J1=J1+1
J1
x3=Xx[1]
I
I>Nn
Xx[i]>x3
I=I+1
I
A
I
I>Nn
Xx[i]=XX[i]/3
I=I+1
I
X1=X3
U=Abs(x2-X1)
U1=U/abs(X1)
U1>=eps
X2=X1
K=K+1
K>=50 orU1<=1e-4
K
Возврат
X3=Xx[i]
A
Рисунок 20 - Схема алгоритма метода простых итераций
32
Метод Ньютона
Программу можно использовать для решения систем не выше десятого порядка.
Входные параметры: n — число уравнений системы (совпадает с числом неизвестных), n 10; х—массив из n действительных чисел, содержащий начальное приближение решения; f— имя внешней процедуры f(n, х, у), вычисляющей по заданным значениям х, расположенным в элементах массива х, текущие значения функции f и размещающей их в элементах массива у; g — имя внешней процедуры g(n, x, d), вычисляющей
по заданным значениям х из массива х элементы матрицы |
f |
,которая |
|
x |
|||
|
|
размещается в массиве d размерности n x n; eps — значение условия окончания итерационного процесса.
Выходные параметры: х — массив из n действительных чисел (он же входной) содержит при выходе из подпрограммы приближенное значение решения; k—количество итераций.
Порядок выполнения лабораторной работы: |
|
|
|
1. |
Определить из геометрических соображений начальное при- |
||
ближение решения. |
|
|
|
2. |
Составить подпрограммы f и g для вычисления значений f и |
f |
. |
|
|||
|
|
x |
3.Составить головную программу, содержащую описание массива х, имен f и g, присвоение фактических значений параметрам n, х, eps, обращение к ТNUTON и печать результатов.
4.Провести вычисления на ЭВМ.
Схема алгоритма приведена на рисунке 21. Пример. Решить систему уравнений
ln( y / z) |
1 |
x |
0 |
10z 2 10y |
20x 2 |
4 0 |
|
xy 20z 40 0 |
|||
Текст программы: |
|||
procedure TNuton; |
|
|
|
var a: T2DArray; |
i, j: byte; finish: boolean; |
||
begin |
|
|
|
IterCount:= 0; |
|
|
|
SetLength(a, UrCount);
for i:= 0 to High(a) do SetLength(a[i], UrCount + 1); repeat { Заполнение матрицы частных производных }
33
for i:= 0 to High(a) do begin
for j:= 0 to High(a[i])-1 do a[i, j]:= DerivativeFn(i, j, Results); a[i, High(a[i])]:= -Poliz.ExternFn(i, Results);
end; { Решение полученной СЛАУ методом Гаусса }
SetLength(Gauss.Base, Length(a)); for i:= 0 to High(a) do begin
SetLength(Gauss.Base[i], Length(a[i])); for j:= 0 to High(a[i]) do
Gauss.Base[i, j]:= a[i, j]; end; try Gauss.Solve;
except
raise Exception.Create('Данную систему этим методом решить невозможно!'); end; { Получение очередного приближения решения СНАУ }
finish:= false;
for i:= 0 to High(Results) do begin Results[i]:= Results[i] + Gauss.Results[i];
if not finish then finish:= (Abs(Gauss.Results[i]/Results[i]) > Eps); end; inc(IterCount);
until not finish; end;
В результате вычисления по программе получены следующие результаты:
X(1)= 1.1132 Х(2)= 2.3718 Х(3)= 2.1365
Количество итераций:4
34
TNuton.Solve
Itercount=0
SetLength(a,Urcou
nt)
I
I>high(a)
SetLength(a,Urcou
nt+1)
I=I+1
I
Z
I
I>high(a)
J
I>high(a[i])-1
a[i,j]=derivativeFn(i,jres
ults)
J=J+1
J
a[i,high(a[i])]=-poliz.exte rnfn(i,results)
I=I+1
I
SetLength(Gausse
.Base[i],Length
(a[i]))
I
I>high(a)
h=h/k
SetLength(Gausse
.Base[i],Length
(a[i]))
J
I>high(a[i])
Gauss.Base[i,j]=a[i,j]
J=J+1
J
I=I+1
I
try gauss.Solve
finish=false
I
I>high(Results)
Results[i]=results[i]+ga
uss.Results[i]
not finish
finish=(Abs(Gauss.resul
ts[i]/results[i])>Extract
I=I+1
I
inc(itercount)
not finish Z
Возврат
Рисунок 21 - Схема алгоритма метода Ньютона
35
Варианты заданий
Таблица 4
|
sin(x l) - y 1,2 |
|
sin(x 0,5) - y l |
||||
1 |
2x |
cosy |
2. |
16 |
cos(y- 2) x 0 |
||
|
|
|
|
|
|
||
|
sin x |
2y |
2 |
|
sin x (x1) 1,3- y |
||
2 |
cos(y- l) x 0,7 |
17 |
x sin |
y |
|||
|
|
|
|
|
|||
3 |
cos(x 0,5) - y |
2 |
18 |
sin(y+l)-x=l,2 |
|||
Sin y2x |
1 |
|
2y+cos x = 2. |
||||
|
|
|
|||||
|
|
|
|
|
|||
|
sin у+2х=2 |
|
|
sin(y+0,5)-x=l |
|||
4 |
cos(x-1)+y = 0,7 |
19 |
cos(x-2)+y =0 |
||||
|
|
|
|
||||
5 |
sin(y-l)+x=l,3 |
20 |
cos(y+0,5)-x = 2 |
||||
y-sin(x+l)=0,8 |
sin x —2y= 1 |
||||||
|
|
||||||
|
|
|
|
|
|||
6 |
sin(x+l)-y=l |
|
21 |
Sin x+2y= 1,6 |
|||
2x+cos y = 2 |
cos(y-1)+x=l |
||||||
|
|
||||||
|
|
|
|
||||
7 |
sin(x+0,5)-y=1,2 |
22 |
Cos(x-l)+y = 0,5 |
||||
cos(y-2)+x = 0 |
x –cos y = 3 |
||||||
|
|
||||||
|
|
|
|
|
|||
8 |
cos x+y= 1,5 |
|
23 |
Cos (x+0,5)+у = 0,8 |
|||
2x-sin(y-0,5)=l |
sin y — 2x=l,6 |
||||||
|
|
||||||
|
|
|
|
|
|||
9 |
2y-cos(x+l)=0 |
24 |
Sin(x |
2) - y l,5 |
|||
x+sin y= -0,4 |
|
x cos(y- 2) 0,5 |
|||||
|
|
|
|||||
|
|
|
|
||||
|
cos(y-l)+x=0,5 |
|
cos y+x=l,5 |
||||
10 |
y-cos x = 3 |
|
25 |
2y-sin(x-0,5)=l |
|||
|
|
|
|
||||
|
cos(y+0,5) + x=0,8 |
|
2x-cos(y+l) = 0 |
||||
11 |
sin x-2y=l,6 |
|
26 |
y+sin x= -0,4 |
|||
|
|
|
|
||||
|
sin(y + 2)-x=l,5 |
|
cos(x-l)+y=0,8 |
||||
12 |
y+cos(x-2)=0,5. |
27 |
x—cos y=2 |
||||
|
|
|
|
||||
|
Cos x+y= 1,2 |
|
cos(x+0,5)+y=l |
||||
13 |
2x-sin(y-0,5) = 2. |
28 |
siny—2x=2 |
||||
|
|
|
|
||||
|
Sin(x-1)+y= 1,5 |
|
sin(у+1)-х=1 |
||||
14 |
х - sin(y+ 1)= 1 |
29 |
2y+cos x = 2 |
||||
|
|
|
|
||||
|
Cos(y-l)+x=0,8 |
|
cos(x-l)+y=l |
||||
15 |
y-cos x=2. |
|
30 |
sin y+2x= 1,6 |
|||
|
|
|
|
|
|
|
36
Лабораторная работа № 5 Решение проблемы собственных значений и собственных векторов Точные методы
Метод Леверрье
Входные параметры: n—целое положительное число, равное порядку n системы;
Выходные параметры: b—массив из n действительных чисел, при выходе из программы содержит решение системы.
Пример. Вычислить собственные значения и собственные вектора матрицы
|2 |
2 |
–2| |
|2 |
5 |
–4| |
|-2 –4 |
5| |
Текст программы:
PROCEDURE Liver (Var VeS:Tvector;Nn:Integer);; Label 35,270,220,100,80,190,500,250,350,120,10; Var
I,J,K,T:Integer; Y,Yy:tvector; {A,Aa:Mas;} S,C,Q,P,H,D,U,M,V,F,W,Yyy,Z,L,R,X,Aaa,B:Real;
Sq,Sq1: Real; F1: TEXT; Begin Assign(F1,'last.out'); Rewrite(F1);
For I:=Nn Downto 1 Do Y[i+1]:=VeS[i]; Y[1]:=1;
K:=1;
35: T:=1; C:=Y[2]/Y[1];
If (Nn=1) Then Begin P:=-C; Q:=0; Goto 270; End;
If (Nn=2) Then Begin
H:=C*C/4-Y[3]/Y[1]; Goto 220;
End;
M:=10;C:=4;D:=8;U:=4;
V:=8;F:=1;W:=2;T:=0;
80: If(M<>10) Then Goto 100; P:=C;M:=0;Q:=D;C:=U;D:=V; U:=P;V:=Q;Yyy:=C;Z:=D;F:=-F;
37
100:M:=M+1;H:=0;Q:=Y[1];P:=Y[2]-C*Q;L:=Q; 120:For J:=3 To Nn Do Begin
R:=P;P:=Y[j]-C*R-D*Q;Q:=R; R:=L;L:=Q-C*R-H*D;H:=R; End;
Q:=Y[Nn+1]-D*Q; S:=L+C*R;
If (T=0) Then Begin X:=D*R;H:=R*X+S*L; If H=0 Then Goto 80; End; C:=C+(P*S-Q*R)/H; D:=D+(P*X+Q*L)/H;
If ((C-Yyy+D-Z)<>0) Then Goto 190;
If (F=-W) Then Begin writeln('Љ®аҐм Ґ ©¤Ґ'); Goto 500;
End;
W:=-F; 190:H:=C*C/4-D;
Sq:=Sqrt((Q-P*C/2)*(Q-P*C/2)+P*P*Abs(H)); If (Sq>0.0000001) Then Goto 80;
T:=0; Y[2]:=Y[2]-C*Y[1];
For J:=3 To Nn-1 Do Begin Y[j]:=Y[j]-C*Y[j-1]-D*Y[j-2];End;
220:P:=-C/2; Q:=Sqrt(Abs(H)); If(h>=0) Then Begin M:=P+Q;P:=P-Q;Q:=0; Goto 250; End; M:=P;
250:write(F1,'p',k,'=',m:9:4,' + i',q:7:4);K:=K+1;{Ves[k-1]:=M;}WriteLn(F1,''); 270:write(F1,'p',k,'=',p:9:4,' + i',-q:7:4);K:=K+1;{Ves[k-1]:=P;}WriteLn(F1,'');
If(t<>0) Then Goto 350; Nn:=Nn-2;
Aaa:=0; Sq1:=Sqrt((S-R*C/2)*(S-R*C/2)+R*R*Abs(H)); If (Sq1<=0.0000001) Then Aaa:=1;
B:=0;
If (Nn>=2) Then B:=1; If((Aaa+B)=2) Then Begin T:=1;
Goto 120; End; Goto 35;350:500: Close(F1);
End;
38
Вычисления по программе привели к следующим результатам:
Собственные числа |
Собственные вектора |
|
|
.10000Е+01 |
-.94281Е+00 |
.23570Е+00 |
-.23570Е+00 |
.10000Е+02 |
-.33333Е+00 |
-.66667Е+00 |
.66667Е+00 |
.10000Е+01 |
.00000Е+00 |
-.70711Е+00 |
-.70711Е+00 |
Варианты заданий для нахождения собственных значений и собственных векторов матрицы приведены в таблице 5.
Метод Фадеева
Входные параметры: n—целое положительное число, равное порядку n системы; а — массив из n х n действительных чисел, содержащий входную матрицу.
Выходные параметры: q—массив из n действительных чисел при выходе из программы содержит решение системы.
Схема алгоритма приведена на рисунке 23.
Пример. Вычислить собственные значения и собственные вектора
матрицы |
|
|
|2 |
2 |
–2| |
|2 |
5 |
–4| |
|-2 –4 |
5| |
Текст программы:
procedure Fadeev(n:integer;a:tmatr;var q:tvector); var Aa,E,B:tmatr;
i,j:integer; begin
for i:=1 to n do
for j:=1 to n do if i<>j then e[i,j]:=0 else e[i,j]:=1; Aa:=a;
q[1]:=spA(n,Aa);
MulChislo(n,q[1],e,b);
MatrVich(n,Aa,b,b); for i:=2 to n do begin
MulMatr(n,a,b,Aa); q[i]:=-spA(n,Aa)/i; MulChislo(n,q[i],e,b); MatrVich(n,Aa,b,b); end;
end;
39
Вычисления по программе привели к следующим результатам:
Собственные числа |
Собственные вектора |
||
.10000Е+01 |
-.94281Е+00 |
.23570Е+00 |
-.23570Е+00 |
.10000Е+02 |
-.33333Е+00 |
-.66667Е+00 |
.66667Е+00 |
.10000Е+01 |
.00000Е+00 |
-.70711Е+00 |
-.70711Е+00 |
40