Переписать код с Лиспа на императивный язык: Вычисление двойного интеграла - Lisp
Формулировка задачи:
Есть код (если я правильно узнал язык) на Лиспе, описывающий вычисление двойного интеграла методом ячеек. К сожалению, я совершенно не знаю Лиспа, поэтому прошу помочь перевести это на "нормальный" императивный язык (желательно С/С++).
Входные данные(function.txt):
Листинг программы
- ;; функция вычисления интеграла
- (defun double_integral (ax bx ay by g f)
- ;; ширина ячейки
- (setq h1 (/ ( - bx ax) g))
- ;; высота ячейки
- (setq h2 (/ ( - by ay) g))
- ;; площадь ячейки
- (setq S (* h1 h2))
- ;; переменная для вычисления интеграла
- (setq I 0)
- ;; интегральная сумма
- (setq I (sum_delt ( - bx (/ h1 2)) (+ ay (/ h2 2)) ax bx ay by h1 h2 I f))
- )
- ;; вычисление суммы площадей ячеек
- (defun sum_delt (x y ax bx ay by h1 h2 I f)
- (cond
- ( (>= y by) I)
- (T (sum_delt ( - bx (/ h1 2)) (+ y h2) ax bx ay by h1 h2 (delta_x x y ax h1 h2 I f) f))
- )
- )
- ;; вычисление площади ячейки в точке x y
- (defun delta_x (x y ax h1 h2 I f)
- (cond
- ( (<= x ax) I)
- (T (delta_x ( - x h1) y ax h1 h2 (+ I (* h1 h2 (funcall f x y))) f))
- )
- )
- ;; подгружаем функцию и пределы интегрирования
- (load "D: \\function. txt")
- ;; вычисляем интеграл
- (setq I (double_integral a_x b_x a_y b_y count_dot (function f)))
- ; открываем файл для записи
- (setq output-stream (open " d: \\integral. txt": direction: output))
- ;; записываем результат интегрирования в файл
- (format output-stream "Integral = ~a" I)
- ; закрываем файл
- (close output-stream)
- ;; end
- Файл function. txt
- ;; интегрируемая функция
- (defun f (x y)
- (+ ( - 1 x) (* y y))
- )
- ;; начальный предел по x
- (setq a_x 0.5)
- ;; конечный предел по x
- (setq b_x 1)
- ;; начальный предел по y
- (setq a_y - 3)
- ;; конечный предел по y
- (setq b_y 2)
- ;; количество ячеек
- (setq count_dot 100)
Листинг программы
- ;;интегрируемая функция
- (defun f(x y)
- (+(-1 x) (* y y) )
- )
- ;;начальный предел по х
- (setq a_x 0.5)
- ;;конечный пределе по х
- (setq b_x 1)
- ;;начальный предел по у
- (setq a_y -3)
- ;;конечный предел по у
- (setq b_y 2)
- ;;количество ячеек
- (setq count_dot 100)
Листинг программы
- f - интегрируемая функция;
- ax - начальный предел интегрирования по x;
- bx - конечный предел интегрирования по x;
- ay - начальный предел интегрирования по y;
- by - конечный пределе интегрирования по y;
- g - количество ячеек;
- h1 - ширина ячейки;
- h2 - высота ячейки;
- S - площадь ячейки;
- I - интеграл от функции f;
- x, y - координаты центра ячейки.
Решение задачи: «Переписать код с Лиспа на императивный язык: Вычисление двойного интеграла»
textual
Листинг программы
- #include <stdio.h>
- double delta_x (double x, double y, double ax, double h1, double h2, double I, double (*f) (double x, double y)) {
- if (x <= ax) {
- return I;
- } else {
- return delta_x(x - h1, y, ax, h1, h2, I + h1 * h2 * (*f)(x, y), f);
- }
- }
- 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)) {
- if (y >= by) {
- return I;
- } else {
- return sum_delt(bx - h1/2, y + h2, ax, bx, ay, by, h1, h2, delta_x(x, y, ax, h1, h2, I, f), f);
- }
- }
- double double_integral (double ax, double bx, double ay, double by, int g, double (*f) (double x, double y)) {
- double h1 = (bx - ax)/g;
- double h2 = (by - ay)/g;
- double S = h1 * h2;
- double I = 0;
- I = sum_delt(bx - h1/2, ay + h2/2, ax, bx, ay, by, h1, h2, I, f);
- return I;
- }
- double f(double x, double y) {
- return ((1 - x) + y * y);
- }
- int main(int argc, char* argv[]) {
- double a_x = 0.5;
- double b_x = 1;
- double a_y = -3;
- double b_y = 2;
- int count_dot = 100;
- double I = double_integral(a_x, b_x, a_y, b_y, count_dot, &f);
- printf("Integral = %f\n", I);
- }
Объяснение кода листинга программы
Код представляет собой реализацию вычисления двойного интеграла методом деления отрезка на равные части (или сетку) и последующего суммирования значений функции в каждой точке этого отрезка. Вот список действий, которые выполняются в коде:
- delta_x: Эта функция реализует рекурсивный алгоритм для вычисления значения двойного интеграла. Если текущее значение x меньше или равно ax, функция возвращает значение I. В противном случае, функция вызывает саму себя, передавая в качестве аргументов новые значения x, y, ax, h1, h2, I и функцию f.
- sum_delt: Эта функция также реализует рекурсивный алгоритм для вычисления значения двойного интеграла. Если значение y больше или равно by, функция возвращает значение I. В противном случае, функция вызывает саму себя, передавая в качестве аргументов новые значения bx, y, ax, bx, ay, by, h1, h2, значение, полученное из вызова функции delta_x, и функцию f.
- double_integral: Эта функция вычисляет значение двойного интеграла. Сначала она вычисляет значения h1 и h2, которые представляют собой шаги по осям x и y соответственно. Затем она вычисляет значение S, которое представляет собой площадь прямоугольника, образованного шагами h1 и h2. Затем она инициализирует значение I как 0 и вызывает функцию sum_delt, передавая в качестве аргументов последние значения bx, y, ax, bx, ay, by, h1, h2 и I. Наконец, она возвращает значение I.
- f: Эта функция представляет собой функцию, которую нужно интегрировать. В данном случае она возвращает значение ((1-x) + y*y).
- main: Эта функция является точкой входа в программу. Она инициализирует значения переменных a_x, b_x, a_y, b_y и count_dot. Затем она вызывает функцию double_integral, передавая в качестве аргументов эти значения и функцию f. Наконец, она выводит значение I на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д