Переписать программу с Pascal на С - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Собственно задача в заголовке темы. Помоги пожалуйста, с паскалем не успеваю разобраться. Для кого то это, возможно, будет тренировкой.
Листинг программы
  1. const
  2. eps = 0.00001; { Точность определения минимума }
  3. alfa = 1.0; { Коэффициент отражения }
  4. beta = 0.5; { Коэффициент сжатия }
  5. gamma = 2.0; { Коэффициент растяжения }
  6. t = 0.2;
  7. n_max = 6; { Макс. количество переменных }
  8. var
  9. x, y: array[0 .. n_max] of double;
  10. fh, fl, f4, f5, f6: double;
  11. h, l, it: integer;
  12.  
  13. { *** Оптимизируемая функция *** }
  14. function f(k: integer): double;
  15. var r1, r2: double;
  16. begin
  17. r1 := y[k]-x[k]*x[k]; r2 := 1-x[k];
  18. f := 100*r1*r1+r2*r2;
  19. end;
  20.  
  21. function maxf: double;
  22. var f1, f2, r: double;
  23. begin
  24. f1 := f(1); f2 := f(2); r := f(0);
  25. h := 0;
  26. if r < f1 then begin
  27. r := f1; h := 1;
  28. end;
  29. if r < f2 then begin
  30. r := f2; h := 2;
  31. end;
  32. maxf := r;
  33. end;
  34. function minf: double;
  35. var f1, f2, r: double;
  36. begin
  37. f1 := f(1); f2 := f(2); r := f(0);
  38. l := 0;
  39. if f1 < r then begin
  40. r := f1; l := 1;
  41. end;
  42. if f2 < r then begin
  43. r := f2; l := 2;
  44. end;
  45. minf := r;
  46. end;
  47.  
  48. label TheEnd;
  49. var
  50. i, flag: integer;
  51. r, r1, x0, y0, x1, y1: double;
  52. begin
  53. x0 := -1.2; y0 := 1;
  54. x[0] := x0-0.5*t; y[0] := y0-t*sqrt(3)/6;
  55. x[1] := x0; y[1] := y0; r := f(1); y[1] := y0+t*sqrt(3)/3;
  56. x[2] := x0+0.5*t; y[2] := y[0];
  57. it := 0;
  58. writeln(' it=', it:5, ' x=', x0:8:4, ' y=', y0:8:4, ' f=', r:8:4);
  59. repeat
  60. fh := maxf; fl := minf;
  61. x[3] := 0.5*(x[0]+x[1]+x[2]-x[h]);
  62. y[3] := 0.5*(y[0]+y[1]+y[2]-y[h]);
  63. x[4] := (1+alfa)*x[3]-alfa*x[h];
  64. y[4] := (1+alfa)*y[3]-alfa*y[h];
  65. f4 := f(4);
  66. if (f4 < fl) then begin
  67. x[5]:=(1-gamma)*x[3]+gamma*x[4];
  68. y[5]:=(1-gamma)*y[3]+gamma*y[4];
  69. f5:=f(5);
  70. if (f5 < fl) then begin x[h]:=x[5]; y[h]:=y[5]; end
  71. else begin x[h]:=x[4]; y[h]:=y[4]; end;
  72. goto TheEnd;
  73. end;
  74. flag := 0;
  75. for i := 0 to pred(3) do begin
  76. if ((i <> h) and (f4 > f(i))) then inc(flag);
  77. end;
  78. if (flag = 2) then begin
  79. x[6]:=beta*x[h]+(1-beta)*x[3]; y[6]:=beta*y[h]+(1-beta)*y[3];
  80. x[h]:=x[6]; y[h]:=y[6];
  81. goto TheEnd;
  82. end;
  83. if (f(4) < fh) then begin
  84. for i := 0 to pred(3) do begin
  85. x[i]:=0.5*(x[i]+x[l]); y[i]:=0.5*(y[i]+y[l]);
  86. end;
  87. end
  88. else begin
  89. x[h]:=x[4]; y[h]:=y[4];
  90. end;
  91. TheEnd:;
  92. r := 0;
  93. for i := 0 to pred(3) do begin
  94. r1 := f(i)-f(3); r := r + r1*r1;
  95. end;
  96. r:=sqrt(r/3);
  97. inc(it);
  98. r1:=(f(0)+f(1)+f(2))/3;
  99. x0:=(x[0]+x[1]+x[2])/3;
  100. y0:=(y[0]+y[1]+y[2])/3;
  101. if it mod 20 = 0 then
  102. writeln(' it=', it:5, ' x=', x0:8:4, ' y=', y0:8:4, ' f=', r:8:4);
  103. until (r < eps);
  104. writeln(' it=', it:5, ' x=', x0:8:4, ' y=', y0:8:4, ' f=', r:8:4);
  105. end.

Решение задачи: «Переписать программу с Pascal на С»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. /*
  5.  * Generated by TPTC - Translate Pascal to C
  6.  *     Version 1.7 03/26/88   (C) 1988 S.H.Smith
  7.  */
  8.  
  9.   #define eps  0.00001    /*  Точность определения минимума  */
  10.   #define alfa 1.0    /*  Коэффициент отражения          */
  11.   #define beta 0.5    /*  Коэффициент сжатия             */
  12.   #define gamma 2.0    /*  Коэффициент растяжения         */
  13.  
  14.   #define t    0.2  
  15.  
  16.   #define n_max 6    /*  Макс. количество переменных  */
  17.  
  18.  
  19.   double       x[n_max+1], y[n_max+1];
  20.  
  21.   double       fh, fl, f4, f5, f6;
  22.   int      h, l, it;
  23.  
  24.  
  25.   /*  *** Оптимизируемая функция ***  */
  26.  
  27. double       f(int      k)
  28. { double       r1, r2;
  29.  
  30.   r1 = y[k] - x[k] * x[k]; r2 = 1 - x[k];
  31.   return 100 * r1 * r1 + r2 * r2;
  32. }
  33.  
  34.  
  35.  
  36. double       maxf(void)
  37. { double       f1, f2, r;
  38.  
  39.   f1 = f(1); f2 = f(2); r = f(0);
  40.   h = 0;
  41.   if (r < f1) {
  42.     r = f1; h = 1;
  43.   }
  44.   if (r < f2) {
  45.     r = f2; h = 2;
  46.   }
  47.   return r;
  48. }
  49.  
  50.  
  51. double       minf(void)
  52. { double       f1, f2, r;
  53.  
  54.   f1 = f(1); f2 = f(2); r = f(0);
  55.   l = 0;
  56.   if (f1 < r) {
  57.     r = f1; l = 1;
  58.   }
  59.   if (f2 < r) {
  60.     r = f2; l = 2;
  61.   }
  62.   return r;
  63. }
  64.  
  65.  
  66.  
  67.  
  68.  
  69. void main(int   argc,
  70.      char  *argv[])
  71. {
  72.   int      i, flag;
  73.   double       r, r1, x0, y0, x1, y1;
  74.     x0 = -1.2; y0 = 1;
  75.     x[0] = x0 - 0.5 * t; y[0] = y0 - t * sqrt(3) / 6;
  76.     x[1] = x0; y[1] = y0; r = f(1); y[1] = y0 + t * sqrt(3) / 3;
  77.     x[2] = x0 + 0.5 * t; y[2] = y[0];
  78.  
  79.     it = 0;
  80.     printf(" it=%5d x=%8.4f y=%8.4f f=%8.4f\n",it,x0,y0,r);
  81.     do {
  82.         fh = maxf(); fl = minf();
  83.         x[3] = 0.5 * (x[0] + x[1] + x[2] - x[h]);
  84.         y[3] = 0.5 * (y[0] + y[1] + y[2] - y[h]);
  85.  
  86.         x[4] = (1 + alfa) * x[3] - alfa * x[h];
  87.         y[4] = (1 + alfa) * y[3] - alfa * y[h];
  88.  
  89.         f4 = f(4);
  90.         if ((f4 < fl)) {
  91.             x[5] = (1 - gamma) * x[3] + gamma * x[4];
  92.             y[5] = (1 - gamma) * y[3] + gamma * y[4];
  93.             f5 = f(5);
  94.             if ((f5 < fl)) { x[h] = x[5]; y[h] = y[5];
  95.             }
  96.             else { x[h] = x[4]; y[h] = y[4];
  97.             }
  98.             goto TheEnd;
  99.         }
  100.  
  101.         flag = 0;
  102.         for (i = 0; i <= 2; i++) {
  103.           if (((i != h) && (f4 > f(i)))) flag++;
  104.         }
  105.         if ((flag == 2)) {
  106.             x[6] = beta * x[h] + (1 - beta) * x[3]; y[6] = beta * y[h] + (1 - beta) * y[3];
  107.             x[h] = x[6]; y[h] = y[6];
  108.  
  109.             goto TheEnd;
  110.         }
  111.  
  112.         if ((f(4) < fh)) {
  113.             for (i = 0; i <= 2; i++) {
  114.               x[i] = 0.5 * (x[i] + x[l]); y[i] = 0.5 * (y[i] + y[l]);
  115.             }
  116.         }
  117.         else {
  118.             x[h] = x[4]; y[h] = y[4];
  119.         }
  120.  
  121.        
  122. TheEnd: r = 0;
  123.         for (i = 0; i <= 2; i++) {
  124.           r1 = f(i) - f(3); r = r + r1 * r1;
  125.         }
  126.         r = sqrt(r / 3);
  127.         it++;
  128.  
  129.         r1 = (f(0) + f(1) + f(2)) / 3;
  130.         x0 = (x[0] + x[1] + x[2]) / 3;
  131.         y0 = (y[0] + y[1] + y[2]) / 3;
  132.  
  133.         if (it % 20 == 0)
  134.           printf(" it=%5d x=%8.4f y=%8.4f f=%8.4f\n",it,x0,y0,r);
  135.     }  while (!((r < eps)));
  136.  
  137.     printf(" it=%5d x=%8.4f y=%8.4f f=%8.4f\n",it,x0,y0,r);
  138. }

