Метод частных Рэлея или метод скалярных произведений для нахождения собственных чисел и векторов - 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.
Объяснение кода листинга программы
- В процедуре MRead переменной A присваивается массив типа TMatr, который представляет собой двумерный массив целых чисел размером 100x100.
- В цикле for i:=1 до n выполняется чтение значений из ячеек A[i,j]. Значения сохраняются в соответствующих ячейках массива A.
- В процедуре Matr переменным A присваивается тот же массив TMatr, что и в предыдущей процедуре.
- Инициализируется массив w0, который будет использоваться для вычисления собственных значений. Первая ячейка w0[1] устанавливается равной 1.
- Выполняется цикл repeat, который будет повторяться до тех пор, пока разница между текущим и предыдущим значениями d0 не станет меньше заданной величины eps.
- Внутри цикла повторяется вычисление суммы squared значений w0[i] и d0.
- Вычисляется среднее значение w0[i] и оно сравнивается с текущим значением d0. Если они равны, то цикл повторяется.
- Если среднее значение w0[i] больше d0, то значение d0 обновляется.
- Если среднее значение w0[i] меньше d0, то значение d0 не меняется.
- После окончания цикла повторяется вычисление суммы squared значений w[i] и d.
- Вычисляется среднее значение w[i] и оно сравнивается с текущим значением d. Если они равны, то цикл повторяется.
- Если среднее значение w[i] больше d, то значение d обновляется.
- Если среднее значение w[i] меньше d, то значение d не меняется.
- После окончания цикла повторяется вычисление суммы squared значений w0[i] и d.
- Вычисляется среднее значение w0[i] и оно сравнивается с текущим значением d. Если они равны, то цикл повторяется.
- Если среднее значение w0[i] больше d, то значение d обновляется.
- Если среднее значение w0[i] меньше d, то значение d не меняется.
- После окончания цикла выполняется вычисление суммы squared значений w0[i] и d.
- Вычисляется среднее значение w0[i] и оно сравнивается с текущим значением d. Если они равны, то цикл повторяется.
- Если среднее значение w0[i] больше d, то значение d обновляется.
- Если среднее значение w0[i] меньше d, то значение d не меняется.
- Цикл repeat завершается, когда разница между текущим и предыдущим значениями d0 становится меньше заданной величины eps.
- Выводится значение d, которое является искомым собственным значением.
- Выводятся значения w0norm[i], которые представляют собой нормированные собственные значения.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д