Если матрица небольшая, то составьте характеристический многочлен (например в wxMaxima легко сделать). Его коэффициенты будут тоже рациональными. А если привести к общему знаменателю, то будет многочлен с целыми коэффициентами.
Дальше можете аппроксимировать его корни рациональными числами с любой точностью (например методом Ньютона).
Не в обиду будь сказано, Ваш совет совершенно ошибочен.
Перейдем, однако, к делу.
JoyceУточним, чего вам надо. Верно ли, что (а) вы решаете данный вопрос для, фактически, однократного или близкого к тому использования ? Ваша программа не на продажу, и не для того, чтобы применять ее автоматически миллиарды раз ? (В последнем случае имела бы значение общая производительность программы; но для однократного применения в принципе всё равно, будут с.з. матрицы размера 50 на 50 считаться одну миллисекунду илм одну минуту). Просто есть один конкретный самосопряженный оператор, размерности около 50, и вам надо более-менее точно определить его спектр ?
Если так, задача решается довольно просто. Дело в том, что спектр симметрической матрицы очень устойчив к небольшим возмущениям элементов. Это можно уточнить по-разному, например в виде т.наз. теоремы Виландта-Гофмана. См., например, книгу Уилкинсона. И к возможным ошибкам округления при реализации какого-либо разумного алгоритма тоже устойчив. Короче, следствие такое: можете брать любой пакет, в котором зашито вычисление собственных значений симметрической матрицы, и результат будет очень точен. То есть, в вашем случае, думаю, если матрица размера 50, и все вычисления делаются с точностью double, т.е. с относительной точностью около
, то ошибка в любом
собственном значении будет не более
, где
--- наибольшее по модулю точное собственное значение. Это можно доказать (я в уме прикинул...), а фактически ошибка скорее всего еще меньше будет. А если хотите точность порядка последней разрядной единицы в наибольшем с.з., то можно делать вычисления, скажем, с точностью
или с большей, а потом найденные собственные значения округлить до double.
Для несимметрических же матриц ситуация совершенно другая, их с.з. считать гораздо труднее. Насчет них я не в курсе.
Впрочем, и искать какой-то пакет необязательно. Я, например, года три назад реализовал сам на Сях метод вращений Якоби, для своих собственных надобностей, и был вполне доволен результатом. И это немного времени заняло, пару дней (если не один вообще). Притом сам я отнюдь не программист.
Теперь насчет чего почитать по численной линейной алгебре. Гм. Курочка по зернышку клюет, поэтому я перечислю просто те книжки, из которых прочел более-менее много (из каких двадцать страниц, а из каких и двести). (Может тоже что для себя наклюете... ).
1)
Бахвалов, Численные методы, глава про численные методы алгебры
2)
Воеводин, Вычислительные основы линейной алгебры3)
Беклемишев, Дополнительные главы линейной алгебры (или как она там называется...)
4)
Wilkinson, Rounding errors in algebraic processes5)
Форсайт и Молер, Численное решение систем линейных алгебраических уравнений6)
Overton, Numerical computing with IEEE floating point arithmetic7)
Higham, Accuracy and stability of numerical algorithms8)
Уилкинсон, Алгебраическая проблема собственных значений9)
Trefethen, Bau, Numerical linear algebra10)
Деммель, Вычислительная линейная алгебра11)
Годунов с соавторами, упомянута выше в теме
12)
Парлетт, упомянута там же
Еще есть книги (не читал практически)
13)
Голуб, ван Лоан, Матричные вычисления14)
Уилкинсон, Райнш, Справочник алгоритмов на языке Алгол15)
Фаддеев и Фаддева, Вычислительная линейная алгебра (в настоящее время представляет
лишь исторический интерес),
16)
Малышев, Введение в вычислительную линейную алгебру. Из них, наиболее важны были Уилкинсон (малый, номер 4), Форсайт и Молер, Овертон (это
просто мастхев, как нынче говорят; собственно, она не про линейную алгебру, а про компьютерную
арифметику), и Трефетен-Бау.
-- 01.11.2021, 05:38 --m: genmatrix(lambda([i,j], 51-abs(i-j)), n, n);
не понял. Я с синтаксисом Максимы не знаком, системы компьютерной алгебры не пользую. Вы взяли матрицу с элементами
, да ? Но, такая матрица, если я не путаю (давненько не брал я в руки шашек!), более-менее тривиально решается руками, и в качестве тестовой не подходит. Попробуйте что-нибудь другое ... ну , например, обратные величины чисел от
до
, расположенные в естественном порядке (как в книжке). И посмотрите, не издохнет ли эта ваша максима.