Решение уравнений средствами Maxima

Попросим Maxima решить систему из двух уравнений. Пусть требуется найти точки пересечения окружности x2 + y2 =4 и прямой 2x + y =2. Нарисуем оба графика на одном рисунке, убедимся в том, что прямая пересекает окружность и имеются две точки пересечения. Чтобы нарисовать два графика на одном рисунке, сначала нарисуем их по отдельности, потом объединим тексты заданий в одну команду, как список из двух заданий, разделенных запятой. В итоге получим два графика и команду вида

 

Рис. 29. Пересечение окружности прямой

Функцию solve() для решения системы уравнений запишем в виде

Отметим, что проект Maxima развивается, и некоторые даже простые задачи могут не иметь решения при стандартном подходе. Так, например функция solve не может найти решение следующей системы уравнений.

Хотя ответ sin(x) = ½, y = ½ очевиден любому школьнику (если две величины равны друг другу, а сумма этих величин равна единице, то каждая из них равны половине единицы).

По-видимому, разработчики посчитали, что не дело функции solve решать такие простые задачи, в которых одна из переменных может быть исключена из рассмотрения. Наше подозрение подкрепляется следующими ответами Maxima.

Здесь командой (%i31) была вызвана функция eliminate() и переменная у была исключена из рассматриваемой системы уравнений. И было получено только одно уравнение 1 – 2*sin (x) = 0, решить которое Maxima не составило труда: она не только получила решение (%о32), но и заботливо указала, что из-за периодичности тригонометрических функций (имеется ввиду соотношение sin (x+π) = sin (x)) и вследствие использования обратных тригонометрических функций (имеется ввиду функция arcsin (x)) прочие решения могут быть (!) утеряны (will be lost).

В следующем примере мы попросили решить уравнение x3 – 3x+2 = 0, с которым Maxima, как видим, успешно справилась.

И, тем не менее, у нас имеются претензии к записи полученного решения. Дело в том, что в данном задании мы попросили функцию solve найти корни алгебраического уравнения третьей степени которое теоретически должно иметь три корня, но в списке найденных решений (%о6) присутствуют только два из них, а о величине третьего корня (и даже о его наличии) нет никаких указаний. То есть найти корни уравнения средствами алгебры Maxima – этого не достаточно, нужно дополнительно их пересчитать и желательно проверить, являются ли найденные значения корнями – почти как в армии «доверяй, но проверяй».

Конечно, после того, как стало известно о том, что корни имеются, можно попытаться записать рассматриваемое уравнение x3 – 3x+2 = 0 в виде произведения простых сомножителей, используя функцию factor()

и из решения (%о34) сделать вывод о том, что рассматриваемое уравнение действительно имеет три корня, один из них равен –2, два других совпадают, равны 1. Но, ведь, мы обратились к функции solve(), а из её решения (%о33) такой вывод не сделаешь. В (%о33) записаны только два корня, это с одной стороны. С другой стороны, если система взяла на себя ответственность за решение задачи, то почему бы ей не сделать это качественно?