F#:微分函数
F#: Derivative Function
我正在想办法让这个功能发挥作用。我对 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)
错了吗?
我不会尝试解决您的问题,而是从头开始解释。
符号导数是一个接受一个函数和return一个新函数的函数。但是,您正在尝试计算 numeric derivative return 给定函数、值和增量的值。
首先我们给函数起个名字:deriv
它需要三个参数:
1. 接受一个浮点数和 returns 一个浮点数的函数:(f : float -> float)
2.求导数的一个值:(x0 : float)
3. 增量:(dx : float)
您的示例中有三个参数中的两个,但缺少 x0
。
它还应该 return 一个浮点数。
所以签名是
deriv (f : (float -> float)) (x0 : float) (dx : float) : float
现在计算数值导数。
这个我就不解释了,参考一下derivative
对于这个例子,我们将使用一个具有导数的简单函数,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 and NuGet install 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
我正在想办法让这个功能发挥作用。我对 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)
错了吗?
我不会尝试解决您的问题,而是从头开始解释。
符号导数是一个接受一个函数和return一个新函数的函数。但是,您正在尝试计算 numeric derivative return 给定函数、值和增量的值。
首先我们给函数起个名字:deriv
它需要三个参数:
1. 接受一个浮点数和 returns 一个浮点数的函数:(f : float -> float)
2.求导数的一个值:(x0 : float)
3. 增量:(dx : float)
您的示例中有三个参数中的两个,但缺少 x0
。
它还应该 return 一个浮点数。
所以签名是
deriv (f : (float -> float)) (x0 : float) (dx : float) : float
现在计算数值导数。 这个我就不解释了,参考一下derivative
对于这个例子,我们将使用一个具有导数的简单函数,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 and NuGet install 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