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

  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
Похожие ответы