Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 07.10.2018
Сообщений: 17
1

Метод Гаусса

07.10.2018, 06:05. Показов 4143. Ответов 4

Выдает ошибку
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3

и не выдает матрицу , а только 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
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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
package operationofthesoftware;
import java.util.Scanner;
 
 
public class NewClass {
 
      public static float determinant_Gauss (int n, float[][] a, float det) {
          int k,i,j;
      for (k=0;k<n;k++){
     for (i=k+1;i<n;i++){
      for (j=k+1;j<n;j++){
        a[i][j]=a[i][j]-a[i][k] * a[k][j] / a[k][k];
        det=a[0][0];
        }
     }
      }
      for (i=1;i<n;i++){
       det=det*a[i][i];
      }
         return det;
    
}
 
 public static float[][] invers_Gauss(int n, float[][] a,float[][] add, float [][] invert)
    {
        int k,j;
        float det=0;
       determinant_Gauss (n,  a,  det) ;
        transp(a,n,add); // {транспонируем матрицу}
peresch(n,add,det,invert);  //{считаем дополнения}
 
for (k=0;k<n;k++)
for (j=0;j<n;j++)
invert[k][j]=invert[k][j]/det;// {создаем обратную матрицу}
          return invert;
 
}
 
 static void transp( float[][] a, int n, float[][] at){
int k,j;
for (k= 0;k<n;k++){
for (j=0;j< n;j++){
at[k][j]=a[j][k];
}
}
}
 
static void peresch(int n, float [][] b, float det, float[][] e){
int i,m,k,j;
   float z;
    float[][] d,c;
    d= new float [n][n];
    c= new float [n][n];
for (i=0;i<n;i++)
for (m=0;m<n;m++)
{
     for (j= 0;j<n;j++)//перестановка строк}
     {
         z=b[i][j];
         
         for (k=0;k>2;k--)
         d[k][j]=b[k-1][j];
         for (k=i+1;k<n;k++)
         d[k][j]=b[k][j];
         d[1][j]=z;
     }
     for (k=0;k<n;k++)// {перестановка столбцов}
     {
         z=d[k][m];
         for (j=m;j> 2;j--)
         c[k][j]=d[k][j-1];
         for (j=m+1;j<n;j++)
         c[k][j]=d[k][j];
         c[k][1]=z;
       ;
     determinant_Gauss(n,c,det);//{вычисление определителей}
     e[i][m]=det*znak1(i,m);//{вычисление дополнений}
     }
}
}
 
static int znak1(int i, int m)//{изменение знака при перестановке строк при нахождении дополнений}
{
    int  znak1;
if ((i+m)% 2==0){
    znak1 = 1;
}
else 
{znak1=-1;
}
          return znak1;
}
 
 
 
    public static float[] Gauss(int n, float [][] a, float [] b , float [] x ){
       int k,i,j; 
 
 
    for (i=0;i<n-1;i++)
    {
      for (k=i+1;k<n;k++) 
      {
          float del = a[k][i] / a[i][i]; 
         for (j=0;j<n;j++) 
         { a[k][j]= a[k][j] - a[i][j] * del;}
             b[k]= b[k] - b[i] * del;
      }
    }
        
  //ОБРАТНЫЙ ХОД
    for (i=n;i>0;i--)
    {
      for (j= i+1;j<n;j++){
          b[i]= b[i] - a[i][j] * x[j];}
          x[i]= b[i] / a[i][i];
    }
     return x;    
    }
 
