Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.10.2011, 15:27   #1
Демик
Форумчанин
 
Аватар для Демик
 
Регистрация: 30.01.2011
Сообщений: 231
По умолчанию Метод Гаусса.

Здравствуйте, такой вопрос. Что бы решить СЛАУ методом Гаусса, сколько должно быть массивов, для системы уравнений 4 на 5 ?
Злостный анимешнег =^.^=
Демик вне форума Ответить с цитированием
Старый 17.10.2011, 16:16   #2
_Alerter_
Пользователь
 
Регистрация: 25.05.2011
Сообщений: 89
По умолчанию

Один двумерный 4 на 5 либо один двумерный 4 на 4, где хранятся коэффициенты при х, и один одномерный, где хранится правая часть уравнений
_Alerter_ вне форума Ответить с цитированием
Старый 17.10.2011, 17:35   #3
Демик
Форумчанин
 
Аватар для Демик
 
Регистрация: 30.01.2011
Сообщений: 231
По умолчанию

Цитата:
Сообщение от _Alerter_ Посмотреть сообщение
Один двумерный 4 на 5 либо один двумерный 4 на 4, где хранятся коэффициенты при х, и один одномерный, где хранится правая часть уравнений
А куда записывать результаты вычислений? Нам ведь иногда нужны старые значения.
Злостный анимешнег =^.^=
Демик вне форума Ответить с цитированием
Старый 17.10.2011, 18:01   #4
_Alerter_
Пользователь
 
Регистрация: 25.05.2011
Сообщений: 89
По умолчанию

Тогда сделать копию массива исходных данных и массив неизвестных
_Alerter_ вне форума Ответить с цитированием
Старый 18.10.2011, 00:03   #5
Демик
Форумчанин
 
Аватар для Демик
 
Регистрация: 30.01.2011
Сообщений: 231
По умолчанию

Вот, написал программу, но почему-то при вводе отрицательного числа с запятой она начинает вести себя неадекватно, в чем может быть дело?
Код:
#include <iostream>

using namespace std;

const int str=3;
const int stb=4;
float a[str][stb];
float a1[str][stb];
float a2[str][stb];
float a3[str][stb];
float b[str][stb];
float b1[str][stb];
float b2[str][stb];
float x[4];

int main()
{
cout<<"Введите массив:"<<endl;
    for(int i=0;i<str;i++)
    {
        for(int j=0;j<stb;j++)
        {
            cout<<"а["<<i+1<<"]["<<j+1<<"]=";
            cin>>a[i][j];
        }
    }
for(int j=0;j<stb;j++)
    b[0][j]=a[0][j]/a[0][0];

        for(int i=1;i<str;i++)
        {
            for(int j=1;j<stb;j++)
            a1[i][j]=a[i][j]-a[i][0]*b[0][j];
        }

 for(int j=2;j<stb;j++)
    b1[1][j]=a1[1][j]/a1[1][1];

    for(int i=2;i<str;i++)
    {
        for(int j=2;j<stb;j++)
        a2[i][j]=a1[i][j]-a1[i][1]*b1[1][j];
    }
        for(int j=3;j<stb;j++)
            b2[2][j]=a2[2][j]/a2[2][2];

                for(int j=3;j<stb;j++)
                a3[3][j]=a2[3][j]-a2[3][2]*b2[2][j];

            x[3]=a3[3][4]/a3[3][3];
            x[2]=b2[2][4]-b2[2][3]*x[3];
            x[1]=b1[1][4]-b1[1][3]*x[3]-b1[1][2]*x[2];
            x[0]=b[0][4]-b[0][3]*x[3]-b[0][2]*x[2]-b[0][1]*x[1];

    return 0;
}
Злостный анимешнег =^.^=
Демик вне форума Ответить с цитированием
Старый 18.10.2011, 12:11   #6
KobolD
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 239
По умолчанию

Могу дать на C# рабочий алгоритм.
У тебя слишком много вспомогательных массивов, по сути нужны только:
Код:
float[,] A = new float[str, str];//Твои коэффициенты
float[] Y = new float[str];//Столбец ввободных членов
float[] X = new float[str];//Вектор ответов
Причем у тебя stb будет всегда больше str на 1, поэтому stb можно не объявлять.
И еще, метод гауса подразумевает как прямой ход, так и обратный, а не подстановку полученных неизвестных в уравнение.
Чтобы слова не расходились с делом, нужно молчать и ничего не делать.

