В программировании один из заветов — не дублировать функциональность. Иначе мы получаем код, в котором одни участки нетривиально зависят от других. При реализации части задач этому принципу легко следовать, но в других возникают проблемы: рассмотрим софт, который использует не очень хитрые математические алгоритмы, требующие работы с функциями и их производными. 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 (Маестро Стандарт) по цене ниже розничной. Предоставляем хорошую скидку при оптовой закупке, возможна доставка товара . Так же предлагаем Вам полный спектр канцелярских принадлежностей (большой ассортимент бумаги различного формата и плотности, письменные принадлежности, файлы, папки и прочее).
Приходите, берите с собой детишек - ведь они точно знают что им нужно для школы. Дневники в мягкой обложке для младших классов - однозначно порадуют малышей. Запасайтесь канцтоварами с лета. Будем рады вас видеть. |