Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.97
Pain'ka
1 / 1 / 1
Регистрация: 23.11.2011
Сообщений: 54
#1

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

25.10.2012, 22:54. Просмотров 4549. Ответов 8
Метки нет (Все метки)

Доброго времени суток всем!!!
решаю СЛАУ методом простых итераций, проблема вот в чем: не могу понять, как сделать расчет по к-ым приближениям?
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)
?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2012, 22:54
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Метод простых итераций для СЛАУ (C++):

Метод простых итераций для СЛАУ
Помогите пожалуйста! Нужно реализовать метод простых итераций для решения СЛАУ...

Метод простых итераций для СЛАУ
Здравствуйте! Пытаюсь реализовать метод простых итераций. Все функции, которые...

Метод простых итераций для СЛАУ
Прошу помочь с написанием МПИ для СЛАУ на C. Каким образом выразить из AX=b...

Метод простых итераций для решения СЛАУ
Всем добрый вечер! Столкнулся с заданием на тему решения СЛАУ методом простых...

Метод простых итераций для решения СЛАУ
Здравствуйте. Попытался сделать программу для решения СЛАУ методом простых...

Метод простых итераций для решения СЛАУ
Здравствуйте. Есть функция, реализующая метод простых итераций: void...

8
Большой_Стен
13 / 13 / 8
Регистрация: 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;
}
Для сходимости учитываем ещё и матричную норму С.
0
Pain'ka
1 / 1 / 1
Регистрация: 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;
  }
0
Большой_Стен
13 / 13 / 8
Регистрация: 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;
0
Pain'ka
1 / 1 / 1
Регистрация: 23.11.2011
Сообщений: 54
26.10.2012, 23:36  [ТС] #5
на входе у меня матричная норма равна 7. а матрица С не меняется в процессе выполнения.
0
Большой_Стен
13 / 13 / 8
Регистрация: 22.04.2012
Сообщений: 99
27.10.2012, 00:48 #6
Хм, если у вас матричная норма матрицы C (в виде X=CX+B) равна 7, то метод не сойдётся. Выведите в таком случае соответсвующее сообщение или попробуй те написать приведение к требуемому виду (что весьма неприятно). Знаете, при желании могу скинуть свой когда-то написанный код метода Зейделя, он не преобразует матриц, если норма меньше единицы, то программа завершается. Он легко переделывается в метод простых итераций, если не поймёте, как это сделать, могу помочь.
0
Pain'ka
1 / 1 / 1
Регистрация: 23.11.2011
Сообщений: 54
27.10.2012, 14:55  [ТС] #7
Эту же задачу я решала методом Гаусса, все нормально, но с итерациями "села"!!!
Наверно, я что-то не так делаю, потому что препод сказал, что все норм там, все сходиться!
А прогу, если не трудно, скиньте, пожалуйста.Буду благодарна)))
0
Pain'ka
1 / 1 / 1
Регистрация: 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)?
0
Reuz
0 / 0 / 1
Регистрация: 02.12.2017
Сообщений: 7
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
Сходимость:
0
20.10.2013, 12:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2013, 12:02
Привет! Вот еще темы с решениями:

Метод простых итераций для решения СЛАУ
Доброго времени суток. Если у кого нибудь есть готовые программы для данного...

Алгоритм написания для решения СЛАУ методом простых итераций
Прошу помощи в написании программы для решения СЛАУ методом итераций. Нет, я не...

Метод простых итераций (для трехмерной матрицы)
Привет всем. Помогите пожалуйста. Из корней системы уравнений выдает правильно...

Метод простых итераций для одного уравнения
arccos(x) - sqrt(1-0.3x^3) = 0 Отрезок от +приближенное значение корня...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru