Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

FAQ - часто задаваемые вопросы

242
22 ноября 2006 года
Оlga
2.2K / / 04.02.2006
Здесь постим решения, ссылки на темы, где есть решения на часто задаваемые вопросы.

[COLOR=purple]Ищем исходники[/COLOR] здесь.

Если в приведенных здесь решениях есть ошибки, просьба сообщить мне об этом. Спасибо.
Страницы:
535
02 декабря 2010 года
Нездешний
537 / / 17.01.2008
Функция Gauss получает решение СЛАУ методом Гаусса. Возвращает true или false в зависимости от существования единственного решения СЛАУ. Искомые неизвестные возвращаются через параметр X.
Код:
#include <vector>
#include <algorithm>

//Назначение: решение СЛАУ вида Matrix * X = Fx
//Возвращаемое значение: true - если существует единственное решение,
//false - в остальных случаях
bool Gauss(
    const std::vector< std::vector<double> > &Matrix,
    const std::vector<double> &Fx,
    /*out*/ std::vector<double> &X)
{
    if (Fx.size() != Matrix.size()) return false;

    std::vector< std::vector<double> > matrix(Matrix);
    std::vector<double> fx(Fx);

    X.clear();
    X.resize(matrix.size());

    //прямой ход
    for (unsigned i = 0; i < matrix.size(); ++i)
    {
        for (unsigned Row = i + 1; Row < matrix.size(); ++Row)
        {
            //поменяем строки, если элемент на главной диагонали равен нулю
            if (0 == matrix)
            {
                unsigned rowNotZero;
                for (rowNotZero = i; rowNotZero < matrix.size(); ++rowNotZero)
                {
                    if (matrix[rowNotZero] != 0)    break;
                }

                if (rowNotZero == matrix.size())    return false;
                std::swap(matrix, matrix[rowNotZero]);
                std::swap(fx, fx[rowNotZero]);
            }

            double Coef = matrix[Row] / matrix;
            for (unsigned Col = i; Col < matrix[Row].size(); ++Col)
            {
                matrix[Row][Col] -= Coef * matrix[Col];
            }

            fx[Row] -= Coef * fx;
        }
    }

    //обратный ход
    for (int i = matrix.size() - 1; i >= 0; --i)
    {
        double sum = fx;
        for (unsigned j = i+1; j < matrix.size(); ++j)
        {
            sum -= matrix[j] * X[j];
        }

        X = sum / matrix;
    }

    return true;
}
535
02 декабря 2010 года
Нездешний
537 / / 17.01.2008
Функция JordanGauss получает решение СЛАУ методом Жордана-Гаусса. Возвращает true или false в зависимости от существования единственного решения СЛАУ. Искомые неизвестные возвращаются через параметр X.
Код:
#include <vector>
#include <algorithm>

//Назначение: решение СЛАУ вида Matrix * X = Fx
//Возвращаемое значение: true - если существует единственное решение,
//false - в остальных случаях
bool JordanGauss(
    const std::vector< std::vector<double> > &Matrix,
    const std::vector<double> &Fx,
    /*out*/ std::vector<double> &X)
{
    if (Fx.size() != Matrix.size()) return false;

    std::vector< std::vector<double> > matrix(Matrix);
    std::vector<double> fx(Fx);

    X.clear();
    X.resize(matrix.size());

    //приведем к треугольной матрице
    for (unsigned i = 0; i < matrix.size(); ++i)
    {
        for (unsigned Row = i + 1; Row < matrix.size(); ++Row)
        {
            //поменяем строки, если элемент на главной диагонали равен нулю
            if (0 == matrix)
            {
                unsigned rowNotZero;
                for (rowNotZero = i; rowNotZero < matrix.size(); ++rowNotZero)
                {
                    if (matrix[rowNotZero] != 0)    break;
                }

                if (rowNotZero == matrix.size())    return false;
                std::swap(matrix, matrix[rowNotZero]);
                std::swap(fx, fx[rowNotZero]);
            }

            double Coef = matrix[Row] / matrix;
            for (unsigned Col = i; Col < matrix[Row].size(); ++Col)
            {
                matrix[Row][Col] -= Coef * matrix[Col];
            }

            fx[Row] -= Coef * fx;
        }
    }

    //получим единицы на главной диагонали
    for (int Row = 0; Row < static_cast<int>(matrix.size()); ++Row)
    {
        fx[Row] /= matrix[Row][Row];
        for (int Col = matrix[Row].size() - 1; Col >= Row; --Col)
        {
            matrix[Row][Col] /= matrix[Row][Row];
        }
    }

    //приведем к единичной матрице слева
    for (int i = matrix.size() - 1; i > 0; --i)
    {
        for (int Row = i - 1; Row >= 0; --Row)
        {
            double Coef = matrix[Row] / matrix;
            for (int Col = matrix[Row].size() - 1; Col >= i; --Col)
            {
                matrix[Row][Col] -= Coef * matrix[Col];
            }

            fx[Row] -= Coef * fx;
        }
    }

    X = fx;

    return true;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог