Метод частных Рэлея или метод скалярных произведений для нахождения собственных чисел и векторов - 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], которые представляют собой нормированные собственные значения.