Тема: Вирішення системи лінійних рівнянь методом Гауса

Всіх вітаю, намагаюсь написати програму для вирішення СЛР методом Гауса. Почав із найзагальнішого випадку
3 рівняння 3 змінні 3 відповіді
Все це намагаюсь обробити одним масивом і парою змінних.
Вдалось змінити рядки місцями якщо 1 член 1 ряду = 0,
Вдалося звести до нуля 1 член 2 ряду.
Але по аналогії код для 1 члена 3 ряду і для 2 члена 3 ряду не працює належним чином.
Ось те, що уже написав.

#include <stdio.h>
#include <conio.h>
#include <math.h>

main()
{
    float a;
    int c, i;
    float matrix[15];

    a = i = 0;
    
    printf("Metod Gausa dlya rishennya System Liniynih rivnan' vitae vas!\n");
    printf("\nVvedit zna4ennya chleniv\n");

    for(i = 0; i < 12; i++)
        scanf("%22e", &matrix[i]);

//Step 1
/* Перевіряємо перший член на "0", якщо true - міняємо 2-ий і 1-ий рядок місцями*/
    if(matrix[0] == 0){
        for(i = 0; i < 4; i++){
            matrix[i+12] = matrix[i];
        }
        for(i = 4; i < 8; i++){
            matrix[i-4] = matrix[i];
        }
        for(i = 4; i < 8; i++){
            matrix[i] = matrix[i+8];
        }
    }
    
    printf("\nStep 1\n");
    for(i=0; i<4; i++)
        printf("%2.3f   ",matrix[i]);
        printf("\n");
    for(i=4; i<8; i++)
        printf("%2.3f   ",matrix[i]);
        printf("\n");
    for(i=8; i<12; i++)
        printf("%2.3f   ",matrix[i]);
        printf("\n");
    for(i=12; i<16; i++)
        printf("%2.3f   ",matrix[i]);
        printf("\n");
//Step 2
/* Перевіряємо перший член на "0", якщо true - міняємо 3-ий і 1-ий рядок місцями*/
    if(matrix[0] == 0){
        for(i = 0; i < 4; i++){
            matrix[i+12] = matrix[i];
        }
        for(i = 8; i < 12; i++){
            matrix[i-8] = matrix[i];
        }
        for(i = 8; i < 12; i++){
            matrix[i] = matrix[i+4];
        }
    }
    printf("\nStep 2\n");
    for(i=0; i<4; i++)
        printf("%2.3f   ",matrix[i]);
        printf("\n");
    for(i=4; i<8; i++)
        printf("%2.3f   ",matrix[i]);
        printf("\n");
    for(i=8; i<12; i++)
        printf("%2.3f   ",matrix[i]);
        printf("\n");
    for(i=12; i<16; i++)
        printf("%2.3f   ",matrix[i]);
        printf("\n");
//Step 3
// Робимо із першого члена другого рядка нуль
    if(matrix[4] != 0){
        a = - (double) matrix[0] / matrix[4];
        for(i = 4; i < 8; i++)
            matrix[i] = matrix[i] * a + matrix[i-4];
    }

    printf("\nStep 3\n");
    for(i=0; i<4; i++)
        printf("%2.3f   ",matrix[i]);
        printf("\n");
    for(i=4; i<8; i++)
        printf("%2.3f   ",matrix[i]);
        printf("\n");
    for(i=8; i<12; i++)
        printf("%2.3f   ",matrix[i]);
        printf("\n");
    for(i=12; i<16; i++)
        printf("%2.3f   ",matrix[i]);
        printf("\n");

    //if(matrix[4] != 0)
        //printf("ERROR");
//Step 4
// Робимо із першого члена третього рядка нуль
    
    if(matrix[4] == 0 && matrix[8] != 0){
        a = - (double) matrix[0] / matrix[8];
        for(i = 8; i < 12; i++)
            matrix[i] = matrix[i] * a + matrix[i-8];
    }

printf("\nStep 4\n");
    for(i=0; i<4; i++)
        printf("%2.3f   ",matrix[i]);
        printf("\n");
    for(i=4; i<8; i++)
        printf("%2.3f   ",matrix[i]);
        printf("\n");
    for(i=8; i<12; i++)
        printf("%2.3f   ",matrix[i]);
        printf("\n");
    for(i=12; i<16; i++)
        printf("%2.3f   ",matrix[i]);
        printf("\n");
// Step 5
// Робимо із другого члена третього рядка нуль
    if(matrix[8] == 0 && matrix[4] == 0 && matrix[9] != 0){
        a = - (double) matrix[5] / matrix[9];
        for(i = 8; i < 12; i++)
            matrix[i] = matrix[i] * a + matrix[i-4];
    } else if(matrix[9] != 0)
        printf("a32 = 0");
printf("\nStep 5\n");
    for(i=0; i<4; i++)
        printf("%2.3f   ",matrix[i]);
        printf("\n");
    for(i=4; i<8; i++)
        printf("%2.3f   ",matrix[i]);
        printf("\n");
    for(i=8; i<12; i++)
        printf("%2.3f   ",matrix[i]);
        printf("\n");
    for(i=12; i<16; i++)
        printf("%2.3f   ",matrix[i]);
        printf("\n");


    return 0;
}

Які ідеї?

Білий Лунь

2

Re: Вирішення системи лінійних рівнянь методом Гауса

Форумчани! Допоможіть будь-ласка, мені скоро здавати програму, а я не можу розібратися із цим шматком коду:

// Step 5
// Робимо із другого члена третього рядка нуль
if(matrix[8] == 0 && matrix[4] == 0 && matrix[9] != 0){
a = - (double) matrix[5] / matrix[9];
for(i = 8; i < 12; i++)
matrix[i] = matrix[i] * a + matrix[i-4];

Я продублював тему тут, але там теж мовчать.

Білий Лунь

3

Re: Вирішення системи лінійних рівнянь методом Гауса

Зробіть масив двовимірним, розбийте код на функції (їх має бути трохи менше десятка). Після цього можливо хтось захоче в ньому покопатися.

4 Востаннє редагувалося Ярослав (24.10.2012 07:23:00)

Re: Вирішення системи лінійних рівнянь методом Гауса

На тому форумі мені допоміг b49P23TIvg.
Проблема було в тому, що під матрицю потрібно було виділити пам'ять під 16 членів а не під 15

    float matrix[16];

І не всюди виконувалась умова if, коли мова йшла про нуль, адже 0 і 0.0 - відмінні значення між собою.
Довелось застосувати fabs() для того, щоб перетворити -0.0 на 0.0
А по суті програма коректна. Можна іще далі допрацьовувати.

/* $ cc -Wall -g c.c -o c */
/* $ echo 1 1 2 3 4 5 6 7 8 9 10 11 | ./c   */

/*----------------------------------------//
//--------Code by Yar & b49P23TIvg--------//
//----------------------------------------*/

#include<stdio.h>
#include<math.h>

void display(char*title,float*a,int rows,int cols) {
    int i,j;
    
    printf("\n%s\n",title);
    for(j=0; j<rows; ++j){
        for(i=0; i<cols; i++)
        printf("%2.3f ",a[j*cols+i]);
        putchar('\n');
    }
}

int main(){
    float a, x, y, z;
    int i;
    float matrix[16];
    
    a = i = 0;

    printf("Gauss Elimination Method to Solve Linear Equations\n");
        printf("ax + by + cz = i\n");
        printf("1    2    3    4\n");
        printf("ax + by + cz = j\n");
        printf("5    6    7    8\n");
        printf("ax + by + cz = k\n");
        printf("9    10   11   12");
    printf("\nInput:\n");
    for(i = 0; i < 12; i++)
        scanf("%3e", matrix+i);

//Step 1
/* Checking [0] = 0, if true - replace 1 and 2 row*/
    if(matrix[0] == 0) {
        for(i = 0; i < 4; i++)
            matrix[i+12] = matrix[i];
        for(i = 4; i < 8; i++)
            matrix[i-4] = matrix[i];
        for(i = 4; i < 8; i++)
            matrix[i] = matrix[i+8];
    }
    display("step 1, swap rows to put non-zero at top left",matrix,4,4);

//Step 2
/* Checking [0] = 0, if true - replace 1 and 3 row*/
    if(matrix[0] == 0) {
        for(i = 0; i < 4; i++)
            matrix[i+12] = matrix[i];
        for(i = 8; i < 12; i++)
            matrix[i-8] = matrix[i];
        for(i = 8; i < 12; i++)
            matrix[i] = matrix[i+4];
    }
    display("step 2, swap rows to put non-zero at top left",matrix,4,4);

//Step 3
// Lead down [4] to 0
    if(matrix[4] != 0){
        a = - (double) matrix[0] / matrix[4];
        for(i = 4; i < 8; i++)
            matrix[i] = matrix[i] * a + matrix[i-4];
            matrix[4] = fabs(matrix[4]);
    }
    display("step 3, put a 0 in the first column of the second row",matrix,4,4);

//Step 4
// Lead down [8] to 0
    if(matrix[8] != 0){
        a = - (double) matrix[0] / matrix[8];
        for(i = 8; i < 12; i++)
            matrix[i] = matrix[i] * a + matrix[i-8];
        matrix[8] = fabs(matrix[8]);
    }
    display("step 4, combine rows 0 and 2 to stick a 0 at first column of last row",matrix,4,4);

// Step 5
// Lead down [9] to 0
    if (matrix[9] != 0) {
        a = - (double) matrix[5] / matrix[9];
        for(i = 9; i < 12; i++)
            matrix[i] = matrix[i] * a + matrix[i-4];
        matrix[9] = fabs(matrix[9]);
    } else if(matrix[9] != 0)
        printf("a32 = 0");
    display("step 5, zero the final cell of the lower triangle (excluding the diagonal)",matrix,4,4);

    z = matrix[11] / matrix[10];
    y = (matrix[7] - (matrix[6] * z)) / matrix[5];
    x = (matrix[3] - (matrix[1] * y) - (matrix[2] * z)) / matrix[0];

    printf("\nYour answers are:\n");
    printf("x = %.3f\n", x);
    printf("y = %.3f\n", y);
    printf("z = %.3f\n", z);
    printf("Thanks for using YaR & b49P23TIvg soft\n");
    return 0;
}

Після цього можливо хтось захоче в ньому покопатися.

А чому не можна просто спробувати допомогти? Тим паче, що для рівня тутешніх програмістів - це доволі простий код.

Білий Лунь

5 Востаннє редагувалося miroslav.chandler (24.10.2012 09:13:27)

Re: Вирішення системи лінійних рівнянь методом Гауса

А чому не можна просто спробувати допомогти? Тим паче, що для рівня тутешніх програмістів - це доволі простий код.

Прийідть в компанію міліонерів і скажи, шоб дали вам бентлі, бо для рівня тутешніх зарплат, бентлі коштує вобше фігню :)
Тут на безкоштовній основі допомагають і когось звинувачувати шо не можуть допомогти - не комільфо.
Пардон камради. Утрєнній батхерт.

