Метод Ньютона для решения систем нелинейных уравнений - 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));
        }
    }
}

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


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

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

11   голосов , оценка 3.909 из 5
Похожие ответы