У меня проблема с тем, чтобы автоматическое дифференцирование работало между C # и F #.
В C # у меня есть функция, которая принимает double и возвращает double, скажем:
private double Price(double yield)
{
double price;
price = 0;
for (int index = 1; index <= _maturity * _frequency; index++)
{
price += (_coupon / _frequency) * _nominal / Math.Pow(1 + (yield / _frequency), index);
}
price += _nominal / Math.Pow(1 + (yield / _frequency), _maturity * _frequency);
return price;
}
Я выбрал эту функцию специально, так как Math.pow очень запретный и допускает только двойные или целые числа для своих параметров.
Я бы хотел дифференцировать эту функцию с помощью автоматического дифференцирования.Я написал метод для этого на F #:
type Diff(d : double, df : Lazy<Diff>) = class
member x.d = d
member x.df = df
static member (+) (x : Diff, y : Diff) =
Diff(x.d + y.d, lazy (x.df.Value + y.df.Value))
static member (-) (x : Diff, y : Diff) =
Diff(x.d - y.d, lazy (x.df.Value - y.df.Value))
static member (*) (x : Diff, a : double) =
Diff(x.d * a, lazy (x.df.Value * a))
static member (*) (x : Diff, y : Diff) =
Diff(x.d * y.d, lazy ((x.df.Value * y) + (y.df.Value * x)))
override x.ToString() =
x.d.ToString()
end
let rec dZero = Diff(0.0, lazy dZero)
let dConst x = Diff(x, lazy dZero)
let dId x = Diff(x, lazy dConst 1.0)
let Differentiate (x:Diff) = x.df.Value
// Example function
let f (x:Diff) = x*x*x;
// Example usage:
// (f (dId 5)).ToString = "125"
// (Differentiate (f (dId 5))).ToString = "75"
// (Differentiate (Differentate (f (dId 5)))).ToString = "30"
К сожалению, мне нужно передать тип Diff в мою функцию Price (..), чтобы создать тип Diff, который затем подается в мой diffrente (..) функция для возврата другого типа Diff.
Моя функция C #, однако, работает исключительно для двойников (и я бы хотел, чтобы она оставалась такой, как она используется в других местах в моей программе C #).
Единственный способ решить эту проблему - написать каждую функцию дважды, что, очевидно, ужасно:
1) С таким же успехом я могу просто написать дифференцированную версию каждый раз 2) Это не 't очень расширяемая модель
Так есть ли способ, которым я могу обойти это, или, возможно, привести мои двойные функции в функции Diff (предпочтительно в F #).В идеале я просто хотел бы добавить (double -> double) функцию и получить Diff.ToString ().
Извините, если это совершенно неопределенно или невозможно понять.Я отвечу на любые вопросы в комментариях, если это неясно.
Я надеюсь, что есть решение для этого!Заранее спасибо,
Эшли