fork download
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. #define n 11 // Количество точек данных
  5.  
  6. // Функция для расчета ошибки модели
  7. double F(double b1, double b2, double x[], double y[]) {
  8. double F = 0;
  9. for (int i = 0; i < n; i++) {
  10. double Y_m = b1 * log(b2 * x[i]); // Модельное значение y
  11. F += pow(y[i] - Y_m, 2); // Квадрат ошибки
  12. }
  13. return F;
  14. }
  15.  
  16. int main() {
  17. // Исходные данные
  18. double x[n] = {0.1, 0.9, 1, 2, 5, 6, 7, 10, 15, 16, 17};
  19. double y[n] = {-4.767, -0.394, -0.185, 1.195, 3.018, 3.381, 3.688, 4.398, 5.205, 5.333, 5.454};
  20.  
  21. // Начальные значения переменных
  22. int Iter = 0;
  23. double b1 = 2.0; // Начальные значения b1
  24. double b2 = 1.0; // Начальные значения b2
  25.  
  26. // Вывод исходных данных
  27. printf("Data (x, y):\n");
  28. for (int i = 0; i < n; i++) {
  29. printf("%.1f %.3f\n", x[i], y[i]);
  30. }
  31.  
  32. // Вывод начальной ошибки
  33. printf("\nFnach: %.6f\n", F(b1, b2, x, y));
  34.  
  35. // Ввод параметров оптимизации
  36. double F_zad, db;
  37. printf("Write Fzad: ");
  38. scanf("%lf", &F_zad);
  39. printf("Write db: ");
  40. scanf("%lf", &db);
  41.  
  42. // Итерационный процесс оптимизации
  43. while (F_zad < F(b1, b2, x, y)) {
  44. double new_b1 = b1, new_b2 = b2;
  45.  
  46. // Оптимизация параметра b1
  47. if (F(b1 + db, b2, x, y) < F(b1, b2, x, y)) {
  48. new_b1 = b1 + db;
  49. } else if (F(b1 - db, b2, x, y) < F(b1, b2, x, y)) {
  50. new_b1 = b1 - db;
  51. }
  52.  
  53. // Оптимизация параметра b2
  54. if (F(b1, b2 + db, x, y) < F(b1, b2, x, y)) {
  55. new_b2 = b2 + db;
  56. } else if (F(b1, b2 - db, x, y) < F(b1, b2, x, y)) {
  57. new_b2 = b2 - db;
  58. }
  59.  
  60. // Обновление параметров
  61. b1 = new_b1;
  62. b2 = new_b2;
  63. Iter++;
  64.  
  65. // Проверка на превышение числа итераций
  66. if (Iter > 1000) {
  67. printf("Ошибка: невозможно вычислить функцию с требуемой точностью.\n");
  68. return 1;
  69. }
  70. }
  71.  
  72. // Вывод результатов
  73. printf("\nIterations: %d\n", Iter);
  74. printf("Fkon: %.6f\n", F(b1, b2, x, y));
  75. printf("b1 = %.6f, b2 = %.6f\n", b1, b2);
  76.  
  77. return 0;
  78. }
Success #stdin #stdout 0.01s 5324KB
stdin
0.01 0.01
stdout
Data (x, y):
0.1 -4.767
0.9 -0.394
1.0 -0.185
2.0 1.195
5.0 3.018
6.0 3.381
7.0 3.688
10.0 4.398
15.0 5.205
16.0 5.333
17.0 5.454

Fnach: 0.431134
Write Fzad: Write db: 
Iterations: 8
Fkon: 0.003046
b1 = 1.980000, b2 = 0.920000