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