Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/76: Рейтинг темы: голосов - 76, средняя оценка - 4.87
8 / 8 / 2
Регистрация: 26.04.2011
Сообщений: 87
1

Метод Зейделя

24.04.2012, 09:52. Показов 13762. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет. Мне необходимо решить СЛАУ методом Зейделя. Я перерыл уже кучу материала на эту тему, посмотрел такое же количество примеров и произвел множество попыток реализовать этот алгоритм. Но почему-то во всех случаях я не получаю нужный результат. Помогите решить проблему.

У меня есть матрица А

3 2 -1
2 -1 5
1 7 -1

И вектор свободных членов

4
23
5

Решая эту слау методом Холецкого я получаю искомый результат
2,00 1,00 4,00 - корни
0,00 0,00 0,00 - проверка b - Ax = 0

Но когда дело дошло до Зейделя, я постоянно получаю
NaN NaN NaN
NaN NaN NaN

Вот один из вариантов, которыми я пытался реализовать алгоритм Зейделя.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    boolean converge(double[] xk, double[] xkp, double eps) {
        for (int i = 0; i < xk.length; i++) {
            if (Math.abs(xk[i] - xkp[i]) >= eps) {
                return false;
            }
        }
        return true;
    }
 
    public double[] zeidel(double[][] a, double[] b, double EPS) {
        int size = a.length;
        double[] x = new double[size];
        double[] p = new double[size];
        do {
            for (int i = 0; i < size; i++) {
                double var = 0;
                for (int j = 0; j < size; j++) {
                    if (j != i) {
                        var += (a[i][j] * x[j]);
                    }
                }
                p[i] = x[i];
                x[i] = (b[i] - var) / a[i][i];
            }
        } while (!converge(x, p, EPS));
 
 
        return x;
    }
Очень прошу, помогите найти ошибку, или ошибки, как угодно...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.04.2012, 09:52
Ответы с готовыми решениями:

Метод половинного деления,хорд,ньютона,комбинированный метод
Добрый день. Помогите пожалуйста написать код на Java к функции: X^3 - 50cos(x) с интервалом -4 и...

СЛАУ. Метод обратной матрицы, метод Гаусса, метод Крамера, метод Зейделя
Помогите ребят. Не могу построить алгоритмы для этих методов Язык C++

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

Метод простых итераций и метод Зейделя для решения СЛАУ
1. Методом простых итераций и методом Зейделя решить СЛАУ вида Bx=с B=\begin{pmatrix}21 &amp; 3 &amp; 1...

14
636 / 528 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
24.04.2012, 12:55 2
Ну, и где сам вызов метода? Что выводишь, как передаешь и т.п. Приводи код полностью.

Вообще задача гуглится за 5 секунд.
0
8 / 8 / 2
Регистрация: 26.04.2011
Сообщений: 87
02.05.2012, 12:02  [ТС] 3
Цитата Сообщение от aleksandy Посмотреть сообщение
Вообще задача гуглится за 5 секунд.
Я в курсе, что примеров много, однако универсальной реализации на ява я не нашел, а мои попытки адаптировать готовые коды или реализовать алгоритмы не увенчались успехом.

Насчет вызова:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package nm_3;
 
import java.util.Random;
import nm_1.Matrix;
import nm_1.Vector;
 
/**
 *
 * @author Евгений Гусаров
 */
public class Main {
    
    private int SIZE = 3;
    private double EPS = 10E-3;
    
    public void run(){      
 
        //создаю объект матрица через написанный мной ранее класс Матрица. 
        //класс работает правильно, тк как тестировался множеством тестов 
        Matrix matrix = new Matrix(SIZE, SIZE); 
         matrix.set(0, 0, 3);
         matrix.set(0, 1, 2);
         matrix.set(0, 2, -1);
        
         matrix.set(1, 0, 2);
         matrix.set(1, 1, -1);
         matrix.set(1, 2, 5);
        
         matrix.set(2, 0, 1);
         matrix.set(2, 1, 7);
         matrix.set(2, 2, -1);
      
        //создаем объект вектор          
        Vector vector = new Vector(SIZE);
         vector.set(0, 4);
         vector.set(1, 23);
         vector.set(2, 5);
        
        //сюда будем помещать корни СЛАУ
        Vector result = new Vector(SIZE);
        
        //Создаем экземпляр такназываемого Солвера, который решит уравнение
        Zeidel slae = new Zeidel();
 
        // получаем нашу матрицу в обычном виде
        double[][] A = matrix.getSelf();
 
        // получаем вектор свободных членов в обычном виде
        double[] b = vector.getSelf();
 
        // получаем результат и записываем его в обычный массив
        double[] x = slae.solve(A, b);
        
       // переносим результат в созданый Вектор результатов
        for(int i = 0; i < x.length; i++){
            result.set(i, x[i]);
        }
        
        // расспечатываем результаты
        for(int i = 0; i<vector.getSize(); i++){
            System.out.printf("%1$.2f   ",result.get(i));
        }
        System.out.println("");  
        
        // делаем проверку на правильность b - Ax = 0
        vector.substractBy(matrix.multiplyByVector(result));
        
        // распечатываем проверку (навыходе должны быть нули)
        for(int i = 0; i<vector.getSize(); i++){
            System.out.printf("%1$.2f   ",vector.get(i));
        }
        System.out.println("");  
 
    }
    
    public static void main(String[] args) {
        Main m = new Main();
        m.run();
    }    
}
0
636 / 528 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
03.05.2012, 09:41 4
Фраза
Цитата Сообщение от aleksandy Посмотреть сообщение
Приводи код полностью.
подразумевает, как минимум, запускабельную вещь, которая демонстрирует проблему.
0
8 / 8 / 2
Регистрация: 26.04.2011
Сообщений: 87
05.05.2012, 12:43  [ТС] 5
Вот весь класс Main, специально даже закомментированное не уберал
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package nm_3;
 
import java.util.Random;
import nm_1.Matrix;
import nm_1.Vector;
 
/**
 *
 * @author Евгений Гусаров
 */
public class Main {
    
    private int SIZE = 3;
    private double EPS = 10E-3;
    
    public void run(){        
        //Random random = new Random();
        //SIZE = random.nextInt(100);
        //System.out.println("\n"+SIZE+"\n");
        
        Matrix matrix = new Matrix(SIZE, SIZE); 
        
        /*
        for(int i = 0; i < matrix.getM(); i++){
            for(int j = 0; j < matrix.getN(); j++){
                double d = random.nextFloat()*10;
                System.out.print(""+d+"    ");
                matrix.set(i, j, d);
            }
            System.out.println("");
        }
        System.out.println("");
        */
        
         matrix.set(0, 0, 3);
         matrix.set(0, 1, 2);
         matrix.set(0, 2, -1);
        
         matrix.set(1, 0, 2);
         matrix.set(1, 1, -1);
         matrix.set(1, 2, 5);
        
         matrix.set(2, 0, 1);
         matrix.set(2, 1, 7);
         matrix.set(2, 2, -1);
        
        
        Vector vector = new Vector(SIZE);
        /*
        for(int i = 0; i < matrix.getM(); i++){
            double d = random.nextFloat()*10;
            System.out.println(""+d);
            vector.set(i, d);          
        }
        System.out.println("");
        */
         vector.set(0, 4);
         vector.set(1, 23);
         vector.set(2, 5);
        
        
        Vector result = new Vector(SIZE);
        /*
        Holesky slae = new Holesky();
        double[][] A = matrix.getSelf();
        double[] b = vector.getSelf();
        double[] x = slae.solve(A, b);
        
        for(int i = 0; i < x.length; i++){
            result.set(i, x[i]);
        }
        
        for(int i = 0; i<vector.getSize(); i++){
            System.out.printf("%1$.2f   ",result.get(i));
        }
        System.out.println("");  
        
        vector.substractBy(matrix.multiplyByVector(result));
        
        for(int i = 0; i<vector.getSize(); i++){
            System.out.printf("%1$.2f   ",vector.get(i));
        }
        System.out.println("");   
        */
        
        Zeidel slae = new Zeidel();
        double[][] A = matrix.getSelf();
        double[] b = vector.getSelf();
        double[] x = slae.solve(A, b);
        
        for(int i = 0; i < x.length; i++){
            result.set(i, x[i]);
        }
        
        for(int i = 0; i<vector.getSize(); i++){
            System.out.printf("%1$.2f   ",result.get(i));
        }
        System.out.println("");  
        
        vector.substractBy(matrix.multiplyByVector(result));
        
        for(int i = 0; i<vector.getSize(); i++){
            System.out.printf("%1$.2f   ",vector.get(i));
        }
        System.out.println("");  
 
    }
    
    public static void main(String[] args) {
        Main m = new Main();
        m.run();
    }    
}
У меня запускается, но результаты NaN как и говорил ранее

