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