Переписать код с Лиспа на императивный язык: Вычисление двойного интеграла - Lisp

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

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

Есть код (если я правильно узнал язык) на Лиспе, описывающий вычисление двойного интеграла методом ячеек. К сожалению, я совершенно не знаю Лиспа, поэтому прошу помочь перевести это на "нормальный" императивный язык (желательно С/С++).
Листинг программы
  1. ;; функция вычисления интеграла
  2. (defun double_integral (ax bx ay by g f)
  3. ;; ширина ячейки
  4. (setq h1 (/ ( - bx ax) g))
  5. ;; высота ячейки
  6. (setq h2 (/ ( - by ay) g))
  7. ;; площадь ячейки
  8. (setq S (* h1 h2))
  9. ;; переменная для вычисления интеграла
  10. (setq I 0)
  11. ;; интегральная сумма
  12. (setq I (sum_delt ( - bx (/ h1 2)) (+ ay (/ h2 2)) ax bx ay by h1 h2 I f))
  13. )
  14. ;; вычисление суммы площадей ячеек
  15. (defun sum_delt (x y ax bx ay by h1 h2 I f)
  16. (cond
  17. ( (>= y by) I)
  18. (T (sum_delt ( - bx (/ h1 2)) (+ y h2) ax bx ay by h1 h2 (delta_x x y ax h1 h2 I f) f))
  19. )
  20. )
  21. ;; вычисление площади ячейки в точке x y
  22. (defun delta_x (x y ax h1 h2 I f)
  23. (cond
  24. ( (<= x ax) I)
  25. (T (delta_x ( - x h1) y ax h1 h2 (+ I (* h1 h2 (funcall f x y))) f))
  26. )
  27. )
  28. ;; подгружаем функцию и пределы интегрирования
  29. (load "D: \\function. txt")
  30. ;; вычисляем интеграл
  31. (setq I (double_integral a_x b_x a_y b_y count_dot (function f)))
  32. ; открываем файл для записи
  33. (setq output-stream (open " d: \\integral. txt": direction: output))
  34. ;; записываем результат интегрирования в файл
  35. (format output-stream "Integral = ~a" I)
  36. ; закрываем файл
  37. (close output-stream)
  38. ;; end
  39. Файл function. txt
  40. ;; интегрируемая функция
  41. (defun f (x y)
  42. (+ ( - 1 x) (* y y))
  43. )
  44. ;; начальный предел по x
  45. (setq a_x 0.5)
  46. ;; конечный предел по x
  47. (setq b_x 1)
  48. ;; начальный предел по y
  49. (setq a_y - 3)
  50. ;; конечный предел по y
  51. (setq b_y 2)
  52. ;; количество ячеек
  53. (setq count_dot 100)
Входные данные(function.txt):
Листинг программы
  1. ;;интегрируемая функция
  2. (defun f(x y)
  3. (+(-1 x) (* y y) )
  4. )
  5. ;;начальный предел по х
  6. (setq a_x 0.5)
  7. ;;конечный пределе по х
  8. (setq b_x 1)
  9. ;;начальный предел по у
  10. (setq a_y -3)
  11. ;;конечный предел по у
  12. (setq b_y 2)
  13. ;;количество ячеек
  14. (setq count_dot 100)
Листинг программы
  1. f - интегрируемая функция;
  2. ax - начальный предел интегрирования по x;
  3. bx - конечный предел интегрирования по x;
  4. ay - начальный предел интегрирования по y;
  5. by - конечный пределе интегрирования по y;
  6. g - количество ячеек;
  7. h1 - ширина ячейки;
  8. h2 - высота ячейки;
  9. S - площадь ячейки;
  10. I - интеграл от функции f;
  11. x, y - координаты центра ячейки.

Решение задачи: «Переписать код с Лиспа на императивный язык: Вычисление двойного интеграла»

textual
Листинг программы
  1. #include <stdio.h>
  2.  
  3. double delta_x (double x, double y, double ax, double h1, double h2, double I, double (*f) (double x, double y)) {
  4.     if (x <= ax) {
  5.         return I;
  6.     } else {
  7.         return delta_x(x - h1, y, ax, h1, h2, I + h1 * h2 * (*f)(x, y), f);
  8.     }
  9. }
  10.  
  11. double sum_delt (double x, double y, double ax, double bx, double ay, double by, double h1, double h2, double I, double (*f) (double x, double y)) {
  12.     if (y >= by) {
  13.         return I;
  14.     } else {
  15.         return sum_delt(bx - h1/2, y + h2, ax, bx, ay, by, h1, h2, delta_x(x, y, ax, h1, h2, I, f), f);
  16.     }
  17. }
  18.  
  19. double double_integral (double ax, double bx, double ay, double by, int g, double (*f) (double x, double y)) {
  20.     double h1 = (bx - ax)/g;
  21.     double h2 = (by - ay)/g;
  22.     double S = h1 * h2;
  23.     double I = 0;
  24.     I = sum_delt(bx - h1/2, ay + h2/2, ax, bx, ay, by, h1, h2, I, f);
  25.     return I;
  26. }
  27.  
  28. double f(double x, double y) {
  29.     return ((1 - x) + y * y);
  30. }
  31.  
  32. int main(int argc, char* argv[]) {
  33.     double a_x = 0.5;
  34.     double b_x = 1;
  35.     double a_y = -3;
  36.     double b_y = 2;
  37.     int count_dot = 100;
  38.     double I = double_integral(a_x, b_x, a_y, b_y, count_dot, &f);
  39.     printf("Integral = %f\n", I);
  40. }

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

Код представляет собой реализацию вычисления двойного интеграла методом деления отрезка на равные части (или сетку) и последующего суммирования значений функции в каждой точке этого отрезка. Вот список действий, которые выполняются в коде:

  1. delta_x: Эта функция реализует рекурсивный алгоритм для вычисления значения двойного интеграла. Если текущее значение x меньше или равно ax, функция возвращает значение I. В противном случае, функция вызывает саму себя, передавая в качестве аргументов новые значения x, y, ax, h1, h2, I и функцию f.
  2. sum_delt: Эта функция также реализует рекурсивный алгоритм для вычисления значения двойного интеграла. Если значение y больше или равно by, функция возвращает значение I. В противном случае, функция вызывает саму себя, передавая в качестве аргументов новые значения bx, y, ax, bx, ay, by, h1, h2, значение, полученное из вызова функции delta_x, и функцию f.
  3. double_integral: Эта функция вычисляет значение двойного интеграла. Сначала она вычисляет значения h1 и h2, которые представляют собой шаги по осям x и y соответственно. Затем она вычисляет значение S, которое представляет собой площадь прямоугольника, образованного шагами h1 и h2. Затем она инициализирует значение I как 0 и вызывает функцию sum_delt, передавая в качестве аргументов последние значения bx, y, ax, bx, ay, by, h1, h2 и I. Наконец, она возвращает значение I.
  4. f: Эта функция представляет собой функцию, которую нужно интегрировать. В данном случае она возвращает значение ((1-x) + y*y).
  5. main: Эта функция является точкой входа в программу. Она инициализирует значения переменных a_x, b_x, a_y, b_y и count_dot. Затем она вызывает функцию double_integral, передавая в качестве аргументов эти значения и функцию f. Наконец, она выводит значение I на экран.

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


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

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

12   голосов , оценка 3.75 из 5

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

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

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