Метод Ньютона для решения систем нелинейных уравнений - C#
Формулировка задачи:
Необходимо перевести из паскаля на си шарп! Пожалуйста!
Листинг программы
- const
- n=2;
- eps=1e-4;
- type
- Tmatr=array[1..n,1..n] of real;
- Tvector=array[1..n] of real;
- var
- a: Tmatr;
- x,f,x0:Tvector;
- ITER,i,j: integer;
- max: real;
- {вычисление нормы}
- Function Norma(a: Tmatr; n: integer):real;
- var i,j: integer;
- res: real;
- begin
- res:=0;
- for i:=1 to n do
- for j:=1 to n do
- res:=res+A[i,j]*A[i,j];
- Res:=sqrt(res);
- Norma:=res;
- end;
- {задание функции}
- {x –столбец значений переменных }
- {I номер функции в системе }
- function func(x:Tvector;i:integer):real;
- begin
- case i of
- 1:func:= (sin(x[2])-1.6)/2; {вычисляем значение первой функции }
- 2:func:=0.8-cos((x[1])+0.5); {вычисляем значение второй функции }
- end;
- end;
- {построение матрицы Якоби }
- {x –столбец значений неизвестных }
- {I,j индексы элементов матрицы Якоби }
- {I - номер строки}
- {j – номер столбца}
- function MatrJacobi(x:Tvector;i,j:integer):real;
- begin
- case i of
- 1: case j of
- {вычисляем значение элемента матрицы Якоби индексами 1,1}
- 1: MatrJacobi:=sin(x[1]+0.5);
- {вычисляем значение элемента матрицы Якоби с индексами 1,2 }
- 2: MatrJacobi:= 0 ;
- end;
- 2: case j of
- {вычисляем значение элемента матрицы Якоби с индексами 2,1 }
- 1: MatrJacobi:=0;
- {вычисляем значение элемента матрицы Якоби с индексами 2,2}
- 2: MatrJacobi:=0.5*cos(x[2]);
- end;
- end;
- end;
- {вывод матрицы}
- procedure vivod_matr(mat:Tmatr;N1,N2:integer);
- var i,j: integer;
- begin
- for i:=1 to N do begin
- for j:=1 to N do write(mat[i,j]:n1:N2,' ');
- writeln;
- end;
- end;
- {вывод вектора}
- procedure vivod_vectr(vector:Tvector;N1,N2:integer);
- var j: integer;
- begin
- for j:=1 to N do
- writeln('x',j,'= ',vector[j]:n1:N2);
- end;
- begin
- x0[1]:=0;
- x0[2]:=0;
- iter:=0;
- repeat
- for i:=1 to n do
- for j:=1 to n do
- a[i,j]:= MatrJacobi (x0,i,j);
- vivod_vectr(x0,3,4);
- {вычисление нормы матрицы A}
- writeln('Norma =',Norma(a,N):0:5);
- {подсчет количества итераций}
- writeln('nomer iterazii - ',iter);
- writeln('=================');
- {нахождение нового приближения функции}
- for i:=1 to n do X[i]:=func(x0,i);
- max:=abs(X[1]-X0[1]);
- for i:=2 to n do if abs(X[I]-X0[I])>max then max:=abs(X[I]-X0[I]);
- X0:=X;
- inc(iter);
- until (max<eps)or(iter>20);end.
Решение задачи: «Метод Ньютона для решения систем нелинейных уравнений»
textual
Листинг программы
- using System;
- namespace ConsoleApplication1
- {
- class Program
- {
- const int N = 2;
- const double eps = 1e-4;
- // вычисление нормы
- static double Norma(double[,] a, int n)
- {
- double res = 0;
- for (int i = 0; i < n; ++i)
- for (int j = 0; j < n; ++j)
- res += a[i, j] * a[i, j];
- return Math.Sqrt(res);
- }
- // задание функции
- // x –столбец значений переменных
- //I номер функции в системе
- static double func(double[] x, int i)
- {
- switch (i)
- {
- case 0:
- return (Math.Sin(x[1]) - 1.6) / 2; // вычисляем значение первой функции
- case 1:
- return 0.8 - Math.Cos((x[0]) + 0.5); // вычисляем значение второй функции
- }
- throw new ArgumentException();
- }
- // построение матрицы Якоби
- //x –столбец значений неизвестных
- // I,j индексы элементов матрицы Якоби
- // I - номер строки
- // j – номер столбца
- static double MatrJacobi(double[] x, int i, int j)
- {
- switch (i)
- {
- case 0:
- switch (j)
- {
- // { вычисляем значение элемента матрицы Якоби индексами 1,1}
- case 0:
- return Math.Sin(x[0] + 0.5);
- // {вычисляем значение элемента матрицы Якоби с индексами 1,2 }
- case 1:
- return 0;
- }
- break;
- case 1:
- switch (j)
- {
- // { вычисляем значение элемента матрицы Якоби с индексами 2,1 }
- case 0:
- return 0;
- // {вычисляем значение элемента матрицы Якоби с индексами 1,2 }
- case 1:
- return 0.5 * Math.Cos(x[1]);
- }
- break;
- }
- throw new ArgumentException();
- }
- // вывод матрицы
- static void vivod_matr(double[,] mat, int N1, int N2)
- {
- for (int i = 0; i < N; ++i)
- {
- for (int j = 0; j < N; ++j)
- {
- Console.WriteLine(mat[i, j]);
- }
- Console.WriteLine();
- }
- }
- //вывод вектора
- static void vivod_vectr(double[] vector, int N1, int N2)
- {
- for (int j = 0; j < N; ++j)
- {
- Console.WriteLine("x" + j + "=" + vector[j]);
- }
- }
- static void Main(string[] args)
- {
- double[,] a = new double[N, N];
- double[] x = new double[N];
- double[] f = new double[N];
- double[] x0 = new double[N];
- int iter;
- double max;
- x0[0] = 0;
- x0[1] = 0;
- iter = 0;
- do
- {
- for (int i = 0; i < N; ++i)
- for (int j = 0; j < N; ++j)
- a[i, j] = MatrJacobi(x0, i, j);
- vivod_vectr(x0, 3, 4);
- // вычисление нормы матрицы A
- Console.WriteLine("Norma = {0}", Norma(a, N));
- // подсчет количества итераций
- Console.WriteLine("nomer iterazii - {0}", iter);
- Console.WriteLine("=================");
- // нахождение нового приближения функции
- for (int i = 0; i < N; ++i)
- x[i] = func(x0, i);
- max = Math.Abs(x[0] - x0[0]);
- for (int i = 1; i < N; ++i)
- if (Math.Abs(x[i] - x0[i]) > max)
- max = Math.Abs(x[i] - x0[i]);
- x0 = (double[])x.Clone();
- iter++;
- }
- while ((max > eps) && (iter < 20));
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д