Вычисление определенного интеграла методом прямоугольника - Lisp
Формулировка задачи:
Common lisp
Сформировать в виде файла запись функции, начального и конечного значения, найти численным способом определенный интеграл методом прямоугольников и ответ записать в файл.
помогите пожалуйста с реализацией примерно представляю но как реализовать не понимаю
(defun fx(x)
(setq fun #'((lambda (x) (/ (log x) (^ (+ x 2) 2))) 1 5 100))
)
(defun ()
(setq op1(open "C:/lisp/v1.txt"))
(setq a op1)
(setq op2(open "C:/lisp/v2.txt"))
(setq b op2)
(setq h (/(-b a)n))
(setq xb a)
(loop for i from 1 to 10 do
(setq ih (* i h))
(setq x (+xb ih)
(setq s + s (fun(x)) * h)
)
(defun intgr (lst &optional (s 0))
(cond ((null (cdr lst)) (* (car lst) s))
(t (intgr (cdr lst) (+ s (car lst)))))
)
(defun F(intgr)
(setq out(open "C:/lisp/out.txt" :direction :output))
(princ intgr out)(terpri out)
(close out)
)Решение задачи: «Вычисление определенного интеграла методом прямоугольника»
textual
Листинг программы
(defun simpson (f a b n &aux (h (/ (- b a) n)) (s1 (funcall f (+ a (/ h 2)))) (s2 0)) (loop for i from 1 below n do (let ((z (+ a (* h i)))) (incf s1 (funcall f (+ z (/ h 2)))) (incf s2 (funcall f z))) finally (return (* (/ h 6) (+ (funcall f a) (funcall f b) (* s1 4) (* s2 2)))))) > (simpson (lambda (x) x) 0 5 100) 25/2 > (float (simpson (lambda (x) x) 0 5 100)) 12.5 > (simpson (lambda (x) (* x x)) 0 5 100) 125/3 > (float (simpson (lambda (x) (* x x)) 0 5 100)) 41.666668 > (simpson (lambda (x) (/ 1 (log x))) 2 5 5) 2.589651
Объяснение кода листинга программы
Код вычисляет определенный интеграл методом Симпсона.
- В первой строке функции
simpsonопределяются переменные: —h— шаг интегрирования, —s1иs2— переменные для хранения сумм, используемых в формуле метода Симпсона. - Затем в цикле
loopот 1 доnвыполняются следующие действия: —z— переменная для хранения текущей точки на отрезке [a, b], —s1иs2— обновляются значения суммs1иs2соответственно, —incf— увеличивает значение переменной на единицу. - В конце функции возвращается результат вычисления интеграла по формуле метода Симпсона:
—
h— шаг интегрирования, —(funcall f a)— значение функцииfв точкеa, —(funcall f b)— значение функцииfв точкеb, —(s1 4)— суммаs1умноженная на 4, —(s2 2)— суммаs2умноженная на 2. - В конце примера кода вызывается функция
simpsonс разными аргументами: —(simpson (lambda (x) x) 0 5 100)— интеграл от 0 до 5 функцииx, —(float (simpson (lambda (x) x) 0 5 100))— преобразование результата в число с плавающей точкой, —(simpson (lambda (x) (* x x)) 0 5 100)— интеграл от 0 до 5 функцииx^2, —(float (simpson (lambda (x) (* x x)) 0 5 100))— преобразование результата в число с плавающей точкой. - Результат вычисления интеграла выводится на экран.