Дифференцирование и упрощение алгебраических выражений - Lisp

Узнай цену своей работы

Формулировка задачи:

Только начала разбираться с Lisp и вот задание,не могу дописать,помогите,пожалуйста Задание Для алгебраического выражения, заданного в виде предложения естественного языка: - Изобразить его в форме S - выражения; - Предоставить свойства "производная" символов, соответствующих знакам алгебраических операций имена функций дифференцирования; - Описать функции для определения производных алгебраических действий; - Описать функцию, что в зависимости от значения свойства "производная" осуществляет вызов соответствующей функции дифференцирования; - Составить функции для упрощения результатов; - Провести обратный переход от S- выражения к предложению естественно языка. В итоге программа должна решать примеры типа Вот мои попытки кода,только он какой-то отрывистый,как по мне
Листинг программы
  1. (put '* 'diff 'diff_mult)
  2. (put '+ 'reduce 'reduce_plus)
  3. (put '- 'reduce 'reduce_minus)
  4. (put '* 'reduce 'reduce_mult)
  5. (defun diff_g(a x)
  6. (cond ((atom)(if (eql (a x) 1 0))
  7. (T (funcall (get (car a) 'diff) (cdr a) x)))))
  8. (defun reduce_g(L)
  9. (cond ((atom L) L)
  10. (T (funcall (get (car L) 'reduce) (cdr L)))))
  11. (defun diff_plus(L x)
  12. (list '+ (diff_g(car L) x)
  13. (diff_g(cadr L) x)))
  14. (defun diff_minus(L x)
  15. (list '- (diff_g(car L) x)
  16. (diff_g(cadr L) x)))
  17. (defun diff_mult(L x)
  18. (list '+
  19. (list '* (diff_g(car L) x) (cadr L))
  20. (list '* (diff_g(cadr L) x) (car L))))
  21. (defun reduce_plus(L)
  22. (cond
  23. (setq x (cadr L))
  24. (setq y (caddr L))
  25. ((zerop x) y)
  26. ((and (numberp x)(numberp y))(+ x y)
  27. (T '(+ x y))))
  28. (defun reduce_mult(L)
  29. (cond
  30. (setq x (cadr L))
  31. (setq y (caddr L))
  32. (eql x 1) y)
  33. (eql y 1) x)
  34. ((or (zerop x)(zerop y)) 0)
  35. ((and (numberp x)(numberp y)) (* x y))
  36. (T '(* x y))))

Решение задачи: «Дифференцирование и упрощение алгебраических выражений»

textual
Листинг программы
  1. (defun deriv (f x)
  2. * (cond ((numberp f) 0)
  3. * * * * ((eq f x) 1)
  4. * * * * ((eq (car f) '+) `(+ ,(deriv (cadr f) x) ,(deriv (caddr f) x)))
  5. * * * * ((eq (car f) '-) `(- ,(deriv (cadr f) x) ,(deriv (caddr f) x)))
  6. * * * * ((eq (car f) '*) `(+ (* ,(caddr f) ,(deriv (cadr f) x)) (* ,(cadr f) ,(deriv (caddr f) x))))
  7. * * * * ((eq (car f) 'sin) `(* (cos ,(cadr f)) ,(deriv (cadr f) x)))
  8. * * * * ((eq (car f) 'cos) `(* (- (cos ,(cadr f)) ,(deriv (cadr f) x))))
  9. * * * * ((eq (car f) 'exp) `(* (exp ,(cadr f)) (deriv (cadr f) x)))
  10. * * * * ((eq (car f) '^) `(* (* ,(caddr f) (^ ,(cadr f) (- ,(caddr f) 1))) ,(deriv (cadr f) x)))))

Объяснение кода листинга программы

В данном коде реализована функция deriv, которая вычисляет производную алгебраического выражения. Вот список шагов, которые выполняются в коде:

  1. Проверка типа функции: Сначала функция проверяет, является ли входная функция числом. Если это так, то производная равна нулю.
  2. Проверка на равенство функции переменной: Если функция равна переменной, то производная равна единице.
  3. Рекурсивный вызов для первого элемента функции: Если первый элемент функции не равен перечисленным выше условиям, то функция рекурсивно вызывается для первого элемента и переменной.
  4. Рекурсивный вызов для второго элемента функции: Если второй элемент функции не равен перечисленным выше условиям, то функция рекурсивно вызывается для второго элемента и переменной.
  5. Упрощение выражения: Если первый элемент функции равен '+, то производная равна сумме производных второго и третьего элементов.
  6. Упрощение выражения: Если первый элемент функции равен '-', то производная равна разности производных второго и третьего элементов.
  7. Упрощение выражения: Если первый элемент функции равен '*', то производная равна произведению производных второго и третьего элементов.
  8. Упрощение выражения: Если первый элемент функции равен 'sin', то производная равна произведению производной второго элемента на cos.
  9. Упрощение выражения: Если первый элемент функции равен 'cos', то производная равна произведению производной второго элемента на -sin.
  10. Упрощение выражения: Если первый элемент функции равен 'exp', то производная равна произведению производной второго элемента на exp.
  11. Упрощение выражения: Если первый элемент функции равен '^', то производная равна произведению производной второго элемента на (-1*(произведение производной третьего элемента на 1)))/((произведение производной второго элемента на 1)).
  12. Вывод результата: В конце функция возвращает полученное значение.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.5 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы