Дифференцирование и упрощение алгебраических выражений - Lisp
Формулировка задачи:
Только начала разбираться с Lisp и вот задание,не могу дописать,помогите,пожалуйста
Задание
Для алгебраического выражения, заданного в виде предложения естественного языка:
- Изобразить его в форме S - выражения;
- Предоставить свойства "производная" символов, соответствующих знакам алгебраических операций имена функций дифференцирования;
- Описать функции для определения производных алгебраических действий;
- Описать функцию, что в зависимости от значения свойства "производная" осуществляет вызов соответствующей функции дифференцирования;
- Составить функции для упрощения результатов;
- Провести обратный переход от S- выражения к предложению естественно языка.
В итоге программа должна решать примеры типа
Вот мои попытки кода,только он какой-то отрывистый,как по мне
(put '* 'diff 'diff_mult) (put '+ 'reduce 'reduce_plus) (put '- 'reduce 'reduce_minus) (put '* 'reduce 'reduce_mult) (defun diff_g(a x) (cond ((atom)(if (eql (a x) 1 0)) (T (funcall (get (car a) 'diff) (cdr a) x))))) (defun reduce_g(L) (cond ((atom L) L) (T (funcall (get (car L) 'reduce) (cdr L))))) (defun diff_plus(L x) (list '+ (diff_g(car L) x) (diff_g(cadr L) x))) (defun diff_minus(L x) (list '- (diff_g(car L) x) (diff_g(cadr L) x))) (defun diff_mult(L x) (list '+ (list '* (diff_g(car L) x) (cadr L)) (list '* (diff_g(cadr L) x) (car L)))) (defun reduce_plus(L) (cond (setq x (cadr L)) (setq y (caddr L)) ((zerop x) y) ((and (numberp x)(numberp y))(+ x y) (T '(+ x y)))) (defun reduce_mult(L) (cond (setq x (cadr L)) (setq y (caddr L)) (eql x 1) y) (eql y 1) x) ((or (zerop x)(zerop y)) 0) ((and (numberp x)(numberp y)) (* x y)) (T '(* x y))))
Решение задачи: «Дифференцирование и упрощение алгебраических выражений»
textual
Листинг программы
(defun deriv (f x) * (cond ((numberp f) 0) * * * * ((eq f x) 1) * * * * ((eq (car f) '+) `(+ ,(deriv (cadr f) x) ,(deriv (caddr f) x))) * * * * ((eq (car f) '-) `(- ,(deriv (cadr f) x) ,(deriv (caddr f) x))) * * * * ((eq (car f) '*) `(+ (* ,(caddr f) ,(deriv (cadr f) x)) (* ,(cadr f) ,(deriv (caddr f) x)))) * * * * ((eq (car f) 'sin) `(* (cos ,(cadr f)) ,(deriv (cadr f) x))) * * * * ((eq (car f) 'cos) `(* (- (cos ,(cadr f)) ,(deriv (cadr f) x)))) * * * * ((eq (car f) 'exp) `(* (exp ,(cadr f)) (deriv (cadr f) x))) * * * * ((eq (car f) '^) `(* (* ,(caddr f) (^ ,(cadr f) (- ,(caddr f) 1))) ,(deriv (cadr f) x)))))
Объяснение кода листинга программы
В данном коде реализована функция deriv
, которая вычисляет производную алгебраического выражения. Вот список шагов, которые выполняются в коде:
- Проверка типа функции: Сначала функция проверяет, является ли входная функция числом. Если это так, то производная равна нулю.
- Проверка на равенство функции переменной: Если функция равна переменной, то производная равна единице.
- Рекурсивный вызов для первого элемента функции: Если первый элемент функции не равен перечисленным выше условиям, то функция рекурсивно вызывается для первого элемента и переменной.
- Рекурсивный вызов для второго элемента функции: Если второй элемент функции не равен перечисленным выше условиям, то функция рекурсивно вызывается для второго элемента и переменной.
- Упрощение выражения: Если первый элемент функции равен '+, то производная равна сумме производных второго и третьего элементов.
- Упрощение выражения: Если первый элемент функции равен '-', то производная равна разности производных второго и третьего элементов.
- Упрощение выражения: Если первый элемент функции равен '*', то производная равна произведению производных второго и третьего элементов.
- Упрощение выражения: Если первый элемент функции равен 'sin', то производная равна произведению производной второго элемента на cos.
- Упрощение выражения: Если первый элемент функции равен 'cos', то производная равна произведению производной второго элемента на -sin.
- Упрощение выражения: Если первый элемент функции равен 'exp', то производная равна произведению производной второго элемента на exp.
- Упрощение выражения: Если первый элемент функции равен '^', то производная равна произведению производной второго элемента на (-1*(произведение производной третьего элемента на 1)))/((произведение производной второго элемента на 1)).
- Вывод результата: В конце функция возвращает полученное значение.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д