Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
2 / 2 / 2
Регистрация: 21.07.2015
Сообщений: 36

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

22.05.2016, 16:36. Показов 1498. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть код (если я правильно узнал язык) на Лиспе, описывающий вычисление двойного интеграла методом ячеек. К сожалению, я совершенно не знаю Лиспа, поэтому прошу помочь перевести это на "нормальный" императивный язык (желательно С/С++).
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
;; функция вычисления интеграла
(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):
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
;;интегрируемая функция
(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)
Code
1
2
3
4
5
6
7
8
9
10
11
f - интегрируемая функция;
ax - начальный предел интегрирования по x;
bx - конечный предел интегрирования по x;
ay - начальный предел интегрирования по y;
by - конечный пределе интегрирования по y;
g - количество ячеек;
h1 - ширина ячейки;
h2 - высота ячейки;
S - площадь ячейки;
I - интеграл от функции f;
x, y - координаты центра ячейки.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.05.2016, 16:36
Ответы с готовыми решениями:

Вычисление двойного интеграла
Вычислить двойной интеграл по области D, ограниченной указанными линиями. \int \int x*y^2dxdy y=2-x, y=x y=0

Вычисление двойного интеграла
Переходя к полярным координатам, вычислить интеграл: {\int}_{D}\int{y}^{2}\sqrt{{R}^{2}-{x}^{2}}dxdy, где ...

Вычисление двойного интеграла по области G
Задание:

9
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,708
Записей в блоге: 14
22.05.2016, 17:24
Голубчик... У "нормального C/С++" есть один небольшой недостаток (для решения данной задачи). Код, конечно, ужасный, но при некотором напряжении узнается метод трапеций. Сам по себе этот метод прост, однако есть проблема. Твой код "загружает" интегрируемую функцию (выражение, ее вычисляющее) из файла. В Лиспе это просто. А вот в C/С++ придется реализовывать вычисление выражения, заданного строкой (что значительно сложнее метода трапеций).
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
22.05.2016, 17:51
Лучший ответ Сообщение было отмечено NikBond как решение

Решение

Это действительно диалект лиспа под названием «г***олисп». Я переписал дословно. Рекурсивный алгоритм на лиспе выглядит так же нелепо, как на си; лисповый код гораздо хуже, чем на си (внутри функций ни одна переменная не объявлена, есть неиспользованные переменные; стиль ужасный).

Но даже такой код на лиспе, вероятно, более корректный, чем «наивная» реализация на си. Я особо не писал числяков ни на си, ни на лиспе, но, подозреваю, что по-хорошему в си надо добавлять много проверок на переполнение и т. п. И в лиспе, может быть, тоже; но искаропки лисп более — как это сказать — короче, robust.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#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);
}
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,708
Записей в блоге: 14
22.05.2016, 18:17
helter, формула для вычисления подинтегральной функции у ТС загружается из файла. Вы это реализовали?
0
 Аватар для _sg
4709 / 4404 / 380
Регистрация: 12.05.2012
Сообщений: 3,101
22.05.2016, 18:22
похожая тема:
Вычисление определенного интеграла методом прямоугольника
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
22.05.2016, 18:54
Цитата Сообщение от Catstail Посмотреть сообщение
helter, формула для вычисления подинтегральной функции у ТС загружается из файла. Вы это реализовали?
Не вижу смысла. Можно было бы в отдельном файле описать функцию, написать хедеры и компилировать несколько файлов, но это не имеет отношения ни к интегрированию, ни к лиспу.

Добавлено через 18 минут
Плюс, загрузка из файла — сомнительный финт ушами. Раз это файл с кодом, почему бы не дать ему расширение .lisp и не записать тестовую функцию туда? Это же элементарная логика: есть «библиотека», в которой определяется функция, есть «тестовый модуль», который загружает библиотеку и тестирует. Это тестовый модуль должен зависеть от библиотеки, а не наоборот! Притом, в наш просвящённый век библиотеки делают в виде asdf-систем и грузят их не load-ом, а asdf:load-system. Но наивно было бы ожидать asdf-систем от аффтара лиспокода, который не осилил даже let.
0
2 / 2 / 2
Регистрация: 21.07.2015
Сообщений: 36
22.05.2016, 19:54  [ТС]
Благодарю! В самом деле, считывание функции из файла совсем не принципиально в моем случае.
0
393 / 165 / 32
Регистрация: 10.12.2015
Сообщений: 717
23.05.2016, 00:20
Цитата Сообщение от helter Посмотреть сообщение
C
1
(*f)(x, y)
7: можно просто f(x, y), ну и в первом посте все имена глобальные, так что...
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
23.05.2016, 01:11
Я, правда, не пробовал этот лиспокод (пожалел sbcl), но, насколько можно видеть, f — функциональный параметр: он передаётся как аргумент и внутри функций funcall-ится, а когда объявлена внешняя функция, она передаётся через function. Я сделал так же: си — годный язык.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,708
Записей в блоге: 14
23.05.2016, 08:15
Цитата Сообщение от helter Посмотреть сообщение
Не вижу смысла.
-смысл в универсальности. Можно подставлять разные функции без перекомпиляции проекта. "Элементарно, Уотсон"

Добавлено через 2 минуты
Цитата Сообщение от helter Посмотреть сообщение
Плюс, загрузка из файла — сомнительный финт ушами. Раз это файл с кодом, почему бы не дать ему расширение .lisp и не записать тестовую функцию туда?
- руководствуясь этой логикой, можно обосновать то, что не стоит писать калькуляторы - написать функции "плюс", "минус",... - и достаточно!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.05.2016, 08:15
Помогаю со студенческими работами здесь

Вычисление двойного интеграла по области G
Вот такое задание:

Вычисление двойного интеграла методом ячеек
помогите написать программу по вычислению кратного интеграла пожалуйцста

Вычисление двойного интеграла сложной функции
Пытаюсь вычислить двойной интеграл от функции % G R H lambdaj theta win некоторые числа syms q r z=r^2; c=1+z; ...

Вычисление двойного интеграла по формуле трапеций
Добрый день! Подскажите, пожалуйста, как рассчитать двойной интеграл по формуле трапеций? Например,...

Вычисление двойного интеграла методом ячеек
Всех приветствую.Ситуация тяжелая(для меня по крайней мере), помогите пожалуйста с решением двойного интеграла, методом ячеек, просто здесь...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru