1 / 1 / 0
Регистрация: 28.10.2017
Сообщений: 30
1

Нужно объединить две программы

22.10.2018, 16:54. Показов 1493. Ответов 2

Студворк — интернет-сервис помощи студентам
у меня снова проблемы, не смогла разобраться. тут помогали с двумя программами: (задание ниже)
1)
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
const n=4; eps=1e-12;
type
  TFloat = Real;
  TVector = array [0..n-1] of TFloat;
  TMatrix = array [0..n-1] of TVector;
 
{ обратная матрица, определитель, решение СЛАУ
   методом элементарных преобразований Гаусса-Жордана }
function mInvGJ(var a: TMatrix; var b: TVector; var det: TFloat): Boolean;
var
  i, j, k: Integer; t: TFloat;
  e: TMatrix; v: TVector;
begin
  mInvGJ:=False; det:=1;
  for i:=0 to n-1 do for j:=0 to n-1 do e[i][j]:=0;
  for i:=0 to n-1 do e[i][i]:=1;
  for k:=0 to n-1 do begin
    j:=k; for i:=k+1 to n-1 do if Abs(a[j][k])<Abs(a[i][k]) then j:=i;
    if j>k then begin
     v:=a[j]; a[j]:=a[k]; a[k]:=v;
     v:=e[j]; e[j]:=e[k]; e[k]:=v;
     t:=b[j]; b[j]:=b[k]; b[k]:=t;
     det:=-det;
    end;
    t:=a[k][k];
    if Abs(t)<eps then begin
      det:=0; Exit;
    end;
    det:=det*t;            b[k]  :=b[k]  /t;
    for j:=n-1 downto 0 do e[k][j]:=e[k][j]/t;
    for j:=n-1 downto k do a[k][j]:=a[k][j]/t;
    for i:=0 to n-1 do if i<>k then begin
      t:=-a[i][k];       b[i]  :=b[i]  +t*b[k];
      for j:=k to n-1 do a[i][j]:=a[i][j]+t*a[k][j];
      for j:=0 to n-1 do e[i][j]:=e[i][j]+t*e[k][j];
    end;
  end;
  a:=e; mInvGJ:=True;
end;
 
procedure GetErr(const a: TMatrix; const b, x: TVector; var r: TVector);
var i, j: Integer; t: TFloat;
begin
  for i:=0 to n-1 do begin
    t:=-b[i]; for j:=0 to n-1 do t:=t+x[j]*a[i][j]; r[i]:=t;
  end;
end;
 
procedure mMul(const a, b: TMatrix; var r: TMatrix);
var i, j, k: Integer; t: TFloat;
begin
  for i:=0 to n-1 do for j:=0 to n-1 do begin
    t:=0; for k:=0 to n-1 do t:=t+a[i][k]*b[k][j]; r[i][j]:=t;
  end;
end;
 
procedure vWrite(const p: String; v: TVector; W, D: Integer);
var j: Integer;
begin
  if p<>'' then WriteLn(p);
  if W<0
  then for j:=0 to n-1 do Write(' ',v[j])
  else if D<0
  then for j:=0 to n-1 do Write(' ',v[j]:W)
  else for j:=0 to n-1 do Write(' ',v[j]:W:D);
  WriteLn;
end;
 
procedure mWrite(const p: String; const a: TMatrix; W, D: Integer);
var i, j: Integer;
begin
  WriteLn(p); for i:=0 to n-1 do vWrite('',a[i],W,D);
end;
 
const
  a: TMatrix = (
    ( 3.25, 1.54, 2.91, 5.43),
    ( 7.13, 8.21, 4.47,-2.11),
    ( 4.52, 6.73, 1.37,-9.89),
    (-6.34,-8.17,-10.2, 3.93));
  b: TVector = (
    4.14, 5.65, 2.92, 3.15);
  WW=10; DD=4;
var
  ai, e: TMatrix;
  x, r: TVector;
  det: TFloat;
begin
  mWrite('A =',a,WW,2);
  ai:=a; x:=b;
  if mInvGJ(ai,x,det) then begin
    GetErr(a,b,x,r);
    mMul(a,ai,e);
    WriteLn('| A | = ',det);
    vWrite('x   =',x,WW,DD);
    vWrite('err =',r,12,4);
    mWrite('A^-1 =',ai,WW,DD);
    mWrite('A * A^-1 = E:',e,6,4);
  end else WriteLn('Error');
end.

Результат работы
Код
A =
       3.25       1.54       2.91       5.43
       7.13       8.21       4.47      -2.11
       4.52       6.73       1.37      -9.89
      -6.34      -8.17     -10.20       3.93
| A | = -419.22633975
x   =
     2.4424    -0.7654    -1.1601     0.1394
err =
       0.0000       0.0000       0.0000       0.0000
A^-1 =
     1.0014    -0.7177     0.7305     0.0693
    -0.9566     0.9130    -0.7072     0.0322
     0.0732    -0.1819     0.0176    -0.1545
    -0.1831     0.2681    -0.2461     0.0322
A * A^-1 = E:
 1.0000 0.0000 0.0000 0.0000
 0.0000 1.0000 0.0000 0.0000
 0.0000 0.0000 1.0000 0.0000
 0.0000 0.0000 0.0000 1.0000
2)
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
const n=4; eps=1e-37;
type
  TMatrix = array [0..n-1,0..n-1] of Real;
  TVector = array [0..n-1] of Real;
  TELine =  array [0..n] of Real;
  TEMatrix = array [0..n-1] of TELine;
 
function Gauss(var a: TEMatrix; var det: Real; var x: TVector): Boolean;
var
  i, j, k: Integer;
  d: Real;
  t: TELine;
begin
  Gauss:=False;
  det:=1;
  for k:=0 to n-1 do begin
    j:=k; for i:=k+1 to n-1 do if Abs(a[j,k])<Abs(a[i,k]) then j:=i;
    if k<>j then begin t:=a[k]; a[k]:=a[j]; a[j]:=t; det:=-det; end;
    for i:=k+1 to n-1 do begin
      d:=a[i,k]/a[k,k];
      for j:=k to n do a[i,j]:=a[i,j]-d*a[k,j];
    end;
  end;
  for k:=0 to n-1 do det:=det*a[k,k];
  if Abs(det)<eps then Exit;
  for k:=n-1 downto 0 do begin
    for j:=k+1 to n-1 do a[k,n]:=a[k,n]-a[k,j]*x[j];
    x[k]:=a[k,n]/a[k,k];
  end;
  Gauss:=True;
end;
 
procedure Nev(const a: TMatrix; const b, x: TVector; var r: TVector);
var i, j: Integer; t: Real;
begin
  for i:=0 to n-1 do begin
    t:=-b[i]; for j:=0 to n-1 do t:=t+x[j]*a[i,j]; r[i]:=t;
  end;
end;
 
const
  b: TVector = (4.14, 5.65, 2.92, 3.15);
  c: TMatrix = (
    ( 3.25, 1.54, 2.91, 5.43),
    ( 7.13, 8.21, 4.47,-2.11), 
    ( 4.52, 6.73, 1.37,-9.89), 
    (-6.34,-8.17,-10.2, 3.93));
var
  a: TEMatrix; x, r: TVector;
  i, j: Integer; det: Real;
begin
  for i:=0 to n-1 do begin { расширенная матрица }
    for j:=0 to n-1 do a[i,j]:=c[i,j]; a[i,n]:=b[i];
  end;
  if Gauss(a,det,x) then begin
    Nev(c,b,x,r);
    for i:=0 to n-1 do begin
      for j:=0 to n do Write(' ',a[i,j]:6:2);
      WriteLn(' | ',x[i]:6:2,' | ',r[i]);
    end;
    WriteLn('Определитель: ',det:6:2);
  end else WriteLn('Бесконечное число решений');
end.
результат
Код
   7.13   8.21   4.47  -2.11  17.41 |   2.44 | 5.55111512312578E-16
   0.00  -2.20   0.87   6.39   1.69 |  -0.77 | 1.66533453693773E-15
   0.00   0.00  -6.57  -0.47   7.62 |  -1.16 | 1.77635683940025E-15
   0.00   0.00   0.00  -4.06  -0.57 |   0.14 | -1.66533453693773E-15
Определитель: -419.23
вот в чем вопрос: задание-с помощью прямого и обратного хода (Гаусс) ПО СТОЛБЦУ найти решение слау,вектор невязки,определитель, обратную матрицу и проверку обратной матрицы.
мне нужно вывести сначала матрицу по столбцу как в результате второй программы, потом уже решение определитель и т.д. как в первой. Пыталась как то сделать это, не получается вторую неделю
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.10.2018, 16:54
Ответы с готовыми решениями:

Шифрование/дешифрование, объединить две программы
нужно обьединеть две программы чтобы они работали вместе вот код:1 программа- program Kriptograf;...

Нужно прокоментировать две программы
Прокоментируйте пожалуйста если можете программы...Просто надо сделать по такому же принципу...

нужно составить две программы
1. Составить программу для вычисления высоты треугольника, проведенной из вершины B, по формуле:...

Две программы на for/while
Не могу решить две задачи: 1)В деревне Интернетовка все дома расположены вдоль одной улицы по...

2
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7655 / 4494 / 2811
Регистрация: 22.11.2013
Сообщений: 12,842
Записей в блоге: 1
23.10.2018, 09:58 2
Лучший ответ Сообщение было отмечено ZX Spectrum-128 как решение

Решение

Начало там:
Решение СЛУ с выбором главного элемента по столбцу (Python -> Pascal)

Там же было предложено разделить полный проход Гаусса-Жордана на нижний треугольник, верхний треугольник, диагональ, если это зачем-то было нужно.
1
1 / 1 / 0
Регистрация: 28.10.2017
Сообщений: 30
23.10.2018, 16:32  [ТС] 3
это да, все понятно, но нужно тогда еще вывести матрицу по столбцу, т.е.первый элемент 7,.. должен же быть..как во второй программе, а в первом выводится данная матрица
0
23.10.2018, 16:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.10.2018, 16:32
Помогаю со студенческими работами здесь

Объединить две программы в одну
В комментарии я кину обе программы. Знаю, просьба выглядит глупо, но это реально сложно. В первой...

Объединить две программы в одну
Есть два кода программ, которые необходимо объединить в один. В принципе у меня получилось, но...

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

Объединить две упорядоченные последовательности в одну,используя представление последовательности чисел в виде списка
помогите написать программу на паскале абс.Используя представление последовательности чисел в виде...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru