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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2012, 10:22   #1
WarHamster
Пользователь
 
Регистрация: 09.08.2010
Сообщений: 48
По умолчанию Игнорирование условия ">"

Пишу ряд лабораторных по методам вычислений уравнений и систем. Возмем для примера метод Зейделя, суть вкратце - берется начальное приближение и последовательно приближается, пока разность между корнями текущей и предыдущей итерации не станет меньше заданной точности.
Матрица системы:
4 2 0 10
1 3 1 12
0 2 1 8
Соотвественно x1=1, x2=3, x3=2
Точность возьмем 10^-4
Основной листинг:
Код:
typedef vector< vector<double> > Matr;
typedef vector<double> Answers;

bool Iteration_EndTest(Matr X1, Matr X2, const double e)
// Проблемный участок тут
{
for(int i=0; i<size; i++)
        {
        if( abs(X1[0][i]-X2[0][i])>e ) return false;
        };
return true;
};

Answers Zeidel_Itr(Matr A, Matr B, const double e)
{
Matr X=B;
X[0][0]=X[0][1]=X[0][2]=0;
Matr OldX;
ItrCount=0;
do
        {
        OldX=X;
        X=Zeidet_Math(A,X,B); // Вычисляются новые корни уравнения 
        ItrCount++;
        }
while(!Iteration_EndTest(X,OldX,e)); // И сравниваются со старыми
return X[0];
};

void __fastcall TForm1::Button5Click(TObject *Sender)
{
Matr M=GetMatr(StringGrid1); // Считывание из грида
Matr A,B;
Answers X;
const double e=pow(10, -CSpinEdit2->Value); // Точность
if( Iteration_Check(M)==true )    // Проверка, диагональные элементы!=0
        {
                A=Iteration_Equal(M, true);  // Преобразование матрицы системы
                B=Iteration_Equal(M, false); // К эквивалентной форме
                X=Zeidel_Itr(A,B,e);
                PutMatr(X,StringGrid3);
                Label4->Caption="Итераций: "+IntToStr(ItrCount);
        }
else ShowMessage("Некорректные данные");
}
На третьей итерации имеем:
e=0,0001
X1: 0.9305555, 3.1157407, 1.7685185 -новые корни
X2: 0.9166666, 3.1388888, 1.7222222 -с предыдущей итерации
Разности корней равны 0.01388, 0.02314, 0.04629

Видно, что разности корней превышают точность, но, не смотря на это, Iteration_Test возвращает true, причем при любой точности <1.
WarHamster вне форума Ответить с цитированием
Старый 10.05.2012, 16:56   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

вообще не могу понять как оно у вас работает.

что такое size?
f.hump вне форума Ответить с цитированием
Старый 12.05.2012, 18:19   #3
WarHamster
Пользователь
 
Регистрация: 09.08.2010
Сообщений: 48
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
вообще не могу понять как оно у вас работает.

что такое size?
size - глобальная переменная, размер системы, для данного примера равна 3
A и B соответственно коэффициенты и свободные члены после преобразования исходной матрицы.
WarHamster вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Игнорирование спецсимволов Даниил_глазко Общие вопросы Delphi 5 15.08.2011 15:39
Игнорирование переадресации Crystallon Общие вопросы Delphi 3 23.05.2010 00:26
игнорирование ошибок frantic150 Microsoft Office Excel 5 26.02.2010 21:10
Как добывить игнорирование пробелов? DMMx667 Общие вопросы C/C++ 15 27.01.2010 13:16
Игнорирование ошибок mephist Microsoft Office Excel 3 24.07.2009 09:58