#java #matrix #rounding #linear-algebra
#java #матрица #округление #линейная алгебра
Вопрос:
Я пытаюсь написать программу, которая решает для уменьшенной формы эшелона строк при задании матрицы. В основном то, что я делаю, — это написание программы, которая решает системы уравнений. Однако, из-за того, что бывают случаи, когда мне нужно выполнить деление, чтобы получить повторяющиеся цифры (например, 2/3, что равно .66666 …), А java округляется до определенной цифры, бывают случаи, когда pivot должен быть равен 0 (что означает отсутствие pivot), что-то вроде .0000001, и это приводит к путанице вверх по всей моей программе.
Мой первый вопрос: если бы у меня был какой-то оператор if, каков наилучший способ написать что-то вроде «если это число меньше 0,00001 от целого числа, то округлите до этого ближайшего целого числа».
Мой второй вопрос заключается в том, есть ли у кого-нибудь какие-либо идеи о более оптимальных способах решения этой ситуации, а не просто использовать операторы if, округляющие числа повсюду.
Большое вам спасибо.
Ответ №1:
Вы говорите, что пишете программу, которая решает системы уравнений. Это довольно сложная проблема. Если вы хотите использовать только такую программу, вам лучше использовать библиотеку, написанную кем-то другим. Я предполагаю, что вы действительно хотите написать программу самостоятельно, для развлечения и / или образования.
Вы определили основную проблему: использование чисел с плавающей запятой приводит к округлению и, следовательно, к неточным результатам. Для этого есть два решения.
Первое решение — не использовать числа с плавающей запятой. Используйте только целые числа и уменьшите матрицу до формы эшелона строк (не уменьшенной); это можно сделать без делений. Поскольку все вычисления с целыми числами являются точными, значение pivot, которое должно быть равно 0, будет ровно 0 (на самом деле, может возникнуть проблема с переполнением). Конечно, это будет работать только в том случае, если матрица, с которой вы начинаете, состоит из целых чисел. Вы можете обобщить этот подход, работая с дробями вместо целых чисел.
Второе решение — использовать числа с плавающей запятой и быть очень осторожным. Это тема целой области математики / информатики, называемой численным анализом. Это слишком сложно объяснить в ответе здесь, поэтому вам нужно получить книгу по численному анализу. Проще говоря, то, что вы хотите сделать, это сказать, что если Math.abs(pivot) <некоторое небольшое значение, то вы предполагаете, что pivot должен быть равен нулю, но что это что-то вроде .0000000001 из-за ошибок округления, поэтому вы просто действуете так, как будто pivot равен нулю. Проблема заключается в том, чтобы выяснить, что такое «некоторое небольшое значение».