Четверг, 21.11.2024,
Приветствую Вас Гость

IP

WeekEnd

Главная » 2009 » Июнь » 30 » Автоматическое дифференцирование
Автоматическое дифференцирование
00:16
В программировании один из заветов — не дублировать функциональность. Иначе мы получаем код, в котором одни участки нетривиально зависят от других. При реализации части задач этому принципу легко следовать, но в других возникают проблемы: рассмотрим софт, который использует не очень хитрые математические алгоритмы, требующие работы с функциями и их производными. 
f(a : double) : double
{
 a*a + 3 * a
}

df(a : double) : double
{
 2*a + 3
}

Очевидно, что, как минимум, код f и df функционально зависим, а, возможно, мы наблюдаем дублирование функциональности. Ситуацию можно исправить, если вспомнить определение производной и, соответственно, исправить код df:

df(a : double) : double
{
 def delta = 0.1;
 (f(a+delta)-f(a))/delta
}

В данном случае, мы избавились от дублирования функциональности, но расплатились точностью работы программы, так как оптимального значения параметра delta не существует. 

Серьезные инженеры могут решать эту проблему, программируя, например, в matlab и дальнейшей кодогенерацией в любимый язык программирования. Но есть мнение, что кодогенерация — зло, поэтому я расскажу о другом методе.

Мнимая единица i полагается решением уравнения x2+1 = 0. По-аналогии введем другую мнимую единицу d, которая будет решать уравнение x2=0 и при этом не равняться нулю. Затем вспомним разложение функции в ряд Тейлора:


Если в качестве h подставить нашу мнимую единицу и воспользоваться тем, что d2=0, то получим:

Таким образом, что бы узнать значение производной функции f в точке x достаточно взять коэффициент при мнимой части числа f(x+d). В современных языках не проблема определить класс, для работы с комплексными числами, так же легко можно определить класс для работы с этими расширенными числами. Ниже переведен пример на Nemerle:
 public class Dual
 {
  public this(real : double, imaginary : double)
  {
  this.real = real;
  this.imaginary = imaginary;
  }
  
  real : double;
  imaginary : double;
  
  public Real : double { get { real } }
  public Imaginary : double { get { imaginary } }
  
  public static @+(a : Dual, b : Dual) : Dual
  {
  Dual(a.real + b.real, a.imaginary + b.imaginary)
  }
  
  public static @-(a : Dual, b : Dual) : Dual
  {
  Dual(a.real - b.real, a.imaginary - b.imaginary)
  }
  
  public static @*(a : Dual, b : Dual) : Dual
  {
  Dual(a.real * b.real, a.real * b.imaginary + a.imaginary * b.real)
  }
  
  public static @/(a : Dual, b : Dual) : Dual
  {
  a*Dual(1/b.real, - b.imaginary / (b.real*b.real))
  }
  
  public static @:(k : double) : Dual
  {
  Dual(k,0)
  }
 }


Теперь можно переписать пример из начала статьи:
f(a : Dual) : Dual
{
 a*a + 3.0 * a
}
  
f(a : double) : double
{
 f(Dual(a,0)).Real
}
  
df(a : double) : double
{
 f(Dual(a,1)).Imaginary
}


Очевидно, что код для производной мы получаем бесплатно. Минусом данного подхода является то, что необходимо переопределить элементарные функции для работы с dual-числами, но благодаря полученной формуле это не сложно, ниже приведена перегрузка синуса:
public Sin(a : Dual) : Dual
{
 Dual(Math.Sin(a.Real), Math.Cos(a.Real)*a.Imaginary)
}


.

.

.

.

.

.

Наша специализация  — поставка качественных канцелярских товаров — от школьных принадлежностей до эксклюзивных бизнес-сувениров, а также бумажной продукции — от форматной белой и цветной бумаги до специализированной бумаги для принтеров, плоттеров, банкоматов, кассовых аппаратов., компьютерные акцессуары, калькуляторы. Среди наших товаров можно найти как простую ручку за 1 рубль, так и коллекционное и подарочные сувениры.

Мы предлагаем канцтовары — как российских, так и азиатских, европейских и американских производителей. В нашем ассортименте есть бумага российских и европейских фабрик. Обязательное условие для всех предлагаемых нами товаров — их качество.

Самый большой ассортимент сертифицированных товаров для офиса (более 12 000 наименований), приемлемые цены, квалифицированные сотрудники, служба бесплатной доставки и сервисная служба позволяют решать задачи любой сложности по обеспечению нормального функционирования офиса, подразделений и служб любого крупного предприятия или учреждения.

В современном ритме офисы не смогут обходится без вещей которые так нам необходимы каждый день, которые мы привыкли пользоваться и которые помогают нам эфективно работать! Стойки для каталогов, прайслистов.

Наше преимущество заключается в том что мы предлагаем канцтовары и полиграфию - все из одних рук!Профессионализм и широкая бонусная программа- наши критерии работы, доставка в офис бесплатная!

Офисная бумага Maestro Standart (Маестро Стандарт) по цене ниже розничной. Предоставляем хорошую скидку при оптовой закупке, возможна доставка товара . Так же предлагаем Вам полный спектр канцелярских принадлежностей (большой ассортимент бумаги различного формата и плотности, письменные принадлежности, файлы, папки и прочее). 

Приходите, берите с собой детишек - ведь они точно знают что им нужно для школы. Дневники в мягкой обложке для младших классов - однозначно порадуют малышей. Запасайтесь канцтоварами с лета. Будем рады вас видеть.

Категория: Другое | Просмотров: 927 | Добавил: chubaka | Рейтинг: 0.0/0 |
Всего комментариев: 1
1 Lucy  
0
Kick the tires and light the fires, prlobem officially solved!

Имя *:
Email *:
Код *:
Форма входа
Категории раздела
Авто, мото, вело, авиа...
Спортивные фотографии и приколы
Взгляд в прошлое СССР
Природные катастрофы
Кадр дня
Анекдоты, истории, афоризмы
Присланное посетителями
Аварии и страшные фото ДТП
Фото приколы с юмором
Игры
Кино, Музыка, ТВ
Работа, Карьера
Звездная жизнь
Строительство и Ремонт
Бизнес, Финансы
Законодательство
Новости СПОРТА
Другое
Дизайн
Железо
Новости и СМИ
Политика
Путешествия, Отдых
Технологии
Технологии
Архитетура
Архитектура
Медиа
Медиа
Поиск
Календарь
«  Июнь 2009  »
ПнВтСрЧтПтСбВс
1234567
891011121314
15161718192021
22232425262728
2930
Архив записей
Наш опрос
Оцените мой сайт
Всего ответов: 28
Друзья сайта
  • Программы для всех
  • ukurok.at.ua
  • Статистика
    online dating services
    Besucherzahler
    счетчик для сайта

    Онлайн всего: 7
    Гостей: 7
    Пользователей: 0

    Ценящим наш труд

    Если у Вас на кошельке завалялась лишняя копеечка,поддержите монеткой сайт. От Вас не убудет,а мы, сложив монетки, сделаем проект WeekEnd еще лучше...

    Z 288502230873

    Z 883486288952

    R 133201635402

    U 275524832835