0 / 0 / 0
Регистрация: 27.12.2012
Сообщений: 3
1

Определить минимум функции по методу Гаусса-Зейделя

23.12.2013, 21:28. Показов 2342. Ответов 3
Метки нет (Все метки)

Дана функция, надо определить её минимум по методу Гаусса-Зейделя.
Вот что получилось, но почему-то не считает gr1 и gr2
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
% Метод Гаусса-Зейделя.
clear all;
clc;
% Значения коэффициентов.
A1 = 3;
A2 = 2;
a1 = 4;
a2 = 2;
 b = 1;
c1 = 4;
c2 = 2;
D = 2;
g = 0.2; % Постоянная шага.
d = 0.01; % дельта.
% Начальная точка.
x1 =5 ;
x2 =8;
k = 1;  % Счетчик шагов
kmax = 100; % Предельное число шагов,
% задается для предотвращения зацикливания.
% Массивы для хранения промежуточных координат.
x1trace = [x1];
x2trace = [x2];
i = 2;
while k < kmax
% Спуск по первой координате.
gr1 = -A1*(2*a1-2*x1)/b.^2*(((a1-x1).^2/b.^2)+((c1-x2).^2/D.^2)+1).^2-A2*(2*a2-2*x1)/b.^2*(((a2-x1).^2/b.^2)+((c2-x2).^2/D.^2)+1).^2;
x1 = x1 + g*gr1;
% Сохранение координат.
x1trace(i) = x1;
x2trace(i) = x2;
i = i + 1;
% Спуск по второй координате.
gr2 = -A1*(2*c1-2*x2)/D.^2*(((a1-x1).^2/b.^2)+((c1-x2).^2/D.^2)+1).^2-A2*(2*c2-2*x2)/D.^2*(((a2-x1).^2/b.^2)+((c2-x2).^2/D.^2)+1).^2;
x2 = x2 + g*gr2;
% Сохранение координат.
x1trace(i) = x1;
x2trace(i) = x2;
i = i + 1;
% Проверка условия останова.
if sqrt(gr1^2 + gr2^2) <= d;
break; % Выход из цикла в случае выполнения условия.
end
k = k + 1;
end
% Построение графика.
x = -10:0.1:10;
y = -10:0.1:10;
[X, Y] = meshgrid(x, y);
Z=100-A1./(1+((X-a1)./b).^2+((Y-c1)./D).^2)-A2./(1+((X-a2)./b).^2+((Y-c2)./D).^2);
[C, h] = contour(X, Y, Z);
clabel(C, h);
% Отображение меток на линиях уровня.
hold on;
plot(x1trace, x2trace, '-');
grid on;
% Вывод начальной точки на график.
text(x1trace(1) + 0.2, x2trace(1) + 0.5, 'M0');
% Вывод решения на график.
text(x1 + 2, x2, ...
strvcat(['x1 = ' (num2str(x1))], ...
        ['x2 = ' (num2str(x2))], ...
        ['k = '  (num2str(k))]));
Миниатюры
Определить минимум функции по методу Гаусса-Зейделя  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.12.2013, 21:28
Ответы с готовыми решениями:

Решение СЛАУ методом Гаусса-Зейделя
Подскажите, пожалуйста, в чём ошибка... clear; clc; a= b= e=0.00001; n=3; miter=100; for...

Оптимизация методом покоординатного спуска (Гаусса-Зейделя)
Есть рабочий вариант: clear all; clc; % Значения коэффициентов c1 = -2; c2 = -1; c12 = 1; ...

Определить матрицы по методу Гаусса
Здравствуйте, написала программу вычисления определителя методом Гаусса c поиском ведущего элемента...

Найти точку минимума функции методом Гаусса-Зейделя
Помогите пожалуйста написать программу в Паскале. Помогите написать прогу в Паскале которая...

3
318 / 257 / 30
Регистрация: 30.03.2013
Сообщений: 755
29.12.2013, 22:39 2
У вас gr1 и gr2 очень большие получаются, и они помечены как тип Inf
то есть по простому деление на 0

Matlab M
1
2
3
4
inf Infinity.       
    inf returns the IEEE arithmetic representation for positive
    infinity.  Infinity is also produced by operations like dividing by
    zero, eg. 1.0/0.0, or from overflow, eg. exp(1000).
0
2013 / 1285 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
02.01.2014, 17:28 3
эх позновато наверно, но пока делать нечего для интереса посмотрел код)
Производные посчитаны не правильно. Вы их вручную считали? Я себе такое доверять не стал и воспользовался матлабом)
Matlab M
1
2
3
4
syms x y A1 A2 a1 a2 b c1 c2 D
z = 100-A1/(1+((x-a1)/b)^2+((y-c1)/D)^2)-A2/(1+((x-a2)/b)^2+((y-c2)/D)^2)
diff(z, x)
diff(z, y)
после введения в код полученных значений производных, все заработало. Только еще знаки надо поменять в выражении для приращения координаты, а то у вас покоординатный подъем, а не спуск)
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
% Метод Гаусса-Зейделя.
% Значения коэффициентов.
A1 = 3;
A2 = 2;
a1 = 4;
a2 = 2;
 b = 1;
c1 = 4;
c2 = 2;
D = 2;
g = 0.2; % Постоянная шага.
d = 0.01; % дельта.
% Начальная точка.
x1 =5 ;
x2 =8;
k = 1;  % Счетчик шагов
kmax = 100; % Предельное число шагов,
% задается для предотвращения зацикливания.
% Массивы для хранения промежуточных координат.
x1trace = [x1];
x2trace = [x2];
i = 2;
while k < kmax
% Спуск по первой координате.
% gr1 = -A1*(2*a1-2*x1)/b.^2*(((a1-x1).^2/b.^2)+((c1-x2).^2/D.^2)+1).^2-A2*(2*a2-2*x1)/b.^2*(((a2-x1).^2/b.^2)+((c2-x2).^2/D.^2)+1).^2;
gr1 = - (A1*(2*a1 - 2*x1)) / (b^2*((a1 - x1).^2/b^2 + (c1 - x2).^2/D^2 + 1).^2) - (A2*(2*a2 - 2*x1))/(b^2*((a2 - x1)^2/b^2 + (c2 - x2)^2/D^2 + 1)^2);
x1 = x1 - g*gr1;
% Сохранение координат.
x1trace(i) = x1;
x2trace(i) = x2;
i = i + 1;
% Спуск по второй координате.
% gr2 = -A1*(2*c1-2*x2)/D.^2*(((a1-x1).^2/b.^2)+((c1-x2).^2/D.^2)+1).^2-A2*(2*c2-2*x2)/D.^2*(((a2-x1).^2/b.^2)+((c2-x2).^2/D.^2)+1).^2;
gr2 = - (A1*(2*c1 - 2*x2))/(D^2*((a1 - x1)^2/b^2 + (c1 - x2)^2/D^2 + 1)^2) - (A2*(2*c2 - 2*x2))/(D^2*((a2 - x1)^2/b^2 + (c2 - x2)^2/D^2 + 1)^2);
x2 = x2 - g*gr2;
% Сохранение координат.
x1trace(i) = x1;
x2trace(i) = x2;
i = i + 1;
% Проверка условия останова.
if sqrt(gr1^2 + gr2^2) <= d;
break; % Выход из цикла в случае выполнения условия.
end
k = k + 1;
end
% Построение графика.
x = -10:0.1:10;
y = -10:0.1:10;
[X, Y] = meshgrid(x, y);
Z=100-A1./(1+((X-a1)./b).^2+((Y-c1)./D).^2)-A2./(1+((X-a2)./b).^2+((Y-c2)./D).^2);
[C, h] = contour(X, Y, Z);
clabel(C, h);
% Отображение меток на линиях уровня.
hold on;
plot(x1trace, x2trace, '-');
grid on;
% Вывод начальной точки на график.
text(x1trace(1) + 0.2, x2trace(1) + 0.5, 'M0');
% Вывод решения на график.
text(x1 + 2, x2, ...
strvcat(['x1 = ' (num2str(x1))], ...
        ['x2 = ' (num2str(x2))], ...
        ['k = '  (num2str(k))]));
0
0 / 0 / 0
Регистрация: 27.12.2012
Сообщений: 3
12.01.2014, 17:48  [ТС] 4
Спасибо кто ответил, но решил я это в тот же вечер, просто надо было поставить точки перед некоторыми знаками деления, чтоб матрицы делились нормально и не получалась деление на ноль.

ps тему можно закрыть
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.01.2014, 17:48
Помогаю со студенческими работами здесь

Решение СЛАУ методом Зейделя (Гаусса-Зейделя) с заданной матрицей
ребята, помогите написать на си, решение слау методом Зейделя(Гаусса-Зейделя) с заданной матрицей

Составить алгоритм определения и вычислить минимум функции методом Гауса-Зейделя.
листаю методичку и пособие каторые выдал препод не могу разобраться подскажите кто чем может...

программа Гаусса-Зейделя
Помогите пожалуйста найти ошибку, до сдачи курсача 2 дня осталось /*Гауса-Зейделя*/ #include...

Метод Зейделя-Гаусса С++
Для написания программы, решающей систему линейных уравнения методом итерации или Зейделя,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru