• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о проекте и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Решение СЛАУ методом Гаусса

FireKiller

Ученик
Почётный участник
Регистрация
21 Апр 2007
Сообщения
594
Реакции
3
Баллы
0
Решение СЛАУ методом Гаусса

Люди!!! Чтто от меня требуют во втором пункте в самом начале? Там где построения зависимости...

И вот прога:

Код:
program kkr;
uses crt;
const e=0.000001;//поскольку числа вещественные, при проверке точно не сойдется, поэтому вводим погрешность расчетов
var a:array[1..10,1..10] of real;//масив коэфф. и св. членов
    b:array[1..10] of real;//массив свободных членов
    x:array[1..10] of real;  //массив корней уравнения
    n,i,j,k:integer;z,r,g:real;
begin
clrscr;
writeln('n= ');
readln(n);
writeln('Введите коэффициенты системы и свободные члены');
for i:=1 to n do
Begin
 For j:=1 to n do
  begin
    writeln('a[',i,',',j,']= ');
    readln(a[i,j]);
  end;
    Writeln('b[',i,']= ');
    readln(b[i]);
  end;
for k:=1 to n do //прямой ход Гаусса, приведение матрицы коэффициентов к треугольному виду
     begin
       for j:=k+1 to n do
          begin
            r:=a[j,k]/a[k,k];
            for i:=k to n do
               begin
                 a[j,i]:=a[j,i]-r*a[k,i];
               end;
            b[j]:=b[j]-r*b[k];
          end;
     end;
for k:=n downto 1 do //обратный ход Гаусса, вычисление корней
     begin
       r:=0;
       for j:=k+1 to n do
         begin
           g:=a[k,j]*x[j];
           r:=r+g;
         end;
      x[k]:=(b[k]-r)/a[k,k];
     end;
writeln('Корни системы:');
for i:=1 to n do
write('x[',i,']=',x[i]:0:2,'   ');
readln;
end.
Она подходит?????
 

Вложения

  • сканирование0010.webp
    сканирование0010.webp
    106.9 KB · Просмотры: 958
  • сканирование0011.webp
    сканирование0011.webp
    122.4 KB · Просмотры: 361
Последнее редактирование:
Люди! Помогите пожалуйста!
 
Слушай, ну ты даешь!
Это получив в конце марта задание на написание курсовой объемом в добрую сотню страниц со сроком защиты в конце мая, в начале июня только о ней вспомнить? Класс...
Ну ладно.
Программа, похоже, нормальная (впрочем, алгоритм приведения к треугольному виду и решения я не проверял, но, похоже, всё путём), единственное - в разделе ввода коэффициентов системы и столбца свободных членов следует вместо оператора writeln использовать оператор write, потому что перенос строки там абсолютно ни к чему, тем более, что в теле оператора после вывода знака равенства предусмотрен отступ.
Теперь по поводу пункта 2.
Допустим, ты решил систему из пяти уравнений с пятью неизвестными, т.е. нашел значения х1, х2, х3, х4 и х5. Далее:
1. Выбираем одно из уравнений системы (пусть, например, это будет уравнение 3).
2. Выбираем два из пяти несовпадающих номеров корней (например, 2 и 5).
3. В выбранное уравнение подставляем значения ОСТАЛЬНЫХ корней, и слагаемые, содержащие эти корни, переносим в правую часть. В нашем примере исходное уравнение 3 преобразуется к виду:
A[3,2]*x2 + A[3,5]*x5 = B[3] - A[3,1]*x1 - A[3,3]*x3 - A[3,4]*x4 .
То, что находится в правой части уравнения - просто число. Обозначим его С.
4. Перенеся в правую часть слагаемое с х5 и поделив на коэффициент при х2, получаем:
x2 = C/A[3,2] - (A[3,5]/A[3,2])*x5 ,
т.е. зависимость вида x2 = f(x5). Вот ее-то и требуется построить.

Естественно, в программе должна быть предусмотрена возможность выбора номера уравнения, номеров двух корней, а так же их порядок, т.е. кто из них будет аргументом, а кто функцией.

Вот так.
 
нашёл такой курсач у второкурсника. вот прога
Код:
Program Kursovaya_rabota;

Uses crt,graph;
Const
  maxn = 10;
Type
  Data = Real;
  Matrix = Array[1..maxn, 1..maxn] of Data;
  Vector = Array[1..maxn] of Data;

{ Процедура ввода расширенной матрицы системы }

Procedure ReadSystem(n: Integer; var a,a1: Matrix; var b,b1: Vector);
Var
  i, j, r: Integer;
Begin
  r:=WhereY;
  GotoXY(2, r);
  Write('A');
  For i := 1 to n do
    Begin
      GotoXY(i*6+2, r);
      Write(i);
      GotoXY(1, r+i+1);
      Write(i:2);
    End;
  GotoXY((n+1)*6+2, r);
  Write('b');
  For i := 1 to n do 
    Begin
      For j := 1 to n do 
        Begin
          GotoXY(j * 6 + 2, r + i + 1);
          Read(a[i, j]);
        End;
      GotoXY((n + 1) * 6 + 2, r + i + 1);
      Read(b[i]);
    End;
  For i:=1 to n do
    Begin
      B1[i]:=B[i];
      For j:=1 to n do
      A1[i,j]:=A[i,j];
    End;
End;

{ Процедура вывода результатов }

Procedure WriteX(n:Integer; x:Vector);
Var
  i: Integer;
Begin
  For i := 1 to n do
  Writeln('x', i, ' = ', x[i]:8:5);
  Readln;
End;

{ Функция, реализующая метод Гаусса }

Function Gauss(n: Integer; a: Matrix; b: Vector; var x:Vector): Boolean;
Var
  i, j, k, l: Integer;
  q, m, t: Data;
Begin
  For k := 1 to n - 1 do 
    Begin
{ Ищем строку l с максимальным элементом в k-ом столбце}
      l := 0;
      m := 0;
      For i := k to n do
        If Abs(a[i, k]) > m then 
          Begin
            m := Abs(a[i, k]);
            l := i;
          End;
{ Если у всех строк от k до n элемент в k-м столбце нулевой, то система не имеет однозначного решения }
        If l = 0 then 
          Begin
            Gauss := false;
            Exit;
          End;
{ Меняем местами l-ую строку с k-ой }
        If l <> k then 
          Begin
            For j := 1 to n do 
              Begin
                t := a[k, j];
                a[k, j] := a[l, j];
                a[l, j] := t;
              End;
            t := b[k];
            b[k] := b[l];
            b[l] := t;
          End;
      For i:=k+1 to n do
        For j:=1 to n do
        If (a[k,j]=a[I,j]) and (b[k]=b[i]) then
          Begin
            Gauss:=false;
            Exit;
          End;	
{ Преобразуем матрицу }
      For i := k + 1 to n do 
        Begin
          q := a[i, k] / a[k, k];
          For j := 1 to n do
          If j = k then
          a[i, j] := 0
          else
          a[i, j] := a[i, j] - q * a[k, j];
          b[i] := b[i] - q * b[k];
	End;
    End;
{ Вычисляем решение }
  x[n] := b[n] / a[n, n];
  For i := n - 1 downto 1 do 
    Begin
      t := 0;
      For j := i+1 to n do
      t := t + a[i,j] * x[j];
      x[i] := (b[i] - t)/a[i, i];
    End;
  Gauss := true;
End;

{Построение зависимости xk от xl для каждого уравнения}

Procedure zavishit(n,k,l:integer; var a1:matrix; b1,x:vector);
Var
  i,j:integer;
  S:real;
Begin
  For i:=1 to n do
    Begin
      S:=b1[i];
      For j:=1 to n do
      If (j<>k) and (j<>l) then
        S:=s-a1[i,j]*x[j];
      Writeln('Uravnenie',I,' zavishit X',k,' ,X',l,' : ',a1[I,k]:5:3,' *X',k,' +',a1[I,l]:5:3,' *X',l,' = ',s:5:3);
    End;
End;

{Построение графика зависимости хк от хl для каждого уравнения}

Procedure graphik(n,k,l:integer; var a1:matrix; b1,x:vector);
Var
  i,j,gd,gm,xk1,xk2,xl1,xl2:integer;
  S:real;
Begin
  For i:=1 to n do
    Begin
      S:=b1[i];
      For j:=1 to n do
      If (j<>k) and (j<>l) then
        S:=s-a1[i,j]*x[j];
      Writeln('Graphik zavisimosti X',k,' ot X',l,' dlya uravneniya ',i);
      Readln;
      Clrscr;
      {Построение оси 0х, 0у}
      Gd:=detect;
      Initgraph(gd,gm,'');
      Setbkcolor(black);
      Setcolor(blue);
        Begin
          Line(100,300,400,300);
          Moveto(400,300); Moverel(-10,10);
          Linerel(10,-10); Moverel(-10,-10); Linerel (10,10);
        End; 
        Begin
          Line(200,400,200,100);
          Moveto(200,100); Moverel(-10,10);
          Linerel(10,-10); Moverel(10,10); Linerel (-10,-10);
        End; 
      {Построение линий}
      Xk1:=0; xl1:=round((s-a1[I,k]*xk1)/a1[I,l]);
      Xk2:=100; xl2:=round((s-a1[I,k]*xk2)/a1[I,l]);
      Setcolor(white);
      Line(xk1+200,300-xl1,xk2+200,300-xl2);
      Readln;
    End;
End;

{Главная программа}

Var
  n, I,k,l,f: Integer;
  a,a1: Matrix ;
  b, b1,x: Vector;
Begin
Repeat
ClrScr;
  Writeln ('Federalnoe agenstvo po obrazovaniu');
  Writeln;
  Writeln ('Tulskiy gosudarstvenniy universitet');
  Writeln;
  Writeln ('KAFEDRA RADIOELEKTRONIKI');
  Writeln; Writeln; Writeln;
  Writeln ('Kursovaya rabota');
  Writeln;
  Writeln('RESHENIE SISTEMI LINEYNIH ALGEBRAICHESKIH URAVNENIY METODOM GAUSSA');
  Writeln;
  Writeln ('Razrabotal student gr. 120691 Zhurin Dmitry Vladimirovich.');
  Writeln;
  Writeln ('Tula 2010 g.');
  Writeln;Writeln;
  Writeln ('___________________________________________');
  Writeln;
  Writeln ('Dlya prodolzhenia raboti nazhmite klavishu Enter');
  Readln;
  Clrscr;
  Writeln('Progamma reshenia sistemi lineynih algebraicheskih uravneniy metodom Gaussa');
  Writeln;
  Repeat
  Writeln('Vvedite poryadok matritsi sistemi (max. 10)');
  Write('n=');
  Read(n);
  Until (n >= 2) and (n <= maxn);
  Writeln;
  Writeln('Vvedite rashirennuyu matritsu sistemi');
  ReadSystem(n, a,a1, b,b1);
  Writeln;
  If Gauss(n, a, b, x) then
    Begin
      Writeln('Rezultat vichisleniy po metodu Gaussa');
      WriteX(n, x);
      Writeln ('Dlya prodolzhenia raboti nazhmite klavishu Enter');
      Readln;
      Clrscr;
      Repeat
        Writeln('Vvedite poryadok k,l peremennih Xk, Xl');
        Write('k=');
        Read(k);
        Write('l=');
        Read(l);
      Until (k>=1) and (k<=n) and (l>=1) and (l<=n) and (k<>l);
      Zavishit(n,k,l,a1,b1,x);
      Readln;
      Writeln ('Dlya prodolzhenia raboti nazhmite klavishu Enter');
      Readln;
      Clrscr;
      Graphik(n,k,l,a1,b1,x);
      Readln;
      Writeln ('Dlya prodolzhenia raboti nazhmite klavishu Enter');
      Readln;
    End
  else
  Writeln('Dannuyu sistemu nevozmojno reshit metodom Gaussa');
  Readln;
  Writeln('Hotite povtorit? (yes-1 /no-0)');
  Readln(f);
  Until f=0;
End.

Он сказал, что там всё работает и график тоже. а у меня нет! на скринах видна работа программы и контрольный пример. а график она не строит! ну в чём дело?! модуль граф у меня работает - запускал проги с графикой... помогите плиз
 

Вложения

  • 1.webp
    1.webp
    23.7 KB · Просмотры: 872
  • 2.webp
    2.webp
    22.3 KB · Просмотры: 1,224
  • 3.webp
    3.webp
    7.5 KB · Просмотры: 364
Он сказал, что там всё работает и график тоже. а у меня нет! на скринах видна работа программы и контрольный пример. а график она не строит! ну в чём дело?! модуль граф у меня работает - запускал проги с графикой... помогите плиз
"Enter" нажми!
 
Ну я же не тупой! Там даже по проге видно:

Код:
      Writeln('Graphik zavisimosti X',k,' ot X',l,' dlya uravneniya ',i);
      Readln;

Нажимаю, у меня поскакивает на миллисекунду экран (по-моему я видел там error) и выходит из проги.
 
Ну я же не тупой! Там даже по проге видно:

Код:
      Writeln('Graphik zavisimosti X',k,' ot X',l,' dlya uravneniya ',i);
      Readln;
Нажимаю, у меня поскакивает на миллисекунду экран (по-моему я видел там error) и выходит из проги.
Тогда еще совет - убери "var" из перечня аргументов процедуры graphik. Там же все параметры - входные!
 
Код:
{Построение графика зависимости хк от хl для каждого уравнения}

Procedure graphik(n,k,l:integer; a1:matrix; b1,x:vector);
Var
  i,j,gd,gm,xk1,xk2,xl1,xl2:integer;
  S:real;
так? ничего не изменилось.
 
Назад
Сверху