Форум программистов, компьютерный форум CyberForum.ru

Метод простых итераций для СЛАУ - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.97
Pain'ka
 Аватар для Pain'ka
1 / 1 / 0
Регистрация: 23.11.2011
Сообщений: 54
25.10.2012, 22:54     Метод простых итераций для СЛАУ #1
Доброго времени суток всем!!!
решаю СЛАУ методом простых итераций, проблема вот в чем: не могу понять, как сделать расчет по к-ым приближениям?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
double Am[4][4]={21,4,2,2,4, 8, 0, 2, 2, 0, 9, -4, 2, 2, -4, 12};
    double bb[4];
    double Bm[4]={2*s*(ss), 5*((ss)-cs), 7*(cs+ss), 3*(ss)}, eee = 0.0001, xpred[4], xx[4], err;
    r = 0;
 
    for( i = 0; i <n ; i++){
        bb[i] = Bm[i]/Am[i][i];
        for(j = 0; j < n; j++){
            Am[i][j] = -Am[i][j]/ Am[i][i];
            if(i == j)A[i][j] = 0;
        }
        x[i] = bb[i];
        cout<<"x[ "<<i<<"] ="<<x[i]<<"\n";
    }k = 0;
    x[0] = bb[0];
    do{
        
        [COLOR="Red"]//что здесь писать????[/COLOR]
    
    }while(err > eee);
    for(k = 0; k < n; k++)
        cout<<"x[ "<<k<<"] ="<<xx[k]<<"\n";
Добавлено через 50 минут
и еще один вопрос: как при решении нелинейной системы прийти к виду х1 = f(x1, x2, .., xn);
x2 = f2(x1, x2, ..., xn);
....
xn = fn (x1, x2, ..., xn)
?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Большой_Стен
13 / 13 / 1
Регистрация: 22.04.2012
Сообщений: 99
26.10.2012, 12:50     Метод простых итераций для СЛАУ #2
Ну у Вас тут чего-то явно не хватает. Насколько я понимаю вам нужен алгоритм получения корней на текущей итерации. Ну что ж, попробую своими "словами"
C
1
2
3
4
5
6
7
for (i=0;i<n;i++)
{
  for (j=0;j<n;j++)
  tekuschee_reshenie[i]+=prediduschee_reshenie[i]*C[i][j];
  tekuschee_reshenie[i]+=D[i];
}
err=vect_norm_raznosti (tekuschee_reshenie,prediduschee_reshenie,n);
В коде C - та самая матрица с нулями по диагонали, а d - прилагающейся к ней столбец. Функция vect_norm_raznosti возвращает векторную норму, которая определяет, достигли ли мы нужной точности (также советую в этой функции сделать замену старых корней на новые или изменить условие завершения цикла while(err > eee)). Код vect_norm_raznosti может выглядеть так
C
1
2
3
4
5
6
7
8
9
10
11
double vect_norm_raznosti (double *current, double *prev, double **C, int n)
{
  int i;
  double max=-1;
  for (i=0;i<n;i++)
  {
    double tmp=fabs(current[i]-prev[i])*matr_norm(C)/(1-matr_norm(C));
    if (tmp>max) max=tmp;
  }
  return tmp;
}
Для сходимости учитываем ещё и матричную норму С.
Pain'ka
 Аватар для Pain'ka
1 / 1 / 0
Регистрация: 23.11.2011
Сообщений: 54
26.10.2012, 20:16  [ТС]     Метод простых итераций для СЛАУ #3
а матричную норму С как рассчитываем?

Добавлено через 18 минут
что-то такое?для чего нужна норма матрицы?это же для линейной системы?
C
1
2
3
4
5
6
7
8
9
matr_norm=0;
for(i=0;i<m;i++)  
  {
     temp=0;
     for(j=0;j<m;j++)
        temp+=(int)fabs(C[j][i]);
     if(temp>matr_norm)
         matr_norm=temp;
  }
Большой_Стен
13 / 13 / 1
Регистрация: 22.04.2012
Сообщений: 99
26.10.2012, 23:14     Метод простых итераций для СЛАУ #4
Правильно. Но СЛАУ состоит грубо говоря из квадратной матрицы и одного столбца. Общий вид A*X=B, после нормирования X=C*X+D. Матричная норма C должна быть меньше единицы, иначе метод не сойдётся, корни Вы никак не сможете получить. В некоторых источниках упоминается, что и условие завершения итераций также зависит от матричной нормы: грубо говоря
C
1
2
3
for (i=0;i<n;i++)
if (fabs(current_resh[i]-prev_resh[i])*matr_norm(C)/(1-matr_norm(C))>e) return false;//Требуемая точность ещё не достигнута
return true;
Pain'ka
 Аватар для Pain'ka
1 / 1 / 0
Регистрация: 23.11.2011
Сообщений: 54
26.10.2012, 23:36  [ТС]     Метод простых итераций для СЛАУ #5
на входе у меня матричная норма равна 7. а матрица С не меняется в процессе выполнения.
Большой_Стен
13 / 13 / 1
Регистрация: 22.04.2012
Сообщений: 99
27.10.2012, 00:48     Метод простых итераций для СЛАУ #6
Хм, если у вас матричная норма матрицы C (в виде X=CX+B) равна 7, то метод не сойдётся. Выведите в таком случае соответсвующее сообщение или попробуй те написать приведение к требуемому виду (что весьма неприятно). Знаете, при желании могу скинуть свой когда-то написанный код метода Зейделя, он не преобразует матриц, если норма меньше единицы, то программа завершается. Он легко переделывается в метод простых итераций, если не поймёте, как это сделать, могу помочь.
Pain'ka
 Аватар для Pain'ka