pew pew :D
Блоґ
Подякували: d4rkc10ud1

6

Re: Вирішення системи лінійних рівнянь методом Гауса

Ваш приклад не відповідає ситуації.

Я нікого не звинувачував.

Білий Лунь
Подякували: V-bistrik1

7

Re: Вирішення системи лінійних рівнянь методом Гауса

а якщо потрібна матриця вигляду m на n ?

8 Востаннє редагувалося quez (08.07.2014 12:06:02)

Re: Вирішення системи лінійних рівнянь методом Гауса

Якщо m /= n, то застосовувати метод Гауса немає сенсу.

МАКЕ ЦКЯАІИЕ БЯЕАТ АБАІИ

9

Re: Вирішення системи лінійних рівнянь методом Гауса

Тоді доводиться самому думати.

10

Re: Вирішення системи лінійних рівнянь методом Гауса

ой вибачаюсь я мав на увазі n на n

11

Re: Вирішення системи лінійних рівнянь методом Гауса

Від цього ніц в моїй відповіді не зміниться.

12

Re: Вирішення системи лінійних рівнянь методом Гауса

Тоді можна повиправляти константи на змінні. Якщо вам дуже скучно - займіться, якщо ж просто треба код - буде простіше знайти.

МАКЕ ЦКЯАІИЕ БЯЕАТ АБАІИ

13

Re: Вирішення системи лінійних рівнянь методом Гауса

Дякую! Я і вирішив тут пошукати.

14

Re: Вирішення системи лінійних рівнянь методом Гауса

quez написав:

Якщо m /= n, то застосовувати метод Гауса немає сенсу.

m==n чи m!=n - по великому рахунку немає ніякої різниці.
Можливі три варіанти:
1) розв'язок єдиний;
2) розв'язків безліч;
3) розв'язків немає.

Подякували: koala1

15

Re: Вирішення системи лінійних рівнянь методом Гауса

yooll написав:
quez написав:

Якщо m /= n, то застосовувати метод Гауса немає сенсу.

m==n чи m!=n - по великому рахунку немає ніякої різниці.
Можливі три варіанти:
1) розв'язок єдиний;
2) розв'язків безліч;
3) розв'язків немає.

Сенсу в обчисленні немає все одно.

МАКЕ ЦКЯАІИЕ БЯЕАТ АБАІИ

16

Re: Вирішення системи лінійних рівнянь методом Гауса

Вибачаюсь, таки є сенс. Треба згадувати потрохи "лінійку".

МАКЕ ЦКЯАІИЕ БЯЕАТ АБАІИ

17

Re: Вирішення системи лінійних рівнянь методом Гауса

Я за допомогою Exsel колись зробив це Крамер Гаус і там ще є 1 спосіб можиш скачать тут -> https://yadi.sk/i/iMy1hxTPWBqKR