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

Метод Гаусса

07.10.2018, 06:05. Показов 8727. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.10.2018, 06:05
Ответы с готовыми решениями:

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

Метод Гаусса
Нашел блок-схему метода Гаусса. Делаю на Java. Приложил картинку к посту. Вопрос : что это за переменная &quot;c&quot;? Где ее брать? И еще...

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

4
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
07.10.2018, 07:12
Пройдись дебаггером, посмотри почему вылетает за предел массива.
https://www.cyberforum.ru/java/thread2250765.html
0
0 / 0 / 0
Регистрация: 07.10.2018
Сообщений: 17
07.10.2018, 07:20  [ТС]
Хорошо, но почему программа на джаве выдает матрицу с элементами NaN , а не с числами
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
07.10.2018, 07:49
Как минимум потому, что вот здесь
Цитата Сообщение от Elephant212 Посмотреть сообщение
invers_Gauss(n, a,add, invert);
половина массивов пустые.
Дебаггер это, кстати, тоже показывает...
0
0 / 0 / 0
Регистрация: 07.10.2018
Сообщений: 17
07.10.2018, 07:55  [ТС]
ааааааа, ну блин)
А вот как сделать чтобы массив передавался через метод
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.10.2018, 07:55
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru