首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >F#:导数函数

F#:导数函数
EN

Stack Overflow用户
提问于 2016-02-12 02:17:33
回答 1查看 687关注 0票数 1

我想弄清楚如何让这个函数正常工作。我对F#很无能,所以很感谢你的解释,

代码语言:javascript
复制
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)吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-12 02:57:33

我不会试图解决你的问题,而是从根本上解释它。

符号导数是接受一个函数并返回一个新函数的函数。但是,您正在试图计算返回给定函数、值和增量的值的数值导数

首先,我们将函数命名为:deriv,它需要三个参数:

  1. 接受浮点数并返回浮点数的函数:(f : float -> float)
  2. 要计算导数的值:(x0 : float)
  3. A三角洲:(dx : float)

示例中有三个参数中的两个,但是缺少了x0

它还应该返回一个浮动。

所以签名是

代码语言:javascript
复制
deriv (f : (float -> float)) (x0 : float) (dx : float) : float

现在计算数字导数。我不会解释这个,只是参考导数

在这个例子中,我们将使用一个带有导数的简单函数,x^2

以下是F#中的代码

代码语言:javascript
复制
// 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

一次快速测试表明它是正确的。

代码语言:javascript
复制
// val it : float = 2.0
deriv f 1.0 0.000005

对一系列值进行更彻底的测试。

使用Visual StudioNuGet安装FSharp.Charting

在F#交互中

代码语言:javascript
复制
#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:x^2进行确认。

一个简单的例子:

代码语言:javascript
复制
// 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:d/dx x^2进行确认。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35353713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档