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