Последний раз редактировалось KobolD; 18.10.2011 в 12:15.
KobolD вне форума Ответить с цитированием
Старый 18.10.2011, 13:50   #7
Демик
Форумчанин
 
Аватар для Демик
 
Регистрация: 30.01.2011
Сообщений: 231
По умолчанию

Цитата:
Сообщение от KobolD Посмотреть сообщение
...метод гауса подразумевает как прямой ход, так и обратный...
Нам рассказывали об этом, только мне не понятно как это должно выглядеть, в методичке об этом как-то расплывачато написано. Вы не могли бы привести пример, если вас не затруднит?
Злостный анимешнег =^.^=
Демик вне форума Ответить с цитированием
Старый 18.10.2011, 18:09   #8
Демик
Форумчанин
 
Аватар для Демик
 
Регистрация: 30.01.2011
Сообщений: 231
По умолчанию

Народ, помогите, я до сих пор не решил проблему = (
Злостный анимешнег =^.^=
Демик вне форума Ответить с цитированием
Старый 19.10.2011, 16:54   #9
KobolD
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 239
По умолчанию

Вот держи, правда тут весьма упрощеная проверка на то чтобы система имела одно решение или имела его вообще, но я делал под задачу где решение всегда есть и только одно.
Прямой ход заключается в том чтобы получить нули под главной диагональью, а обратный чтобы получить нули над главной диагональю. Нормализация - получение единичек в главной диагонали.
Код:
        public Gauss(double[,] a_matrix, double[] b_vector)
        {
            int n = a_matrix.GetLength(0);
            if (n!=a_matrix.GetLength(1))
                ErrMsg="Матрица коэффициентов не квадратная";
            if (n!=b_vector.Length)
                ErrMsg = "Размерность вектора значений функции не совпадает с размерностью матрицы коэфициентов";
            if (ErrMsg != null)
                return;
            double Normalizer;
            //Прямой ход
            for (int i = 0; i < n; i++)             
            {
                Normalizer = a_matrix[i, i];        //Нормализуем строку
                if (Normalizer == 0)
                {
                    ErrMsg = "Имеет множество решений или несовместна";
                    continue;
                }
                for (int j = i; j < n; j++)
                    a_matrix[i, j] /= Normalizer;
                b_vector[i] /= Normalizer;

                for (int j = i + 1; j < n; j++)     //Вычитаем нормализованную строку из всех нижних
                {
                    Normalizer = a_matrix[j, i];
                    for (int k = i; k < n; k++)     // Вычитаем одну строку из другой
                        a_matrix[j, k] -= a_matrix[i, k] * Normalizer;
                    b_vector[j] -= b_vector[i] * Normalizer;
                }

            }
            //Обратный ход
            for (int i = n-1; i >=0 ; i--)             
            {
                Normalizer = a_matrix[i, i];        //Нормализуем строку
                if (Normalizer == 0)
                {
                    ErrMsg = "Имеет множество решений или несовместна";
                    continue;
                }
                for (int j = i; j < n; j++)
                    a_matrix[i, j] /= Normalizer;
                b_vector[i]/=Normalizer;
                for (int j = i - 1; j >=0; j--)     //Вычитаем нормализованную строку из всех верхних
                {
                    Normalizer = a_matrix[j, i];
                    for (int k = i; k < n; k++)     // Вычитаем одну строку из другой
                        a_matrix[j, k] -= a_matrix[i, k] * Normalizer;
                    b_vector[j]-=b_vector[i]*Normalizer;
                }
            
            }
            Koef_vector = b_vector;//после всех преобразований вектор свободных членов совпадает с вектором ответов (иксов) его и забирай.

        }
Чтобы слова не расходились с делом, нужно молчать и ничего не делать.
KobolD вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
из C++ в C# метод Гаусса Pein95 C# (си шарп) 2 18.05.2011 18:53
Безумно сложные задачки!!!! Метод Гаусса, итераций, метод половинного деления, задача Коши и т.д. Хомяк!!!!! Помощь студентам 4 08.07.2009 10:08
Метод Гаусса werser Помощь студентам 10 23.05.2009 01:46
Метод Гаусса IgorKr Помощь студентам 10 03.02.2008 11:28