Метод частных Рэлея или метод скалярных произведений для нахождения собственных чисел и векторов - Pascal

Узнай цену своей работы

Формулировка задачи:

Помогите пожалуйста перевести в Pascal, буду очень благодарен
#include<stdio.h>
#include<math.h>
 
void Input(int n,int A[][100])
{
int i,j;
for (i=0;i<n;i++)
for (j=0;j<n;j++)
scanf("%d",&A[i][j]);
}
 
void Matr(int A[][100],int n)
{
float w0[100],w[100],summ=0,w0norm[100],e,d,d0;
int i,j,k;
for (i=0;i<n;i++)
w0[i]=0;
w0[0]=1;
do
{
for (i=0;i<n;i++)
summ=summ+w0[i]*w0[i];
d0=sqrt(summ);
for (i=0;i<n;i++)
w0norm[i]=w0[i]/d0;
for (i=0;i<n;i++)
    {
    w[i]=0;
    for (j=0;j<n;j++)
    w[i]=w[i]+A[i][j]*w0norm[j];
    }
summ=0;
for (i=0;i<n;i++)
summ=summ+w[i]*w[i];
d=sqrt(summ);
e=fabs(d-d0);
for (i=0;i<n;i++)
w0[i]=w[i];
summ=0;
}
while(e>0.001);
printf("%f\n",d);
for (i=0;i<n;i++)
printf("%f\n",w0norm[i]);
}
 
void main()
{
int n,A[100][100];
scanf("%d",&n);
Input(n,A);
Matr(A,n);
}

Решение задачи: «Метод частных Рэлея или метод скалярных произведений для нахождения собственных чисел и векторов»

textual
Листинг программы
const
  eps=0.001;
type 
  TMatr=array [1..100, 1..100] of integer;
 
procedure MRead(n: integer; var A: TMatr);
var
  i, j: integer;
begin
  for i:=1 to n do for j:=1 to n do Read(A[i,j]);
end;
 
procedure Matr(n: integer; var A: TMatr);
var
  w, w0, w0norm: array [1..100] of real;
  summ, e, d, d0: real;
  i, j, k: integer;
begin
  for i:=1 to n do w0[i]:=0;
  w0[1]:=1;
  repeat
    summ:=0;
    for i:=1 to n do summ:=summ+sqr(w0[i]);
    d0:=sqrt(summ);
    for i:=1 to n do w0norm[i]:=w0[i]/d0;
    for i:=1 to n do begin
      w[i]:=0;
      for j:=1 to n do w[i]:=w[i]+A[i,j]*w0norm[j];
    end;
    summ:=0;
    for i:=1 to n do summ:=summ+sqr(w[i]);
    d:=sqrt(summ);
    e:=abs(d-d0);
    for i:=1 to n do w0[i]:=w[i];
  until e<=eps;
  WriteLn(d);
  for i:=1 to n do WriteLn(w0norm[i]);
end;
 
var
  n: integer;
  A: TMatr;
begin
  ReadLn(n);
  MRead(n,A);
  Matr(n,A);
end.

Объяснение кода листинга программы

  1. В процедуре MRead переменной A присваивается массив типа TMatr, который представляет собой двумерный массив целых чисел размером 100x100.
  2. В цикле for i:=1 до n выполняется чтение значений из ячеек A[i,j]. Значения сохраняются в соответствующих ячейках массива A.
  3. В процедуре Matr переменным A присваивается тот же массив TMatr, что и в предыдущей процедуре.
  4. Инициализируется массив w0, который будет использоваться для вычисления собственных значений. Первая ячейка w0[1] устанавливается равной 1.
  5. Выполняется цикл repeat, который будет повторяться до тех пор, пока разница между текущим и предыдущим значениями d0 не станет меньше заданной величины eps.
  6. Внутри цикла повторяется вычисление суммы squared значений w0[i] и d0.
  7. Вычисляется среднее значение w0[i] и оно сравнивается с текущим значением d0. Если они равны, то цикл повторяется.
  8. Если среднее значение w0[i] больше d0, то значение d0 обновляется.
  9. Если среднее значение w0[i] меньше d0, то значение d0 не меняется.
  10. После окончания цикла повторяется вычисление суммы squared значений w[i] и d.
  11. Вычисляется среднее значение w[i] и оно сравнивается с текущим значением d. Если они равны, то цикл повторяется.
  12. Если среднее значение w[i] больше d, то значение d обновляется.
  13. Если среднее значение w[i] меньше d, то значение d не меняется.
  14. После окончания цикла повторяется вычисление суммы squared значений w0[i] и d.
  15. Вычисляется среднее значение w0[i] и оно сравнивается с текущим значением d. Если они равны, то цикл повторяется.
  16. Если среднее значение w0[i] больше d, то значение d обновляется.
  17. Если среднее значение w0[i] меньше d, то значение d не меняется.
  18. После окончания цикла выполняется вычисление суммы squared значений w0[i] и d.
  19. Вычисляется среднее значение w0[i] и оно сравнивается с текущим значением d. Если они равны, то цикл повторяется.
  20. Если среднее значение w0[i] больше d, то значение d обновляется.
  21. Если среднее значение w0[i] меньше d, то значение d не меняется.
  22. Цикл repeat завершается, когда разница между текущим и предыдущим значениями d0 становится меньше заданной величины eps.
  23. Выводится значение d, которое является искомым собственным значением.
  24. Выводятся значения w0norm[i], которые представляют собой нормированные собственные значения.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.25 из 5
Похожие ответы