F#: производная функция

Я пытаюсь понять, как заставить эту функцию работать. Я очень плохо разбираюсь в F#, поэтому пояснения приветствуются,

let deriv (f:(float->float), dx: float) = 
    fun f:(float -> float) * dx:float -> x:float -> float
let (f, dx, x) = ((f(x + dx) - f(x))/dx)

Я неправильно использую f:(float->float)?


person Jsc    schedule 12.02.2016    source источник
comment
Какую проблему вы испытываете?   -  person Fyodor Soikin    schedule 12.02.2016


Ответы (1)


Вместо того, чтобы пытаться исправить ваши проблемы, я объясню это с нуля.

Символическая производная — это функция, которая принимает функцию и возвращает новую функцию. Однако вы пытаетесь вычислить числовую производную, которая возвращает значение с заданной функцией, значение, и дельта.

Сначала мы дадим функции имя: deriv, и ей нужны три параметра:
1. Функция, которая принимает число с плавающей запятой и возвращает число с плавающей запятой: (f : float -> float)
2. Значение производной, которое должно быть оценено: (x0 : float)
3. Дельта: (dx : float)

У вас было два из трех параметров в вашем примере, но отсутствовал x0.

Он также должен возвращать число с плавающей запятой.

Итак, подпись

deriv (f : (float -> float)) (x0 : float) (dx : float) : float

Теперь вычисляем числовую производную. Я не буду объяснять это, просто дам ссылку на производный

В этом примере мы будем использовать простую функцию с производной x^2.

Вот код на F#

// val deriv : f:(float -> float) -> x0:float -> dx:float -> float
let deriv (f : (float -> float)) (x0 : float) (dx : float) : float =
    let (x1 : float) = x0 - dx
    let (x2 : float) = x0 + dx
    let (y1 : float) = f x1
    let (y2 : float) = f x2
    let (result : float) = (y2 - y1) / (x2 - x1)
    result

// val f : x:float -> float
let f x = x**2.0

и быстрый тест показывает, что он работает правильно.

// val it : float = 2.0
deriv f 1.0 0.000005

Для более тщательной проверки диапазона значений.

Использование Visual Studio и NuGet установить FSharp.Charting

В интерактивном F#

#I "..\packages"
#load "FSharp.Charting.0.90.13\FSharp.Charting.fsx"
open FSharp.Charting

let xs1 = [ for x in (double)(-3.10) .. 0.05 .. 3.10 do yield x]
let ys1 = xs1 |> List.map f
let values1 = List.zip xs1 ys1
Chart.Line(values1)
    .WithXAxis(Min=(-4.0), Max=4.0, MajorTickMark = ChartTypes.TickMark(Interval=2.0, IntervalOffset = 1.0, LineWidth = 2))
    .WithYAxis(Min=(0.0), Max=10.0, MajorTickMark = ChartTypes.TickMark(Interval=2.0, IntervalOffset = 1.0, LineWidth = 2))

введите здесь описание изображения

что также можно подтвердить с помощью Wolfram Alpha: x^2

Более простой пример:

// val d : x:float -> float
let d x = deriv f x 0.00000005

let xs2 = [ for x in (double)(-3.10) .. 0.05 .. 3.10 do yield x]
let ys2 = xs2 |> List.map d
let values2 = List.zip xs2 ys2
Chart.Line(values2)
    .WithXAxis(Min=(-4.0), Max=4.0, MajorTickMark = ChartTypes.TickMark(Interval=2.0, IntervalOffset = 1.0, LineWidth = 2))
    .WithYAxis(Min=(-6.0), Max=6.0, MajorTickMark = ChartTypes.TickMark(Interval=2.0, IntervalOffset = 1.0, LineWidth = 2))

введите здесь описание изображения

что также можно подтвердить с помощью Wolfram Alpha: d/dx x^2

person Guy Coder    schedule 12.02.2016