Производная от выражения с одной переменной (символическая)

Я написал HTML-код, используя JavaScript, чтобы различать одну функцию переменной. Мой код здесь. Я использовал Mathjax для печати вывода. Но полученный результат не упрощается. Например, производная от sin(x)/cos(x) получается как

((((cos(x))*(cos(x)))-((sin(x))*(-(sin(x)))))/((cos(x))^2))

который можно упростить до

(sin(x)^2+cos(x)^2)/cos(x)^2

Я построил дерево выражений с применением алгоритма маневровой станции Дейкстры. А затем рекурсивно построил дерево выражений производной. Но у меня проблема с упрощением.

Может ли кто-нибудь помочь с упрощением вывода? Мои знания не выходят за рамки элементарных структур данных.


person Sumit Kumar Jha    schedule 17.11.2013    source источник
comment
Пожалуйста, будьте более конкретны в вопросе. Хотя бы примеры того, что у вас получается и что желательно на выходе. Вопрос должен работать, даже если ссылка мертва.   -  person IvanH    schedule 17.11.2013
comment
Я добавил пример сейчас. Спасибо за комментарий.   -  person Sumit Kumar Jha    schedule 17.11.2013
comment
@SumitKumarJha - ИванХ просил пример кода. У вас есть конкретная проблема с кодированием/алгоритмом - с правильностью или производительностью вашего кода?   -  person Chandranshu    schedule 17.11.2013
comment
@Chandranshu- Я хотел знать, существует ли алгоритм упрощения алгебраических выражений (например, упрощение радикалов и т. д.).   -  person Sumit Kumar Jha    schedule 17.11.2013
comment
Я думаю, вы хотите по крайней мере три вещи: удаление ненужных скобок, сбор a^n * a ==> a^(n+1) и набор терминов-знаков.   -  person ellisbben    schedule 19.11.2013
comment
SICP обсуждает символическую дифференциацию и способы достижения некоторых упрощений путем добавления правил к дифференциации: mitpress.mit.edu/sicp/full-text/sicp/book/node39.html   -  person ellisbben    schedule 19.11.2013
comment
Вы всегда можете заглянуть в существующую библиотеку? github.com/jiggzson/nerdamer   -  person ArchHaskeller    schedule 30.09.2015


Ответы (1)


Ну, я могу думать только о реализации алгебраических правил.

  • чрезвычайно сложно кодировать
  • еще сложнее отлаживать

1.создайте список уравнений упрощения

  • как:

    cos^2(x)+sin^2(x)=1
    ...
    
  • это просто

  • но будьте осторожны, чтобы не добавлять сюда циклические уравнения (чтобы это зацикливалось без конца)
  • или правила, которые не упрощают вывод

2.создать список методов замены

3. пройти через уравнение

  • проверить все правила упрощения
  • если это применимо, тогда примените его (трудно кодировать)
  • если ничего не найдено, попробуйте замены (очень сложно правильно закодировать)
  • если все еще ничего не найдено, остановитесь

4. сделать пункт 3 для всех представлений уравнения

  • уравнение можно записать другими способами
  • мультипликативный
  • экспоненциол
  • дробный и тд...
  • вам нужно протестировать все варианты
person Spektre    schedule 15.01.2014