Алгоритм (ы) для перестановки простых символических алгебраических выражений - PullRequest
6 голосов
/ 02 января 2011

Я хотел бы знать, существует ли простой алгоритм перестановки простых символических алгебраических выражений.В идеале я хотел бы иметь возможность переписать любое такое выражение с одной только переменной на левой стороне.Например, с учетом ввода:

m = (x + y) / 2

... Я хотел бы иметь возможность спросить о x в терминах m и y или y в терминах x и m, и получите их:

x = 2*m - y
y = 2*m - x

Конечно, мы все делали этот алгоритм на бумаге в течение многих лет.Но мне было интересно, если бы было название для этого.Это кажется достаточно простым, но если бы кто-то уже каталогизировал различные «ошибки», это сделало бы жизнь проще.

Для моих целей мне не понадобится справляться с квадратичностью.

(И да,Системы CAS делают это, и да, я знаю, что я мог бы просто использовать их как библиотеку. Я хотел бы избежать такой зависимости в своем приложении. Я действительно хотел бы знать, существуют ли именованные алгоритмы для решения этой проблемы.)

Ответы [ 3 ]

2 голосов
/ 03 января 2011

То, что вы хотите, это алгоритм (ы) решения уравнений. Но держу пари, что это огромная тема. В общем случае может быть:

  • система уравнений
  • уравнения могут быть нелинейными, поэтому необходимы дополнительные алгоритмы, такие как факторизация уравнения.
  • необходимо знание, как поменять функции, например => sin(x) + 10 = z, решая для x, мы обращаем sin (), то есть arcsin (). (Не все функции могут быть обратимыми!)
  • наконец, некоторые уравнения могут быть трудноразрешимыми даже для CAS, такие как sin(x)+x=y, решить для х.

Трудный ответ: лучше всего взять исходный код некоторого CAS, например, вы можете взглянуть на исходный код MAXIMA CAS, который написан на LISP. И найдите код, который отвечает за решение уравнений.

Простой ответ - если все, что вам нужно, это решение уравнения, которое является линейным и состоит только из базовых операторов + - * /. Тогда вы уже знаете ответ - используйте старый добрый бумажный метод - подумайте, какие правила мы использовали на бумаге, и просто переписайте эти правила в качестве символического алгоритма, который манипулирует строкой уравнения.

удачи!

2 голосов
/ 02 января 2011

Похоже, что вы заинтересованы в том, чтобы поддерживать систему линейных уравнений, а затем в любое время иметь возможность найти одну переменную с точки зрения всех остальных.Если вы закодируете отношения как матрицу, кажется, что вы могли бы затем уменьшить матрицу до некоторой удобной формы (например, уменьшенной формы эшелона строк), чтобы получить «простейшие» зависимости среди переменных (для некоторого красивого определения «простейшие»).") Получив такие данные, вы сможете прочитать все зависимости, просто взглянув на строку, содержащую ненулевую запись для рассматриваемой переменной, а затем нормализовав ее так, чтобы переменная имела коэффициент один.

Примечание. В целом, вы не всегда получите уникальное решение для каждой переменной.Например, учитывая тривиальные уравнения

x = y
x = z

Тогда решение для z может дать либо "z = x", либо "z = y", в зависимости от того, сколько упрощений вы хотите.Или, в качестве альтернативы, в настройках типа

x = 2y + 3w
x = 9z

Возврат значения для x может вернуть либо выражение, либо их сумму за два, либо целый ряд других вещей, которые все технически верны, но не обязательно полезны.Я не уверен, как бы вы справились с этим, но в зависимости от формы ваших уравнений вы, вероятно, сможете найти способ справиться с этим.

0 голосов
/ 05 сентября 2011

Существуют различные простые способы, с помощью которых исходное уравнение можно изменить, выполнение правильных изменений в правильном порядке приведет к правильному решению.Так как насчет того, чтобы рассматривать это как поиск или даже поиск пути?

...