Как преобразовать уравнение в формулы для отдельных переменных? - PullRequest
5 голосов
/ 17 апреля 2009

Как преобразовать уравнение в формулы для отдельных переменных? Я думаю о математических уравнениях, таких как:

c^2 = a^2 + b^2

Я бы хотел иметь функцию, которая могла бы обрабатывать любую формулу и давать мне формулы для отдельных переменных Приведенное выше уравнение даст следующее:

a = (c^2 - b^2)^0.5
b = (c^2 - a^2)^0.5
c = (a^2 + b^2)^0.5

Я также хотел бы начать с:

a = (c^2 - b^2)^0.5

и вывод:

b = (c^2 - a^2)^0.5
c = (a^2 + b^2)^0.5

Я посмотрел на деревья выражений, но мне сложно представить, как это будет работать. Я хотел бы решение .NET (C #, VB.NET или F #). Есть идеи?

Что-то вроде:

public string[] GetFormulas(string equation)
{
   ...
}

Спасибо.

Ответы [ 8 ]

6 голосов
/ 17 апреля 2009

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

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

4 голосов
/ 17 апреля 2009

Это нетривиальная проблема, которую вы пытаетесь решить ... Не думаю, что вам повезет, если вы попытаетесь решить ее самостоятельно. Лучше найти какое-нибудь стороннее приложение или библиотеку, которая это делает. Существует целый ряд программ, которые могут выполнять операции, о которых вы говорите, такие как Matlab и Maple. Кроме того, графический калькулятор TI-89 может сделать это. Вы можете получить необходимые алгоритмы от Octave , который по сути является реализацией Matlab с открытым исходным кодом.

2 голосов
/ 17 апреля 2009

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

Как только вы поймете, как разбирать текст на символы, может быть достаточно просто создать приложение, которое может определить, что

c^2 = a^2 + b^2

можно заменить на

c = (a^2 + b^2)^.5

но как насчет

cos(c) = sin(a^2/b) - b^(a/sin(b))

Хуже того, у вас неразрешимая интеграция и абстрактная алгебра ... Вам нужно где-то нарисовать линию сложности, иначе вам просто придется построить еще один Maple .

1 голос
/ 17 апреля 2009

Работа с уравнениями в символическом и нечисловом виде - определенно непростая задача. Я думаю, что самым простым способом для вас было бы просто использовать Mathematica, Maple или аналогичные закулисные и позволить им выполнять тяжелую работу за вас.

1 голос
/ 17 апреля 2009

Это то, на что вы, вероятно, захотите взглянуть, используя математическую библиотеку. Для .NET Math.NET представляется наиболее полным вариантом (не уверен, насколько он стабилен, но он, безусловно, очень полный). Библиотека для выполнения символьных манипуляций должна быть в состоянии справиться с конкретной проблемой, которую вы здесь поставили.

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

0 голосов
/ 17 апреля 2009

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

x^5 + y^5 - xy + 1 = 0

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

Хуже того, добавьте в микс функции триггеров или любые специальные функции, и это заставит вас переписать Mathematica, прежде чем вы закончите.

0 голосов
/ 17 апреля 2009

В дополнение ко всему, что уже было сказано, вы можете взглянуть на численные методы.

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

0 голосов
/ 17 апреля 2009

Поскольку c ^ 2 = a ^ 2 + b ^ 2 не является выражением в C #, вы не на том пути.

Забудьте о деревьях выражений .NET и создайте свои собственные. Вам необходимо описать алгоритмы, необходимые для выполнения этих преобразований, и данные, необходимые для описания уравнения. Вы обнаружите, что то, что вы получаете, сильно отличается от дерева выражений .NET.

...