Объяснение кода листинга программы

  1. Переменные:
    • x[i] - двойное значение, используемое для хранения значений x
    • y[i] - двойное значение, используемое для хранения значений y
    • fh, fl, f4, f5, f6 - двойные значения, используемые для хранения значений функций
    • h, l, it - целочисленные значения, используемые для хранения индексов и счетчика итераций
    • eps - десятичное значение, используемое для определения точности
    • alfa, beta, gamma - десятичные значения, используемые как коэффициенты
    • t - десятичное значение, используемое для смещения начала отсчета
    • n_max - целочисленное значение, ограничивающее количество переменных
    • r, r1 - десятичные значения, используемые для хранения значений функций и расстояний
    • x0, y0 - десятичные значения, используемые как начальные значения
    • x1, y1 - десятичные значения, используемые как значения после первой итерации
    • i, flag - целочисленные значения, используемые для цикла и проверки условий
    • TheEnd - метка окончания цикла
  2. Задачи:
    • Оптимизация функции f(x) путем минимизации значения f(x)
    • Подход к решению использует методы оптимизации, включая деление отрезка пополам и выбор следующей точки на основе значений функции в предыдущих точках
    • Итерационный процесс продолжается до тех пор, пока изменение значения функции не станет достаточно малым
  3. Решение:
    • Используется цикл do-while для выполнения итерационного процесса
    • На каждой итерации выполняются следующие действия:
      • Вычисляются значения функций fh и fl с помощью функций maxf и minf
      • Вычисляются значения x[3], y[3], x[4], y[4], x[5], y[5] и x[6], y[6] с использованием коэффициентов alfa, beta и gamma, а также значений x[0], y[0], x[1], y[1], x[2] и y[2]
      • Проверяются условия для перехода к следующей итерации или обновления значений x[h] и y[h]
      • Вычисляются значения r1 и r для оценки изменения значений функции
      • Если выполняется условие окончания цикла, выводится сообщение и значения x0, y0 и r
  4. Входные данные:
    • Начальные значения x0 = -1.2, y0 = 1
    • Значение t = 0.2
    • Значение n_max = 6
  5. Выходные данные:
    • После выполнения цикла do-while выводится сообщение и значения x0, y0 и r
    • Значение r представляет собой минимальное значение функции f(x)
    • Значения x0, y0 являются оптимальными значениями, минимизирующими функцию f(x)

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


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

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

8   голосов , оценка 4.5 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут