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

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

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

Помогите пожалуйста перевести в Pascal, буду очень благодарен
Листинг программы
  1. #include<stdio.h>
  2. #include<math.h>
  3. void Input(int n,int A[][100])
  4. {
  5. int i,j;
  6. for (i=0;i<n;i++)
  7. for (j=0;j<n;j++)
  8. scanf("%d",&A[i][j]);
  9. }
  10. void Matr(int A[][100],int n)
  11. {
  12. float w0[100],w[100],summ=0,w0norm[100],e,d,d0;
  13. int i,j,k;
  14. for (i=0;i<n;i++)
  15. w0[i]=0;
  16. w0[0]=1;
  17. do
  18. {
  19. for (i=0;i<n;i++)
  20. summ=summ+w0[i]*w0[i];
  21. d0=sqrt(summ);
  22. for (i=0;i<n;i++)
  23. w0norm[i]=w0[i]/d0;
  24. for (i=0;i<n;i++)
  25. {
  26. w[i]=0;
  27. for (j=0;j<n;j++)
  28. w[i]=w[i]+A[i][j]*w0norm[j];
  29. }
  30. summ=0;
  31. for (i=0;i<n;i++)
  32. summ=summ+w[i]*w[i];
  33. d=sqrt(summ);
  34. e=fabs(d-d0);
  35. for (i=0;i<n;i++)
  36. w0[i]=w[i];
  37. summ=0;
  38. }
  39. while(e>0.001);
  40. printf("%f\n",d);
  41. for (i=0;i<n;i++)
  42. printf("%f\n",w0norm[i]);
  43. }
  44. void main()
  45. {
  46. int n,A[100][100];
  47. scanf("%d",&n);
  48. Input(n,A);
  49. Matr(A,n);
  50. }

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

textual
Листинг программы
  1. const
  2.   eps=0.001;
  3. type
  4.   TMatr=array [1..100, 1..100] of integer;
  5.  
  6. procedure MRead(n: integer; var A: TMatr);
  7. var
  8.   i, j: integer;
  9. begin
  10.   for i:=1 to n do for j:=1 to n do Read(A[i,j]);
  11. end;
  12.  
  13. procedure Matr(n: integer; var A: TMatr);
  14. var
  15.   w, w0, w0norm: array [1..100] of real;
  16.   summ, e, d, d0: real;
  17.   i, j, k: integer;
  18. begin
  19.   for i:=1 to n do w0[i]:=0;
  20.   w0[1]:=1;
  21.   repeat
  22.     summ:=0;
  23.     for i:=1 to n do summ:=summ+sqr(w0[i]);
  24.     d0:=sqrt(summ);
  25.     for i:=1 to n do w0norm[i]:=w0[i]/d0;
  26.     for i:=1 to n do begin
  27.       w[i]:=0;
  28.       for j:=1 to n do w[i]:=w[i]+A[i,j]*w0norm[j];
  29.     end;
  30.     summ:=0;
  31.     for i:=1 to n do summ:=summ+sqr(w[i]);
  32.     d:=sqrt(summ);
  33.     e:=abs(d-d0);
  34.     for i:=1 to n do w0[i]:=w[i];
  35.   until e<=eps;
  36.   WriteLn(d);
  37.   for i:=1 to n do WriteLn(w0norm[i]);
  38. end;
  39.  
  40. var
  41.   n: integer;
  42.   A: TMatr;
  43. begin
  44.   ReadLn(n);
  45.   MRead(n,A);
  46.   Matr(n,A);
  47. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы