Метод Ньютона для решения систем нелинейных уравнений - C#

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

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

Необходимо перевести из паскаля на си шарп! Пожалуйста!
Листинг программы
  1. const
  2. n=2;
  3. eps=1e-4;
  4. type
  5. Tmatr=array[1..n,1..n] of real;
  6. Tvector=array[1..n] of real;
  7. var
  8. a: Tmatr;
  9. x,f,x0:Tvector;
  10. ITER,i,j: integer;
  11. max: real;
  12. {вычисление нормы}
  13. Function Norma(a: Tmatr; n: integer):real;
  14. var i,j: integer;
  15. res: real;
  16. begin
  17. res:=0;
  18. for i:=1 to n do
  19. for j:=1 to n do
  20. res:=res+A[i,j]*A[i,j];
  21. Res:=sqrt(res);
  22. Norma:=res;
  23. end;
  24. {задание функции}
  25. {x –столбец значений переменных }
  26. {I номер функции в системе }
  27. function func(x:Tvector;i:integer):real;
  28. begin
  29. case i of
  30. 1:func:= (sin(x[2])-1.6)/2; {вычисляем значение первой функции }
  31. 2:func:=0.8-cos((x[1])+0.5); {вычисляем значение второй функции }
  32. end;
  33. end;
  34. {построение матрицы Якоби }
  35. {x –столбец значений неизвестных }
  36. {I,j индексы элементов матрицы Якоби }
  37. {I - номер строки}
  38. {j номер столбца}
  39. function MatrJacobi(x:Tvector;i,j:integer):real;
  40. begin
  41. case i of
  42. 1: case j of
  43. {вычисляем значение элемента матрицы Якоби индексами 1,1}
  44. 1: MatrJacobi:=sin(x[1]+0.5);
  45. {вычисляем значение элемента матрицы Якоби с индексами 1,2 }
  46. 2: MatrJacobi:= 0 ;
  47. end;
  48. 2: case j of
  49. {вычисляем значение элемента матрицы Якоби с индексами 2,1 }
  50. 1: MatrJacobi:=0;
  51. {вычисляем значение элемента матрицы Якоби с индексами 2,2}
  52. 2: MatrJacobi:=0.5*cos(x[2]);
  53. end;
  54. end;
  55. end;
  56. {вывод матрицы}
  57. procedure vivod_matr(mat:Tmatr;N1,N2:integer);
  58. var i,j: integer;
  59. begin
  60. for i:=1 to N do begin
  61. for j:=1 to N do write(mat[i,j]:n1:N2,' ');
  62. writeln;
  63. end;
  64. end;
  65. {вывод вектора}
  66. procedure vivod_vectr(vector:Tvector;N1,N2:integer);
  67. var j: integer;
  68. begin
  69. for j:=1 to N do
  70. writeln('x',j,'= ',vector[j]:n1:N2);
  71. end;
  72. begin
  73. x0[1]:=0;
  74. x0[2]:=0;
  75. iter:=0;
  76. repeat
  77. for i:=1 to n do
  78. for j:=1 to n do
  79. a[i,j]:= MatrJacobi (x0,i,j);
  80. vivod_vectr(x0,3,4);
  81. {вычисление нормы матрицы A}
  82. writeln('Norma =',Norma(a,N):0:5);
  83. {подсчет количества итераций}
  84. writeln('nomer iterazii - ',iter);
  85. writeln('=================');
  86. {нахождение нового приближения функции}
  87. for i:=1 to n do X[i]:=func(x0,i);
  88. max:=abs(X[1]-X0[1]);
  89. for i:=2 to n do if abs(X[I]-X0[I])>max then max:=abs(X[I]-X0[I]);
  90. X0:=X;
  91. inc(iter);
  92. until (max<eps)or(iter>20);end.

Решение задачи: «Метод Ньютона для решения систем нелинейных уравнений»

textual
Листинг программы
  1. using System;
  2.  
  3. namespace ConsoleApplication1
  4. {
  5.     class Program
  6.     {
  7.         const int N = 2;
  8.         const double eps = 1e-4;
  9.  
  10.         //  вычисление нормы
  11.         static double Norma(double[,] a, int n)
  12.         {
  13.             double res = 0;
  14.             for (int i = 0; i < n; ++i)
  15.                 for (int j = 0; j < n; ++j)
  16.                     res += a[i, j] * a[i, j];
  17.  
  18.             return Math.Sqrt(res);
  19.         }
  20.  
  21.         // задание функции
  22.         // x –столбец значений переменных
  23.         //I номер функции в системе
  24.         static double func(double[] x, int i)
  25.         {
  26.             switch (i)
  27.             {
  28.                 case 0:
  29.                     return (Math.Sin(x[1]) - 1.6) / 2; // вычисляем значение первой функции
  30.                 case 1:
  31.                     return 0.8 - Math.Cos((x[0]) + 0.5); // вычисляем значение второй функции
  32.             }
  33.  
  34.             throw new ArgumentException();
  35.         }
  36.  
  37.         // построение матрицы Якоби
  38.         //x –столбец значений неизвестных
  39.         // I,j индексы элементов матрицы Якоби
  40.         // I - номер строки
  41.         // j – номер столбца
  42.         static double MatrJacobi(double[] x, int i, int j)
  43.         {
  44.             switch (i)
  45.             {
  46.                 case 0:
  47.                     switch (j)
  48.                     {
  49.                         // { вычисляем значение элемента матрицы Якоби индексами 1,1}
  50.                         case 0:
  51.                             return Math.Sin(x[0] + 0.5);
  52.                         // {вычисляем значение элемента матрицы Якоби с индексами 1,2  }
  53.                         case 1:
  54.                             return 0;
  55.                     }
  56.                     break;
  57.                 case 1:
  58.                     switch (j)
  59.                     {
  60.                         // { вычисляем значение элемента матрицы Якоби с индексами 2,1  }
  61.                         case 0:
  62.                             return 0;
  63.                         // {вычисляем значение элемента матрицы Якоби с индексами 1,2  }
  64.                         case 1:
  65.                             return 0.5 * Math.Cos(x[1]);
  66.                     }
  67.                     break;
  68.             }
  69.  
  70.             throw new ArgumentException();
  71.         }
  72.  
  73.         // вывод матрицы
  74.         static void vivod_matr(double[,] mat, int N1, int N2)
  75.         {
  76.             for (int i = 0; i < N; ++i)
  77.             {
  78.                 for (int j = 0; j < N; ++j)
  79.                 {
  80.                     Console.WriteLine(mat[i, j]);
  81.                 }
  82.                 Console.WriteLine();
  83.             }
  84.  
  85.         }
  86.  
  87.         //вывод вектора
  88.         static void vivod_vectr(double[] vector, int N1, int N2)
  89.         {
  90.             for (int j = 0; j < N; ++j)
  91.             {
  92.                 Console.WriteLine("x" + j + "=" + vector[j]);
  93.             }
  94.         }
  95.  
  96.         static void Main(string[] args)
  97.         {
  98.             double[,] a = new double[N, N];
  99.             double[] x = new double[N];
  100.             double[] f = new double[N];
  101.             double[] x0 = new double[N];
  102.             int iter;
  103.             double max;
  104.  
  105.             x0[0] = 0;
  106.             x0[1] = 0;
  107.             iter = 0;
  108.             do
  109.             {
  110.                 for (int i = 0; i < N; ++i)
  111.                     for (int j = 0; j < N; ++j)
  112.                         a[i, j] = MatrJacobi(x0, i, j);
  113.  
  114.                 vivod_vectr(x0, 3, 4);
  115.                 // вычисление нормы матрицы A
  116.                 Console.WriteLine("Norma = {0}", Norma(a, N));
  117.                 // подсчет количества итераций
  118.                 Console.WriteLine("nomer iterazii - {0}", iter);
  119.                 Console.WriteLine("=================");
  120.                 // нахождение нового приближения функции
  121.                 for (int i = 0; i < N; ++i)
  122.                     x[i] = func(x0, i);
  123.  
  124.                 max = Math.Abs(x[0] - x0[0]);
  125.  
  126.                 for (int i = 1; i < N; ++i)
  127.                     if (Math.Abs(x[i] - x0[i]) > max)
  128.                         max = Math.Abs(x[i] - x0[i]);
  129.  
  130.                 x0 = (double[])x.Clone();
  131.                 iter++;
  132.             }
  133.             while ((max > eps) && (iter < 20));
  134.         }
  135.     }
  136. }

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


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

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

11   голосов , оценка 3.909 из 5

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

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

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