Метод простой итерации решения СЛАУ (реализация на Java)

Java   30 января 2012  Автор статьи:  

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

import java.io.PrintWriter;
import java.util.Locale;
import java.util.Scanner;

public class Solution {
public static void main(String[] args) {
// Для считывания воспользуемся классом Scanner
Scanner scanner = new Scanner(System.in);
// Для того, чтобы целая часть вещественного числа
// отделялась от дробной точкой, а не запятой,
// необходимо установить русский Locale
scanner.useLocale(new Locale("Russian"));

// Для вывода - классом PrintWriter
PrintWriter printWriter = new PrintWriter(System.out);

// Считываем размер вводимой матрицы
int size;
size = scanner.nextInt();

// Будем хранить матрицу в векторе, состоящем из
// векторов вещественных чисел
double[][] matrix = new double[size][size + 1];

// Матрица будет иметь размер (size) x (size + 1),
// c учетом столбца свободных членов
for (int i = 0; i < size; i++) { for (int j = 0; j < size + 1; j++) { matrix[i][j] = scanner.nextDouble(); } } // Считываем необходимую точность решения double eps; eps = scanner.nextDouble(); // Введем вектор значений неизвестных на предыдущей итерации, // размер которого равен числу строк в матрице, т.е. size, // причем согласно методу изначально заполняем его нулями double[] previousVariableValues = new double[size]; for (int i = 0; i < size; i++) { previousVariableValues[i] = 0.0; } // Будем выполнять итерационный процесс до тех пор, // пока не будет достигнута необходимая точность while (true) { // Введем вектор значений неизвестных на текущем шаге double[] currentVariableValues = new double[size]; // Посчитаем значения неизвестных на текущей итерации // в соответствии с теоретическими формулами for (int i = 0; i < size; i++) { // Инициализируем i-ую неизвестную значением // свободного члена i-ой строки матрицы currentVariableValues[i] = matrix[i][size]; // Вычитаем сумму по всем отличным от i-ой неизвестным for (int j = 0; j < size; j++) { if (i != j) { currentVariableValues[i] -= matrix[i][j] * previousVariableValues[j]; } } // Делим на коэффициент при i-ой неизвестной currentVariableValues[i] /= matrix[i][i]; } // Посчитаем текущую погрешность относительно предыдущей итерации double error = 0.0; for (int i = 0; i < size; i++) { error += Math.abs(currentVariableValues[i] - previousVariableValues[i]); } // Если необходимая точность достигнута, то завершаем процесс if (error < eps) { break; } // Переходим к следующей итерации, так // что текущие значения неизвестных // становятся значениями на предыдущей итерации previousVariableValues = currentVariableValues; } // Выводим найденные значения неизвестных for (int i = 0; i < size; i++) { printWriter.print(previousVariableValues[i] + " "); } // После выполнения программы необходимо закрыть // потоки ввода и вывода scanner.close(); printWriter.close(); } }

  • Женя

    У меня больше 1000 шагов =) и еще продолжает считать…. Это работает вообще?

    • Да, все тестилось, прежде чем выкладываться на сайт, но если вы выясните, что код не работает на каком — то примере, то пришлите его нам, мы попробуем решить проблему.

  • Женя

    Поставил счётчик и одно уравнение уже накрутилось до 80к, а второе за 46 шагов завершилось!

    • Это нормально. Все зависит от уравнений.

    • funt

      как же ты его поставил и как вообще понять что оно выполняется?

      • Ты в какой среде работаешь?

Научиться программировать

  • на Delphi

  • на Java

  • на C++