Добавлено через 1 минуту
Вот класс "Метод Зейделя"
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package nm_3;
 
/**
 *
 * @author Евгений Гусаров
 */
public class Zeidel implements SLAE {
 
    double EPS = 10e-6;
 
    boolean converge(double[] xk, double[] xkp) {
        for (int i = 0; i < xk.length; i++) {
            if (Math.abs(xk[i] - xkp[i]) >= EPS) {
                return false;
            }
        }
        return true;
    }
 
    @Override
    public double[] solve(double[][] A, double[] b) {
        int size = A.length;
        double[] x = new double[size];
        double[] p = new double[size];
        do {
            for (int i = 0; i < size; i++) {
                double var = 0;
                for (int j = 0; j < size; j++) {
                    if (j != i) {
                        var += (A[i][j] * x[j]);
                    }
                }
                p[i] = x[i];
                x[i] = (b[i] - var) / A[i][i];
            }
        } while (!converge(x, p));
 
 
        return x;
    }
}
Добавлено через 37 секунд
Ну и Интерфейс на всякий случай

Java
1
2
3
4
package nm_3;
public interface SLAE {
    double[] solve(double[][] A, double[] b);
}
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
06.05.2012, 10:38 6
а матрицу и вектор мы все конечно вкурсе как ты написал.
особенно все знают что делает vector.substractBy(matrix.multiplyByVector(result));
0
8 / 8 / 2
Регистрация: 26.04.2011
Сообщений: 87
06.05.2012, 17:07  [ТС] 7
Вот класс "Matrix.java"
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
package nm_1;
 
/**
 *
 * @author Евгений Гусаров
 */
public class Matrix {
    private double[][] matrix;
    private int m; 
    private int n;
    public Matrix(int m, int n){
        this.m = m;
        this.n = n;
        matrix = new double[m][n];
    }
    
    /**
     * Присваевает значение value элементу матрицы с индексом i, j 
     * @param i строка
     * @param j столбец 
     * @param value 
     */
    public void set(int i, int j, double value){
        matrix[i][j] = value;
    }
    
    /**
     * Транспонирует матрицу
     * @return трансопированную матрицу
     */
    public Matrix transpone(){
        Matrix a = new Matrix(n, m);
        for(int i = 0; i < n ; i++){
            for(int j = 0; j < m ; j++){
                a.set(i, j, matrix[j][i]);
            }
        }     
        return a;
    }
    
    /**
     * Умножает матрицу на скалярное значение х
     * @param x множитель
     */
    public void multiplyByScalar(double x){
        for(int i = 0; i < m; i++){
            for( int j = 0; j < n; j++){
                matrix[i][j] = matrix[i][j] * x;
            }
        }
    }
    
    /**
     * Умножает матрицу на некоторый вектор v 
     * @param v множитель 
     * @return Vector вектор - результат умножения
     */
    public Vector multiplyByVector( Vector v){
        Vector vector = new Vector(m);
        double dot;
        
        for (int i = 0; i < m; i++){
            dot = 0;
            for( int j = 0; j < n; j++){
                dot = dot + matrix[i][j]*v.get(j);               
            }           
            vector.set(i, dot);
            
        }      
        return vector;
    }
    
    /**
     * Дополняет матрицу некоторой матрицей a
     * @param a слогаемое
     */
    public void completeBy( Matrix a){
        if ( (m != a.getM()) || (n != a.getN()) ) {
            throw new IllegalArgumentException("Размеры матриц должны совпадать");
        }
        for ( int i = 0; i < m; i++){
            for( int j = 0; j < n; j++){
                matrix[i][j] = matrix[i][j] + a.get(i, j);
            }
        }
    }
    
    /**
     * Умножает матрицу на некоторую матрицу a
     * @param a слогаемое
     * @return Matrix - матрица, результат умножения
     */
    public Matrix multiplyBy( Matrix a){
        if (n != a.getM()) {
            throw new IllegalArgumentException("Размеры матриц должны совпадать");
        }
        
        Matrix x = new Matrix(m,a.getN());
        for (int j = 0; j < a.getN(); j++) {
            for (int i = 0; i < m; i++) {            
                double s = 0;
                for (int k = 0; k < n; k++) {
                    s += matrix[i][k] * a.get(k,j);
                }
                x.set(i, j, s);
            }
        }
    return x;
    }
    
    /**
     * Возвращает количество строк матрицы
     * @return integer m - количество строк
     */
    public int getM(){
        return m;
    }
    
    /**
     * Возвращает количество столбцов матрицы
     * @return integer n - количество столбцов
     */
    public int getN(){
        return n;
    }
    
    /**
     * Возвращает значение элемента матрицы с индексом i, j
     * @param i строка
     * @param j столбец
     * @return значение элемента с индексом i, j
     */
    public double get(int i, int j){
        return matrix[i][j];
    }
    
    /**
     * Распечатывает матрицу
     */
    public void print(){
        for(int i = 0; i<m; i++){
            for(int j = 0; j<n; j++){
                System.out.print(String.valueOf(matrix[i][j])+" ");
            }
            System.out.println("");
        }
    }
    
    @Override
    public String toString(){
        StringBuilder s = new StringBuilder();
        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                s.append(matrix[i][j]).append(" ");
            }
            s.append("\n");
        }
        return s.toString();
    }
 
    public double[][] getSelf() {
        return matrix;
    }
}

"Vector.java"

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package nm_1;
 
/**
 *
 * @author Евгений Гусаров
 */
public class Vector{
    private double[] vector;
    
    public Vector(int size){
        this.vector = new double[size];
    }
    
    /**
     * Присваевает вектору значение х в точке index 
     * {@code Vector}.
     * 
     * @param index точка вектора.
     * @param x значение точки.
     * @exception ArrayIndexOutOfBoundsException если точка выходит за пределы 
     *            вектора.
     */
    public void set(int index, double x) throws ArrayIndexOutOfBoundsException{
        if( index > vector.length-1){
            throw new ArrayIndexOutOfBoundsException(String.valueOf(vector.length));
        }
        vector[index] = x;
    }
    
    /** 
     * Умножает вектор на скалярное значение  x.
     * @param x множитель
     */
    public void multiplyByScalar(double x){
        for(int i = 0; i < vector.length; i++){
            vector[i] = vector[i] * x;
        }
    }
    
    /**
     * Дополняет вектор некоторым вектором v (сумма векторов).
     * @param v некоторый вектор типа Vector
     * @exception IllegalArgumentException оба векторы должны иметь одинаковую 
     *            размерность
     */
    public void completeBy(Vector v){
        if (v.getSize() != vector.length){
            throw new IllegalArgumentException("Размеры векторов должны совпадать");
        }
        for(int i = 0; i < v.getSize(); i++){
            vector[i] = vector[i] + v.get(i);
        }
    }
    
     /**
     * Вычитает некий вектор v из вектора (сумма векторов).
     * @param v некоторый вектор типа Vector
     * @exception IllegalArgumentException оба векторы должны иметь одинаковую 
     *            размерность
     */
    public void substractBy(Vector v){
        if (v.getSize() != vector.length){
            throw new IllegalArgumentException("Размеры векторов должны совпадать");
        }
        for(int i = 0; i < v.getSize(); i++){
            vector[i] = vector[i] - v.get(i);
        }
    }
    
    /**
     * Умножает вектор на некоторый вектор v.
     * @param v некоторый вектор типа Vector
     * @exception IllegalArgumentException оба векторы должны иметь одинаковую 
     *            размерность
     */
    public void multiplyBy( Vector v) throws Exception{
        if (v.getSize() != vector.length){
            throw new IllegalArgumentException("Размеры векторов должны совпадать");
        }
        for(int i = 0; i < vector.length; i++){
            vector[i] = vector[i] * v.get(i);
        }
    }
    
    /**
     * Возращает значение вектора в точке index.
     * @param index точка
     * @return значение точки 
     */
    public double get(int index){
        return vector[index];
    }
 
    /**
     * Возвращает размерность вектора
     * @return количество точек
     */
    public int getSize(){
        return vector.length;
    }
    
    /**
     * Возвращает строковое представление вектора в виде
     * { a, b, c, ..., n }
     * @return строка, представляющая вектор
     */
    @Override
    public String toString(){
        StringBuilder s = new StringBuilder();
        for(int i = 0; i < vector.length; i++){
            s.append(vector[i]).append(" ");      
        }
        return s.toString();
    }
 
    public double[] getSelf() {
        return vector;
    }
}
Добавлено через 2 минуты
Цитата Сообщение от mutagen Посмотреть сообщение
а матрицу и вектор мы все конечно вкурсе как ты написал.
особенно все знают что делает vector.substractBy(matrix.multiplyByVector(result));
Однако не думаю, что проблема в них. Дело в том, что я с их помощью тестировал метод Холецкого - никаких проблем не возникло
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
06.05.2012, 18:29 8
Изначальный код метода зейделя-гаусса написан автором поста а http://cybern.ru/method-zeidelya-slau-java.html
я его адаптировал слегка для удобства

в вашем варианте была ошибка в алгоритме
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
public class Zeidel {
 
    double EPS = 10e-6;
 
    public double[] findSolution(double[][] matrix) {
        return findSolution(matrix, EPS);
    }
 
    public double[] findSolution(double[][] matrix, double eps) {
        int size = matrix.length;
        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++) {
                    // При j < i можем использовать уже посчитанные
                    // на этой итерации значения неизвестных
                    if (j < i) {
                        currentVariableValues[i] -= matrix[i][j] * currentVariableValues[j];
                    }
 
                    // При j > i используем значения с прошлой итерации
                    if (j > i) {
                        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;
        }
 
        return previousVariableValues;
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.util.Arrays;
 
public class Main {
 
    public static void main(String[] args) {
        
/*
 *        Допустим уравнение такое
 *        
 *        x + y + z = 5
 *        x + 2*y + 2*z = -3
 *        x + 2*y + 3*z = 6
 * 
 */
        Zeidel slae = new Zeidel();
        double[][] A = { { 1, 1, 1, 5 }, { 1, 2, 2, -3 }, { 1, 2, 3, 6 } };
        double[] x = slae.findSolution(A);
        for (double[] d : A) {
            System.out.println(Arrays.toString(d));
        }
        System.out.println(Arrays.toString(x));
    }
}
0
8 / 8 / 2
Регистрация: 26.04.2011
Сообщений: 87
06.05.2012, 22:10  [ТС] 9
вопрос, ну почему же все таки мое уравнение зацикливается ? =(
Java
1
double[][] A = { { 3, 2, -1, 4 }, { 2, -1, 5, 23 }, { 1, 7, -1, 5 } };
Добавлено через 7 минут
Методом Холецкого, я решение получаю, причем оно на 100% правильно, так как в решебнике приведен этот ответ
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package nm_3;
 
/**
 *
 * @author Евгений Гусаров
 */
public class Holesky implements SLAE {
    @Override
    public double[] solve(double[][] A, double[] b) {
        int i, j, p;
        int n = A.length;
        double[][] B, C;
        B = new double[n][n];
        C = new double[n][n];
 
        for (i = 0; i < n; i++) {
            B[i][0] = A[i][0];
            C[0][i] = A[0][i] / B[0][0];
            if (i != 0) {
                C[i][i] = 1;
            }
        }
 
        double Sum;
 
        for (i = 1; i < n; i++) {
            for (j = 1; j < n; j++) {
                if (j > i) {
                    Sum = 0;
                    for (p = 0; p <= i - 1; p++) {
                        Sum += (B[i][p] * C[p][j]);
                    }
                    C[i][j] = ((A[i][j] - Sum) / B[i][i]);
                }
                if (i >= j) {
                    Sum = 0;
                    for (p = 0; p <= j - 1; p++) {
                        Sum += (B[i][p] * C[p][j]);
                    }
                    B[i][j] = A[i][j] - Sum;
                }
            }
        }
 
        double[] y = new double[n];
        double[] x = new double[n];
        y[0] = b[0] / B[0][0];
 
        for (i = 1; i < n; i++) {
            Sum = 0;
            for (p = 0; p <= i - 1; p++) {
                Sum += (B[i][p] * y[p]);
            }
            y[i] = (b[i] - Sum) / B[i][i];
        }
        x[n - 1] = y[n - 1];
        for (i = n - 2; i >= 0; i--) {
            Sum = 0;
            for (j = i + 1; j < n; j++) {
                Sum += C[i][j] * x[j];
            }
            x[i] = y[i] - Sum;
        }
 
        return x;
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.util.Arrays;
 
public class Main {
 
    public static void main(String[] args) {
        Holesky slae1 = new Holesky();
        double[][] A1 = { { 3,2,-1}, {2,-1,5}, {1,7,-1} };
        double[] B1 = { 4, 23, 5 };
        double[] X1 = slae1.solve(A1, B1);
        
        for (double[] d : A1) {
            System.out.println(Arrays.toString(d));
        }
        System.out.println("\n"+Arrays.toString(X1));
    }
}
Ответ:
[3.0, 2.0, -1.0]
[2.0, -1.0, 5.0]
[1.0, 7.0, -1.0]

[2.0, 1.0, 4.0]
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
06.05.2012, 22:27 10
потому что вот этот метод не посчитает погрешность, а вылетит на первом попавшемся условии удовлетворяющем Math.abs(xk[i] - xkp[i]) >= EPS с false

Java
1
2
3
4
5
for (int i = 0; i < xk.length; i++) {
            if (Math.abs(xk[i] - xkp[i]) >= EPS) {
                return false;
            }
        }
его надо переписать вот таким образом
Java
1
2
3
4
5
6
7
boolean converge(double[] current, double[] before) {
        double precise = 0;
        for (int i = 0; i < current.length; i++) {
            precise += Math.abs(current[i] - before[i]);
        }
        return (precise < EPS);
    }
а во вторых в методе solve у вас фиг знает что творится и если вам лень прочитать алгоритм и разобраться в чём у вас проблемы, то какая у меня для этого мотивация???
0
8 / 8 / 2
Регистрация: 26.04.2011
Сообщений: 87
06.05.2012, 23:12  [ТС] 11
Цитата Сообщение от mutagen Посмотреть сообщение
а во вторых в методе solve у вас фиг знает что творится и если вам лень прочитать алгоритм и разобраться в чём у вас проблемы, то какая у меня для этого мотивация???
Простите, но вы не поняли о чем я. Я не об моем "методе" решения вел речь, а именно об уравнении.
Пример, который вы привели. Я подставил туда именно своё уравнение
double[][] A = { { 3, 2, -1, 4 }, { 2, -1, 5, 23 }, { 1, 7, -1, 5 } };
и программа зацикливается, так как условие выхода
Java
1
2
3
if (error < EPS) {
                break;
            }
никогда не выполнится. Вот меня и интересует почему. Я не халтурщик, мне не ловко просить помощи, пока я полностью не удостоверюсь в том, что решение задачи я без нее не найду.
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
07.05.2012, 00:02 12
Java
1
2
3
if (error < EPS || Double.valueOf(error).equals(Double.NaN)) {
                break;
            }
и получаем
[-1.3677622893060112E306, -3.138762789334535E307, -Infinity]

комп не умеет -бесконечность, может нет решения у такого уравнения?

а вот серия значений error перед этим
4.305792608861774E303
1.6611862725215152E305
6.408900945053653E306
Infinity
NaN
0
8 / 8 / 2
Регистрация: 26.04.2011
Сообщений: 87
07.05.2012, 00:18  [ТС] 13
тоесть, если решать это уравнение метод Зейделя, уравнение не сходится?
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
07.05.2012, 00:42 14

Не по теме:

Convergence

The convergence properties of the Gauss–Seidel method are dependent on the matrix A. Namely, the procedure is known to converge if either:

A is symmetric positive-definite, or
A is strictly or irreducibly diagonally dominant.

The Gauss–Seidel method sometimes converges even if these conditions are not satisfied.



вроде как условия сходимости не выполнены

например { { 4, -1, 1, 4 }, { 2, 6, -1, 7 }, { 1, 2, -3, 0 } }; с корнями 1.1.1 сходится

вот тут подробно про условия сходимости http://coderov.net/vma/139-ite... ethod.html
0
8 / 8 / 2
Регистрация: 26.04.2011
Сообщений: 87
07.05.2012, 08:29  [ТС] 15
Цитата Сообщение от mutagen Посмотреть сообщение
вот тут подробно про условия сходимости http://coderov.net/vma/139-ite... ethod.html
как я понял, чтобы условие сходимости метода выполнялось корни уравнения должны быть меньше или равны 1?
0
07.05.2012, 08:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.05.2012, 08:29
Помогаю со студенческими работами здесь

Метод простых итераций и метод Зейделя. Пример решения
Привет всем! Мне нужно придумать и решить систему нелинейных уравнений методом простых итераций и...

Метод итераций Якоби и метод Гаусса-Зейделя
Подскажите что-нибудь,вот у мну лабораторная: РЕШЕНИЕ СИСТЕМ ЛИНЕЙНЫХ И НЕЛИНЕЙНЫХ УРАВНЕНИЙ 1....

Метод Гаусса-Зейделя,метод Якоби, LU разложения
есть у кого то примеры решения???в Wolfram Mathematica

Метод простых итераций и метод Зейделя
Помогите пожалуйста написать в маткаде (или матлабе) метод простых итераций и метод зейделя......


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru