Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Microsoft .NET

  Все выпуски  

RFpro.ru: Microsoft .NET


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Асмик Гаряка
Статус: Советник
Рейтинг: 10992
∙ повысить рейтинг »
Micren
Статус: Профессор
Рейтинг: 1764
∙ повысить рейтинг »
Александр Чекменёв
Статус: Профессор
Рейтинг: 1333
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Microsoft .NET : C#

Номер выпуска:243
Дата выхода:02.04.2013, 01:00
Администратор рассылки:Alexey G. Gladenyuk (Управляющий)
Подписчиков / экспертов:57 / 27
Вопросов / ответов:1 / 1

Консультация # 187234: Здравствуйте! У меня возникли сложности с таким вопросом: для реализация метода поиска минимума функции нескольких переменных с использованием метода градиентного спуска помогите организовать функцию расчета градиента (g[]) в точке х. x представлен массивом из 4 значений x1..x4, функция F(x1..x4) = (x1+7)^2 + 2*(x2-7)^2 + 3*(x3+7)^2 + ...


Консультация # 187234:

Здравствуйте! У меня возникли сложности с таким вопросом: для реализация метода поиска минимума
функции нескольких переменных с использованием метода градиентного спуска помогите организовать функцию расчета градиента (g[]) в точке х.
x представлен массивом из 4 значений x1..x4,
функция F(x1..x4) = (x1+7)^2 + 2*(x2-7)^2 + 3*(x3+7)^2 + 4*(x4-7)^2.

полагаю это осуществляется как-то так:

double dFpodX(double x1, double x2, int perem)
{
if (perem == 1)
return {...};
else
return {...};
}

но что-то не преуспел

Дата отправки: 30.03.2013, 00:37
Вопрос задал: lexmod (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Evgenijm (10-й класс):

Здравствуйте, lexmod!

Градиент - это вектор из частных производных по каждой из переменных. Для вычисления частных производных нам нужна только функция и приращения. Делать отдельные методы для каждой производной не стоит. Сам градиент можно сделать примерно так:

Код :
double[] Gradient(double[] x, double[] dx)
        {
            double F = F(x);
            double[] Par = (double[])x.Clone();
            double[] G = new double[x.Length];
            for (int i = 0; i < x.Length; i++)
            {
                Par[i] += dx[i];
                G[i] = (F(Par) - F) / dx[i];
                Par[i] = x[i];
            }
            return G;
        }



В новом массиве параметров по очереди меняем координату на x+dx и вычисляем производную. Вообще, dx обычно одинакова для всех. Делают просто константу вроде dx = 0.000001. Она должна быть очень маленькой по сравнению со значениями функции, но при этом достаточно большой, чтобы при расчетах не исчезать в 0.

Для полинома как в задании можно еще и по скорости оптимизировать (для каждой производной здесь меняется лишь один элемент полинома), но это будет уже не универсальный метод.

Консультировал: Evgenijm (10-й класс)
Дата отправки: 01.04.2013, 07:03

5
нет комментария
-----
Дата оценки: 01.04.2013, 16:31

Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное