Метод Ньютона для решения систем нелинейных уравнений - 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)); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д