Дифференцирование и упрощение алгебраических выражений - 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)).
- Вывод результата: В конце функция возвращает полученное значение.