1 / 1 / 0
Регистрация: 23.11.2011
Сообщений: 54
27.10.2012, 14:55  [ТС]     Метод простых итераций для СЛАУ #7
Эту же задачу я решала методом Гаусса, все нормально, но с итерациями "села"!!!
Наверно, я что-то не так делаю, потому что препод сказал, что все норм там, все сходиться!
А прогу, если не трудно, скиньте, пожалуйста.Буду благодарна)))
Pain'ka
 Аватар для Pain'ka
1 / 1 / 0
Регистрация: 23.11.2011
Сообщений: 54
28.10.2012, 20:44  [ТС]     Метод простых итераций для СЛАУ #8
Вроде разобралась, ответы адекватные.
Теперь у меня другой вопрос:для нелинейной системы:
как при решении нелинейной системы прийти к виду
х1 = f(x1, x2, .., xn);
x2 = f2(x1, x2, ..., xn);
....
xn = fn (x1, x2, ..., xn)?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2013, 12:02     Метод простых итераций для СЛАУ
Еще ссылки по теме:

C++ Алгоритм написания для решения СЛАУ методом простых итераций
Метод простых итераций для решения СЛАУ C++
C++ Метод простых итераций для СЛАУ

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ReUz
Сообщений: n/a
20.10.2013, 12:02     Метод простых итераций для СЛАУ #9
помогите написать программу в С++


Найдем корни уравнения:
1+9•sin(x)/2 = 0
Используем для этого Метод итераций.
Одним из наиболее эффективных способов численного решения уравнений является метод итерации. Сущность этого метода заключается в следующем. Пусть дано уравнение f(x)=0.
Заменим его равносильным уравнением x=φ(x).
Выберем начальное приближение корня x0 и подставим его в правую часть уравнения. Тогда получим некоторое число x1=φ(x0).
Подставляя теперь в правую часть вместо x0 число x1 получим число x2=φ(x1). Повторяя этот процесс, будем иметь последовательность чисел xn=φ(xn-1)
Если эта последовательность сходящаяся, то есть существует предел ξ = lim(xn), то переходя к пределу в равенстве и предполагая функцию φ(x) непрерывной найдем lim(xn) = φ(lim(xn-1)), n → ∞ или ξ=φ(ξ).
Таким образом, предел ξ является корнем уравнения и может быть вычислен по формуле с любой степенью точности.
Находим первую производную:
dF/dx = 9/2•cos(x)
Решение.
Представим уравнение в форме:
x = x - λ(1+9•sin(x)/2)
Найдем максимальное значение производной от функции f(x) = 1+9•sin(x)/2
y = 9/2*cos(x)
[-100;100]
Необходимое условие экстремума функции одной переменной.
Уравнение f'0(x*) = 0 - это необходимое условие экстремума функции одной переменной, т.е. в точке x* первая производная функции должна обращаться в нуль. Оно выделяет стационарные точки xс, в которых функция не возрастает и не убывает.
Достаточное условие экстремума функции одной переменной.
Пусть f0(x) дважды дифференцируемая по x, принадлежащему множеству D. Если в точке x* выполняется условие:
f'0(x*) = 0
f''0(x*) > 0
то точка x* является точкой локального (глобального) минимума функции.
Если в точке x* выполняется условие:
f'0(x*) = 0
f''0(x*) < 0
то точка x* - локальный (глобальный) максимум.
Решение.
Находим первую производную функции:
y' = -9/2•sin(x)
Приравниваем ее к нулю:
-9/2•sin(x) = 0
x1 = 0
Вычисляем значения функции на концах отрезка
f(0) = 9/2
f(-100) = 9/2•cos(100)
f(100) = 9/2•cos(100)
Ответ:
fmin = 9/2•cos(100), fmax = 9/2
max(dF/dx = 9/2•cos(x)) ≈ 4.5
Значение λ = 1/(4.5) ≈ 0.2222
Таким образом, решаем следующее уравнение:
x+0.2222(1+9•sin(x)/2) = 0
Уточним интервалы, в которых будут находиться корни уравнения. Для этого исходный интервал [-100;100] разобьем на 10 подынтервалов.
h2 = -100 + 2*(100-(-100))/10 = -60
h3 = -100 + (2+1)*(100-(-100))/10 = -40
Поскольку F(-60)*F(-40)<0, то корень лежит в пределах [-60;-40].
Остальные расчеты сведем в таблицу.

N x F(x)
1 -60 2.3716


Ответ: x = -60; F(x) = 2.372
Сходимость:

h4 = -100 + 4*(100-(-100))/10 = -20
h5 = -100 + (4+1)*(100-(-100))/10 = 0
Поскольку F(-20)*F(0)<0, то корень лежит в пределах [-20;0].
Остальные расчеты сведем в таблицу.

N x F(x)
1 -20 -3.1083


Ответ: x = -20; F(x) = -3.108
Сходимость:

h7 = -100 + 7*(100-(-100))/10 = 40
h8 = -100 + (7+1)*(100-(-100))/10 = 60
Поскольку F(40)*F(60)<0, то корень лежит в пределах [40;60].
Остальные расчеты сведем в таблицу.

N x F(x)
1 40 4.353


Ответ: x = 40; F(x) = 4.353
Сходимость:
Yandex
Объявления
20.10.2013, 12:02     Метод простых итераций для СЛАУ
Ответ Создать тему
Опции темы

Текущее время: 07:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru