Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Теория программирования > Алгоритмы
Перезагрузить страницу Схема Халецкого как написать программу
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Stone Stone вне форума
Member
 
Сообщений: 151
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.11.2007
По умолчанию Схема Халецкого как написать программу - 25.11.2007, 21:13

Тут меня месяц назад попросили написать программу на языке Си решения симметричной системы линейных уравнений методом Халецкого. Я написал, вот теперь думаю, может еще кому понадобится.
Код:
/*
    test108.cpp

    2/11/2007
*/

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

int cholesky_decomp(float *mat_a, float *mat_b, int sz)
{
    double sum;
    int    ii, jj, kk;

    for(ii = 0;ii < sz;ii++)
    {
        for(jj = ii;jj < sz;jj++)
        {
            sum = *(mat_a + ii + sz*jj);

            for(kk = ii - 1;kk >= 0;kk--)
                sum = sum - (*(mat_a + ii + sz*kk))*(*(mat_a + jj + sz*kk));

            if(ii == jj)
            {
                if(sum < 4*FLT_EPSILON)
                {
                    printf("Cholesky method failed!\n");

                    return 0;
                }     

                *(mat_b + ii + sz*ii) = sqrt(sum);
            }
            else
                *(mat_b + jj + sz*ii) = *(mat_a+ jj + sz*ii) = sum/( *(mat_b + ii + sz*ii));
        }
    }

   return 1; 
}

void cholesky_solver(float *mat_b, float right[], float xx[], int sz)
{
    double sum;
    float  *p_temp;
    int    ii, jj;

    p_temp = (float*)malloc(sz*sizeof(right[0]));

    for(ii = 0; ii < sz; ii++)
    {
        sum = 0.0;

        for(jj = 0; jj < ii; jj++)
            sum += (*(mat_b + ii + sz*jj))*p_temp[jj];

        p_temp[ii] = (right[ii] - sum)/(*(mat_b + ii + sz*ii));
    }

    for(ii = sz - 1; ii >= 0; ii--)
    {
        sum = 0.0;

        for(jj = sz - 1; jj > ii; jj--)
            sum += (*(mat_b + jj + sz*ii))*xx[jj];

        xx[ii] = (p_temp[ii] - sum)/(*(mat_b + ii + sz*ii));
    }

     free(p_temp);
}

#define EQU_ORDER 5

float left[EQU_ORDER][EQU_ORDER] = {
                          {4.0f, 1.0f, 2.0f, 0.5f, 2.0f},
                          {1.0f, 0.5f, 0.0f, 0.0f, 0.0f},
                          {2.0f, 0.0f, 3.0f, 0.0f, 0.0f},
                          {0.5f, 0.0f, 0.0f, 0.625f, 0.0f},
                          {2.0f, 0.0f, 0.0f, 0.0f, 16.0f}};

float right[EQU_ORDER] = {7.0f, 3.0f, 7.0f, -4.0f, -4.0f};

float bb[EQU_ORDER][EQU_ORDER];

float xx[EQU_ORDER];

int main()
{
    int ii;

    if(!cholesky_decomp((float*)&left[0][0], (float*)&bb[0][0], EQU_ORDER))
        return 0;

    cholesky_solver((float*)&bb[0][0], right, xx, EQU_ORDER);

    printf("Cholesky's Method\n\n");
     
    for(ii = 0; ii < EQU_ORDER; ii++)
       printf("  X%d = %+f\n", ii, xx[ii]);

    return 0;
}
Как видно из листинга систему решают две функции. Проверена на Matlab.
Ответить с цитированием
  (#2 (permalink)) Старый
Stone Stone вне форума
Member
 
Сообщений: 151
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.11.2007
По умолчанию 27.11.2007, 10:23

Я старался, писал программу, может быть кто либо выскажет свое мнение. По моему, программа написана хорошо, может кто либо имеет другое мнение? Пишите.
Ответить с цитированием
  (#3 (permalink)) Старый
Dian Dian вне форума
Member
 
Сообщений: 5,243
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.09.2004
По умолчанию 27.11.2007, 10:37

Слив засчитан
Расскажи лучше, где она может быть применена...
Ответить с цитированием
  (#4 (permalink)) Старый
Stone Stone вне форума
Member
 
Сообщений: 151
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.11.2007
По умолчанию 27.11.2007, 10:56

Цитата:
Слив засчитан
Расскажи лучше, где она может быть применена...
А что значит "слив засчитан"? А применить этупрограмму просто. Числу EQU_ORDER приписываешь нужный порядок, потом в матрицу left вносишь левую часть системы, а в вектор right - правую часть системы. Пропускаешь эти две функции и результат в векторе xx.
Ответить с цитированием
  (#5 (permalink)) Старый
Dian Dian вне форума
Member
 
Сообщений: 5,243
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.09.2004
По умолчанию 27.11.2007, 13:36

не не, я имел в виду реальную, практическую задачу, где нужно решение таких систем ( не учебную )
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Stone Stone вне форума
Member
 
Сообщений: 151
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.11.2007
По умолчанию 27.11.2007, 14:41

Цитата:
не не, я имел в виду реальную, практическую задачу, где нужно решение таких систем ( не учебную )
В любой программе, где необходимо решение симметричной системы линейных уравнений, эти две функции справятся. Для порядка, меньше 250, я гарантирую правильное решение системы. Лично меня больше интересует, как сам код.
Ответить с цитированием
  (#7 (permalink)) Старый
Hroft Hroft вне форума
Member
 
Сообщений: 20
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 07.10.2007
По умолчанию 13.04.2008, 02:27

Я думаю, первокурсники инженерных специальностей, где преподают С++ скажут тебе большое спасибо. Я часто встречал эту задачу как курсовую А на практике она наверно не очень-то применима.Там вроде на матрицу условия накладываются специфичные.
Ответить с цитированием
  (#8 (permalink)) Старый
alexu alexu вне форума
Member
 
Сообщений: 433
Сказал(а) спасибо: 0
Поблагодарили 4 раз(а) в 4 сообщениях
Регистрация: 01.06.2007
По умолчанию 26.04.2008, 13:52

Большинство из нас конечно в душе математики. Но все же было бы неплохо объяснить нормальным человеческим языком, что такое "симметричная система линейных уравнений методом Халецкого" и для чего она нужна. Тогда мы бы лучше оценили изящность решения задачи.

Что касается собственно программы (не вдаваясь в тонкости решения, потому что ничего не понимаю) - я что-то не увидел ввода с клавиатуры. Откуда ваша прога берет исходные данные?
Ответить с цитированием
  (#9 (permalink)) Старый
Stone Stone вне форума
Member
 
Сообщений: 151
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.11.2007
По умолчанию 13.03.2009, 16:23

Alexu, все просто. Мой код дан в виде двух функций, которые именно решают эту систему. Потом, дана программа, как демонстрации верности именно этих двух функций с решением контрольного примера. Твое дело просто написать свою программу и вставить в нужное место эти функции!
Ответить с цитированием
  (#10 (permalink)) Старый
Stone Stone вне форума
Member
 
Сообщений: 151
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.11.2007
По умолчанию 13.03.2009, 16:23

Alexu, все просто. Мой код дан в виде двух функций, которые именно решают эту систему. Потом, дана программа, как демонстрации верности именно этих двух функций с решением контрольного примера. Твое дело просто написать свою программу и вставить в нужное место эти функции!
Ответить с цитированием
  (#11 (permalink)) Старый
yasya yasya вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 31.03.2009
По умолчанию 31.03.2009, 02:24

Давно не занималась программированием на си.
А сейчас понадобилось написать код для схемы халецкого.
Вы не могли бы объяснить, что делают эти две функции, и какие у них параметры?
Заранее огромное спасибо.
Ответить с цитированием
  (#12 (permalink)) Старый
yasya yasya вне форума
Новичок
 
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 31.03.2009
По умолчанию 31.03.2009, 02:29

Да и еще: а что такое 4*FLT_EPSILON?
а * - это ведь указатель?
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
IL_Agent IL_Agent вне форума
Member
 
Аватар для IL_Agent
 
Сообщений: 2,015
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.07.2005
По умолчанию 31.03.2009, 13:21

Stone, любопытно, а как бы это выглядело на Фортране ?
Ответить с цитированием
  (#14 (permalink)) Старый
Stone Stone вне форума
Member
 
Сообщений: 151
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.11.2007
По умолчанию 31.03.2009, 14:47

Цитата:
Да и еще: а что такое 4*FLT_EPSILON?
а * - это ведь указатель?
Вот часть кода
Код:
if(sum < 4*FLT_EPSILON)
                {
                    printf("Cholesky method failed!\n");

                    return 0;
                }
FLT_EPSILON - это минимальное число типа float. Если переменная sum становится меньше четырех FLT_EPSILON, то нет смысла производить дальнейшую декомпозицию этой матрицы, так как она не соотвествует условию Халецкого и функция завершает свою работу с кодом фатальной ошибки. Число четыре приоизвольно. Можете взять вообще единицу или двойку.
Ответить с цитированием
  (#15 (permalink)) Старый
Stone Stone вне форума
Member
 
Сообщений: 151
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.11.2007
По умолчанию 31.03.2009, 14:50

Цитата:
Stone, любопытно, а как бы это выглядело на Фортране ?
Заметно проще в передаче матрицы в функции. Не имею сейчас учтановленного компилятора Фортрана. Уверен, что в сети можно найти решение этой задачи на Фортране.
Меня просили сделать на языке Си.
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написать программу на C++ qi7 Вопросы начинающих программистов 0 14.11.2011 23:21
написать программу Альбина зин Pascal 2 28.10.2011 14:21
написать программу 27diesel Вопросы начинающих программистов 1 11.10.2011 10:31
написать программу Виктория123 Вопросы начинающих программистов 0 11.05.2011 14:28
Как написать программу Викусик Delphi 1 20.09.2010 10:22
Как решить задачу по схеме Халецкого Dilka Вопросы начинающих программистов 7 21.12.2009 14:48
Как написать TSR программу в С++ kosetsky Вопросы начинающих программистов 1 03.10.2009 21:25
Написать программу blackcat Задания за деньги 3 20.09.2009 12:12
Принципиальная схема и блок схема оперативной памяти DIMM SDRAM Picnik Разное 0 06.03.2009 20:08
Как написать программу в С++ FARA Вопросы начинающих программистов 9 01.11.2005 19:08
XML как написать программу imported_Aslan Другие СУБД 0 29.10.2004 12:48
Написать программу которая закрывает любую программу из автозагрузки без перезагрузк Anonymous C++ Builder 1 07.10.2003 11:24



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов