Я согласен с Коллином в том, что это огромная тема и что, вероятно, нет идеального решения. Однако для тех, кто согласен с эффективным, но несовершенным решением, ответ Вакавамы приятно прост. Если вы хотите использовать свою производную функцию с более математическим синтаксисом, вы можете определить оператор, к счастью, Swift делает это исключительно легко. Вот что я сделал:
Сначала я определил оператор для простого возврата функциональной версии производной. Мне лично нравится символ ➚ для производных, но очень большая часть существующих символов Unicode является допустимыми идентификаторами Swift.
postfix operator ➚ {}
postfix func ➚(f: Double -> Double) -> (Double -> Double) {
let h = 0.00000000001
func de(input: Double) -> Double {
return (f(input + h) - f(input)) / h
}
return de
}
Далее давайте определим функцию, которую мы хотим дифференцировать:
func f(x: Double) -> Double {
return x*x + 2*x + 3
}
Это можно использовать как таковое: f➚
, которое вернет анонимную функцию, которая будет производной от f. Если вы хотите получить f в определенной точке (например, пусть x = 2), вы можете вызвать ее следующим образом: (f➚)(2)
Я решил, что мне нравятся операторы, поэтому я сделал еще один, чтобы этот синтаксис выглядел немного лучше:
infix operator ➚ { associativity left precedence 140 }
func ➚(left: Double -> Double, right: Double) -> Double {
return (f➚)(right)
}
Выражение f➚2
теперь будет возвращать то же самое, что и (f➚)(2)
, просто его удобнее использовать, когда вы занимаетесь математикой.
Хороший вопрос, хорошие ответы всем, я просто подумал, что добавлю что-то дополнительное. Дайте знать, если у вас появятся вопросы!
person
PyPiePi
schedule
25.02.2016
h
? Последнее тривиально. Первое нетривиально. - person Rob   schedule 24.06.2015