    public static void main (String [] args){
    //Вычисление определителя матрицы методом Гаусса
        
        float det = 0;  // определитель матрицы
    int i,j;        // рабочие переменные
        Scanner in = new Scanner(System.in);
        System.out.println("Введите размер матрицы: ");
        //int  n=in.nextInt();
       int  n=3;
        float [][] a;
        a= new float[n][n];
        float [][] add;
        add= new float[n][n];
        float [][] invert;
        invert= new float[n][n];
        float [] b; //  матрица свободных членов
        b = new float[n];
        float [] x; //  вектор решения (вектор неизвестных)
        x= new float [n];
 
      /*  System.out.println("Введите исходную матрицу: ");
        for ( i = 0; i < n; i++) 
        {
         System.out.println("Строка "+ (i+1) +"("+n+" чисел)");
         for (j = 0; j < n; j++) 
         a[i][j]=in.nextFloat();
        }
             System.out.println();
             
             for (i = 0; i < n; i++) {
                    // цикл по второй размерности
                    for (j = 0; j < n; j++) {
                        //вывод элементов массива 
                    System.out.print(a[i][j] + "\t");
                    }
                    System.out.println();
                }
             
             System.out.println("Введите вектор свободных членов: ");
            for ( i = 0; i < n; i++) {
                System.out.println("b["+i+"]=");  
                b[i]=in.nextFloat();
            }*/
      a[0][0]=3;
      a[0][1]=3;
      a[0][2]=3;
      a[1][0]=2;
      a[1][1]=4;
      a[1][2]=4;
      a[2][0]=1;
      a[2][1]=3;
      a[2][2]=6;
      
      b[0]=1;
       b[1]=1;
        b[2]=1;
      
         float det1 = (float) determinant_Gauss(n, a, det); //вычисление определителя методом гаусса
         
        
      
           System.out.println("Значение определителя(по методу Гаусса)=" + det1);
           System.out.println("Обратная матрица методом Гаусса=" );
           invers_Gauss(n, a,add, invert);//вычисление обратной матрицы методом гаусса
            for (i = 0; i < n; i++) {
                    // цикл по второй размерности
                    for (j = 0; j < n; j++) {
                        //вывод элементов массива 
                    System.out.print(invert[i][j] + "\t");
                    }
                    System.out.println();
                }
    
 
 
        System.out.println("Решение СЛАУ методом Гаусса=" );
       x=Gauss(n, a, b,x);//Решение системы обыкновенных алгебраических уравнений методом Гаусса
          for (i = 0; i < n; i++) {
                        //вывод элементов массива 
                    System.out.print(x[i] + "\t");
                    }
                  
            
      
        
        //Вычисление обратной матрицы методом Гаусса
        //Решение системы обыкновенных алгебраических уравнений методом Гаусса
}
}


Код переводил с паскаля вот этот:
Pascal
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
165
166
167
168
169
170
171
172
uses crt;
const t=0.000001;{ограничиваем числа, близкие к нолю, на них делить}
type Tmatr=array[1..3,1..3]of real;
 
procedure Per(n,k:integer;a:Tmatr;var p:integer);{перестановка строк с макс. главным элементом}
var z:real;
    j,i:integer;
begin
z:=abs(a[k,k]);
i:=k;
p:=0;
for j:=k+1 to n do
  begin
    if abs(a[j,k])>z then
      begin
        z:=abs(a[j,k]);
        i:=j;
        p:=p+1;
      end;
  end;
if i>k then
for j:=k to n do
   begin
     z:=a[i,j];
     a[i,j]:=a[k,j];
     a[k,j]:=z;
   end;
end;
function znak(p:integer):integer;{изменение знака при перестановке строк матрицы}
begin
if p mod 2=0 then
znak:=1 else znak:=-1;
end;
function znak1(i,m:integer):integer;{изменение знака при перестановке строк при нахождении дополнений}
begin
if (i+m) mod 2=0 then
znak1:=1 else znak1:=-1;
end;
procedure opr(n,p:integer;a:Tmatr;var det:real;var f:byte);{нахождение определителя матрицы}
var k,i,j:integer;
    r:real;
begin
det:=1.0;f:=0;
for k:=1 to n do
   begin
     if a[k,k]=0 then per(k,n,a,p);
     det:=znak(p)*det*a[k,k];
     if abs(det)<t then
      begin
       f:=1;
       writeln('Обратной матрицы нет!');
       readln;
       exit;
      end;
     for j:=k+1 to n do
        begin
         r:=a[j,k]/a[k,k];
         for i:=k to n do
         a[j,i]:=a[j,i]-r*a[k,i];
        end;
   end;
end;
procedure opr1(n,p:integer;d:Tmatr;var det1:real);{нахождение определений для дополнений}
var k,i,j:integer;
    r:real;
begin
det1:=1.0;
for k:=2 to n do
   begin
     if d[k,k]=0 then per(n,k,d,p);
     det1:=znak(p)*det1*d[k,k];
     for j:=k+1 to n do
       begin
         r:=d[j,k]/d[k,k];
         for i:=k to n do
         d[j,i]:=d[j,i]-r*d[k,i];
       end;
   end;
end;
Procedure Peresch(n,p:integer;var b:Tmatr;det1:real;var e:Tmatr);{вычисление дополнений}
var i,m,k,j:integer;
    z:real;
    d,c:Tmatr;
begin
for i:=1 to n do
for m:=1 to n do
   begin
     for j:= 1 to n do {перестановка строк}
       begin
         z:=b[i,j];
         for k:=i downto 2 do
         d[k,j]:=b[k-1,j];
         for k:=i+1 to n do
         d[k,j]:=b[k,j];
         d[1,j]:=z;
       end;
     for k:=1 to n do {перестановка столбцов}
       begin
         z:=d[k,m];
         for j:=m downto 2 do
         c[k,j]:=d[k,j-1];
         for j:=m+1 to n do
         c[k,j]:=d[k,j];
         c[k,1]:=z;
       end;
     Opr1(n,p,c,det1);{вычисление определителей}
     e[i,m]:=det1*znak1(i,m);{вычисление дополнений}
   end;
end;
procedure Transp(a:Tmatr; n:integer;var at:Tmatr);{транспонирование матрицы}
var k,j:integer;
begin
for k:= 1 to n do
for j:=1 to n do
at[k,j]:=a[j,k];
end;
Procedure Proverka(a,b:Tmatr; n:integer;var c:Tmatr);{проверка - умножение прямой матрицы на обратную}
var k,j,i:integer;
    z:real;
begin
for k:=1 to n do
for j:=1 to n do
  begin
    c[k,j]:=0;
    for i:=1 to n do
      begin
        z:=a[i,j]*b[k,i];
        c[k,j]:=c[k,j]+z;
      end;
   end;
end;
procedure Vyvod(var a:Tmatr; n:integer);{вывод матриц на экран}
var k,j:integer;
begin
for k:=1 to n do
  begin
    for j:=1 to n do
    write(a[k,j]:7:2);
    writeln;
  end;
end;
var n,k,j,i,p:integer;{n-размер матрицы,k-счетчик по строкам,j-счетчик по столбцам,p-счетчик перестановок}
    a,at,b,c,e:Tmatr;{a-исходная, at-транспонированная, b-матрица дополнений, e-обратная, с-проверка}
    det,det1:real;{det-определитель исходной матрицы,det1-определители-дополнения}
    f:byte;{признак несуществования обратной матрицы}
begin
clrscr;
n:=3;
for k:=1 to n do
for j:=1 to n do
   begin
    write('a[',k,',',j,']=');
    readln(a[k,j]);
   end;
clrscr;
writeln('Исходная матрица:');
Vyvod(a,n);
Opr(n,p,a,det,f); {vychislenie opredelitelja}{считаем определитель}
if f=1 then exit;
writeln(' определитель:',det );
Transp(a,n,b);  {транспонируем матрицу}
Peresch(n,p,b,det1,e);  {считаем дополнения}
writeln('Obratnaja matrica:');
for k:=1 to n do
for j:=1 to n do
e[k,j]:=e[k,j]/det; {создаем обратную матрицу}
Vyvod(e,n);
writeln('Proverka:');
Proverka(a,e,n,c);  {делаем проверку}
Vyvod(c,n);
readln
end.
В нем все работает и правильно выдает , а на джава нет
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.10.2018, 06:05
Ответы с готовыми решениями:

Метод Гаусса
Помогите разобраться Совсем не могу сделать Никак не получается Видела похожие темы на форумах,...

Метод Гаусса
Нашел блок-схему метода Гаусса. Делаю на Java. Приложил картинку к посту. Вопрос : что это за...

Метод Жордана-Гаусса с выводом каждого шага
Нужна программа на языке Java, которая будет решать систему линейных уравнений методом...

Метод гаусса с выбором главного элемента по всей матрице
Собственно реализовываю данный метод, и наткнулся на один занимательный момент: в куске кода из 2...

__________________

Записывайтесь на профессиональные курсы Java-разработчиков
Обучение в Java Mentor с оплатой после трудоустройства
4
Супер-модератор
Эксперт PythonЭксперт Java
7489 / 4083 / 1520
Регистрация: 21.10.2017
Сообщений: 11,556
07.10.2018, 07:12 2
Пройдись дебаггером, посмотри почему вылетает за предел массива.
https://www.cyberforum.ru/java/thread2250765.html
0
0 / 0 / 0
Регистрация: 07.10.2018
Сообщений: 17
07.10.2018, 07:20  [ТС] 3
Хорошо, но почему программа на джаве выдает матрицу с элементами NaN , а не с числами
0
Супер-модератор
Эксперт PythonЭксперт Java
7489 / 4083 / 1520
Регистрация: 21.10.2017
Сообщений: 11,556
07.10.2018, 07:49 4
Как минимум потому, что вот здесь
Цитата Сообщение от Elephant212 Посмотреть сообщение
invers_Gauss(n, a,add, invert);
половина массивов пустые.
Дебаггер это, кстати, тоже показывает...
0
0 / 0 / 0
Регистрация: 07.10.2018
Сообщений: 17
07.10.2018, 07:55  [ТС] 5
ааааааа, ну блин)
А вот как сделать чтобы массив передавался через метод
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.10.2018, 07:55

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Метод Гаусса для решения системы уравнений. Перевести с Pascal
Прошу помощи. Нашёл код в интернете, попробовал написать его на java. Но дело в том, что массивы в...

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

Переделать программу, использующую метод Гаусса в метод Барейса
Всем ДВС! подскажите пожалуйста, как переделать эту программу использующую метод Гаусса в метод...

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.