Проверить корректность перевода кода с Pascal - C#
Формулировка задачи:
Здравствуйте, помогите проверить, правильно ли перевел код, результаты почему-то разные
код на паскале
Код на С#
uses crt;
type vektor=array[1..2]of real;
var x1:vektor;k,q:integer; eps,beta,c:real;
procedure v(var a:vektor; b:vektor);
begin
a[1]:=b[1];
a[2]:=b[2];
end;
function max(x1,x2:real):real;
begin
if x1>x2 then
max:=x1
else
max:=x2;
end;
function funct1(c:real;x:vektor):real;
var fi,g1,g2,g3,g4:real;
begin
fi:=0;
g1:=2*x[1]-x[2]-2;
fi:=fi+max(0,g1);
g2:=-x[1];
fi:=fi+max(0,g2);
g3:=-x[2];
fi:=fi+max(0,g3);
funct1:=sqr(fi)*c/2;
end;
function funct2(c:real;x:vektor):real;
var fi,g1,g2,g3,g4:real;
begin
fi:=0;
g1:=2*x[1]-x[2]-2;
fi:=fi+max(0,g1);
g2:=-x[1];
fi:=fi+max(0,g2);
g3:=-x[2];
fi:=fi+max(0,g3);
fi:=sqr(fi)*c/2;
funct2:=fi+sqr(x[1]+4)+sqr(x[2]-4);
end;
procedure minimization(c:real;var x1:vektor);
var x,y,g:vektor;
e:array[1..2,1..2]of integer; alf,l,eps:real; k,q,j:integer;
begin
eps:=0.01;
l:=0.001;
alf:=0.01;
e[1,1]:=1;e[1,2]:=0;e[2,1]:=0;e[2,2]:=1;
v(y,x1);
k:=1;
q:=0;
repeat
for j:=1 to 2 do
begin
g[1]:=y[1]+e[j,1]*l;
g[2]:=y[2]+e[j,2]*l;
if funct2(c,g)<funct2(c,y) then
v(y,g)
else
begin
g[1]:=y[1]-e[j,1]*l;
g[2]:=y[2]-e[j,2]*l;
if funct2(c,g)<funct2(c,y) then
v(y,g);
end;
end;
if funct2(c,y)<funct2(c,x1) then
begin
v(x,x1);
v(x1,y);
y[1]:=x1[1]+alf*(x1[1]-x[1]);
y[2]:=x1[2]+alf*(x1[2]-x[2]);
end
else
begin
if l<=eps then
q:=1
else
l:=l/2;
end;
k:=k+1;
until q=1;
end;
begin
write('eps=');
read(eps);
write('x[1]=');
read(x1[1]);
write('x[2]=');
read(x1[2]);
write('beta=');
read(beta);
write('C=');
read(c);
k:=1;
q:=0;
repeat
minimization(c,x1);
if funct1(c,x1)<eps then
q:=1
else
begin
c:=c*beta;
k:=k+1;
end;
until q=1;
writeln(x1[1],' ',x1[2]);
end.using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace metod_strafov
{
class Program
{
static float eps = 0;
static float[] xy = new float[2];
static float c = 0;
static float beta = 0;
static void Main(string[] args)
{
Console.WriteLine("Укажите точность: ");
eps = (float)Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Укажите координату x точки: ");
xy[0] = (float)Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Укажите координату y точки: ");
xy[1] = (float)Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Укажите начальное значение параметра штрафа: ");
beta = (float)Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Укажите значение увеличения параметра: ");
c = (float)Convert.ToDouble(Console.ReadLine());
int q = 0;
int k = 1;
do
{
minimization(c);
if (f1(c, xy) < eps)
q = 1;
else
{
c = c * beta;
k++;
}
}
while (q != 1);
Console.WriteLine("Результат: " + xy[0].ToString() + ' ' + xy[1].ToString());
//Console.WriteLine(" " + k);
Console.Read();
}
static float f1(float c, float[] x)
{
float fi = 0;
float g1 = 0;
float g2 = 0;
float g3 = 0;
g1 = 2 * x[0] - x[1] - 2;
fi += Math.Max(0, g1);
g2 = -x[0];
fi += Math.Max(0, g2);
g3 = -x[1];
fi += Math.Max(0, g3);
return (fi * fi * c / 2);
}
static float f2(float c, float[] x)
{
float fi = 0;
float g1 = 0;
float g2 = 0;
float g3 = 0;
g1 = 2 * x[0] - x[1] - 2;
fi += Math.Max(0, g1);
g2 = -x[0];
fi += Math.Max(0, g2);
g3 = -x[1];
fi += Math.Max(0, g3);
fi = fi * fi * c / 2;
return (float)(fi + Math.Pow(x[0] + 4, 2) + Math.Pow(x[1] - 4, 2));
}
static void minimization(float c)
{
float[] x = new float[2];
//float[] x1 = new float[2];
float[] y = xy;
float[] g = new float[2];
int[,] e = new int[2, 2] { { 1, 0 }, { 0, 1 } };
float alf = 0.01f;
//float l = 0.001f;
float l = 2;
float eps = 0.01f;
int k = 1;
int q = 0;
do
{
for (int j = 0; j < 1; j++)
{
g[0] = y[0] + e[j, 0] * l;
g[1] = y[1] + e[j, 1] * l;
if (f2(c, g) < f2(c, y))
{
//y = g;
y[0] = g[0];
y[1] = g[1];
}
else
{
g[0] = y[0] - e[j, 0] * l;
g[1] = y[1] - e[j, 1] * l;
if (f2(c, g) < f2(c, y))
{
//y = g;
y[0] = g[0];
y[1] = g[1];
}
}
}
if (f2(c, y) < f2(c, xy))
{
//x = x1;
//x1 = y;
x[0] = xy[0];
x[1] = xy[1];
xy[0] = y[0];
xy[1] = y[1];
y[0] = xy[0] + alf * (xy[0] - x[0]);
y[1] = xy[1] + alf * (xy[1] - x[1]);
}
else
{
if (l <= eps)
q = 1;
else
l = l / 2;
}
k++;
}
while (q != 1);
}
}
}Решение задачи: «Проверить корректность перевода кода с Pascal»
textual
Листинг программы
float[] y = new float[2]; y[0] = xy[0]; y[1] = xy[1];