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

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

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

Есть код (если я правильно узнал язык) на Лиспе, описывающий вычисление двойного интеграла методом ячеек. К сожалению, я совершенно не знаю Лиспа, поэтому прошу помочь перевести это на "нормальный" императивный язык (желательно С/С++).
;; функция вычисления интеграла
(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)
Входные данные(function.txt):
;;интегрируемая функция
(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);
}

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

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

  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
Похожие ответы